2. 环境准备与常见部署陷阱:Kubernetes 集群版本兼容性、Istio/Contour 网关配置、Knative 自定义资源安装验证
在开始 Knative Service 故障排查之前,必须确保底层环境符合 Knative 的运行要求。本章聚焦于三个最容易引发“部署后不可用”问题的环节:Kubernetes 集群版本兼容性、网关(Istio / Contour)配置以及Knative 自定义资源安装验证。跳过这些检查,后续的故障现象将难以定位。
2.1 Kubernetes 集群版本兼容性矩阵
Knative 对 Kubernetes 版本有严格的依赖。使用不兼容的版本会导致 API 资源无法注册、控制器崩溃或网络策略失效。下表列出了 Knative 1.12+ 与主流 Kubernetes 版本的兼容关系:
| Knative 版本 | Kubernetes 最低版本 | Kubernetes 推荐版本 | 备注 |
|---|---|---|---|
| 1.12.x | 1.26 | 1.27 – 1.29 | 支持 v1 和 v1beta2 资源 |
| 1.13.x | 1.27 | 1.28 – 1.30 | 移除 v1beta1 CRD 支持 |
| 1.14.x | 1.28 | 1.29 – 1.31 | 要求 Gateway API v1.0+ |
常见陷阱:使用
kubectl version --short 检查时,注意区分 Server Version 和 Client Version。Knative 只依赖 Server 端的 API 版本。如果集群版本低于最低要求,Knative 控制器将无法启动,并报 no matches for kind "CustomResourceDefinition" 错误。
2.2 网关层配置:Istio 与 Contour 的部署陷阱
Knative 依赖网关组件将外部流量路由到无服务器服务。Istio 和 Contour 是两种最常用的选择,但它们的配置细节经常导致流量无法到达 Pod。
2.2.1 Istio 网关配置要点
- 自动注入标签:Knative 所在的命名空间必须打上
istio-injection=enabled标签,否则 sidecar 不会自动注入。 - Gateway 资源定义:Knative 默认使用
knative-serving命名空间下的knative-ingress-gateway。如果自定义了 Gateway 名称,必须同步修改config-networkConfigMap 中的gateway.name字段。 - HTTPS 证书挂载:如果启用了 TLS,证书 Secret 必须存在于
istio-system或knative-serving命名空间,并且 Gateway 的tls字段要正确引用。
2.2.2 Contour 网关配置要点
- Envoy 服务类型:Contour 的 Envoy 服务默认是
LoadBalancer。在本地开发环境(如 Kind 或 Minikube)中,需要改为NodePort或使用kubectl port-forward才能访问。 - HTTPProxy CRD 版本:Knative 要求 Contour 的
HTTPProxyCRD 版本为v1。如果集群中残留了旧版v1beta1资源,会导致 Knative 网络控制器无法创建路由。 - 域名解析:Contour 默认不处理外部域名。需要确保
knative-serving的 ConfigMapconfig-domain中配置了正确的域名后缀(如example.com),否则 Knative Service 的 URL 将无法被解析。
验证命令:使用
kubectl get pods -n knative-serving 确认所有控制器 Pod 处于 Running 状态;使用 kubectl get gateway -n knative-serving 确认网关资源已创建且 ADDRESS 字段不为空。
2.3 Knative 自定义资源安装验证
安装 Knative 后,必须验证关键 CRD 是否已正确注册。缺失或版本错误的 CRD 会导致 ksvc、configuration、revision 等资源无法创建。
2.3.1 核心 CRD 清单
| CRD 名称 | API 组 | 作用 | 验证命令 |
|---|---|---|---|
| services.serving.knative.dev | serving.knative.dev | 定义无服务器服务 | kubectl get crd services.serving.knative.dev |
| configurations.serving.knative.dev | serving.knative.dev | 管理配置与代码版本 | kubectl get crd configurations.serving.knative.dev |
| revisions.serving.knative.dev | serving.knative.dev | 代表不可变的快照 | kubectl get crd revisions.serving.knative.dev |
| routes.serving.knative.dev | serving.knative.dev | 流量路由规则 | kubectl get crd routes.serving.knative.dev |
| triggers.eventing.knative.dev | eventing.knative.dev | 事件触发绑定 | kubectl get crd triggers.eventing.knative.dev |
2.3.2 验证步骤
- 检查 CRD 状态:执行
kubectl get crd | grep knative.dev,确认所有 CRD 的 ESTABLISHED 列为True。 - 检查 API 服务:执行
kubectl get apiservice | grep knative,确保 AVAILABLE 列为True。 - 检查控制器日志:执行
kubectl logs -n knative-serving deployment/controller,搜索error或failed关键字。 - 创建测试 Service:部署一个最小化的 Knative Service,观察是否进入 Ready 状态。
快速验证脚本:将以下内容保存为
check-knative.sh,用于一键检查环境健康度:#!/bin/bash
echo "=== CRD 状态 ==="
kubectl get crd | grep knative.dev | awk '{print $1, $2}'
echo "=== API 服务 ==="
kubectl get apiservice | grep knative | awk '{print $1, $4}'
echo "=== 控制器 Pod ==="
kubectl get pods -n knative-serving -o wide
echo "=== 网关 Pod ==="
kubectl get pods -n istio-system -o wide 2>/dev/null || kubectl get pods -n contour-system -o wide 2>/dev/null
2.4 常见部署陷阱速查表
| 陷阱类别 | 具体现象 | 根因 | 快速修复 |
|---|---|---|---|
| 版本不兼容 | 控制器 CrashLoopBackOff | Kubernetes 版本低于 Knative 要求 | 升级集群或降级 Knative 版本 |
| 网关标签缺失 | Pod 无 sidecar,流量不通 | 命名空间缺少 istio-injection=enabled |
kubectl label ns <ns> istio-injection=enabled |
| CRD 版本错误 | no matches for kind |
安装了旧版 CRD 或 API 组错误 | 重新安装 Knative CRD YAML |
| 域名未配置 | Service URL 无法访问 | config-domain 为空 |
编辑 ConfigMap 添加域名 |
| 网络策略限制 | 网关无法转发到 Pod | CNI 插件默认拒绝流量 | 创建允许 knative-serving 的 NetworkPolicy |
核心原则:环境准备阶段投入 30 分钟进行版本核对、网关检查和 CRD 验证,可以避免后续数小时的故障排查。建议将上述验证步骤写入 CI/CD 流水线,作为 Knative 部署的前置检查。