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-network ConfigMap 中的 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 的 HTTPProxy CRD 版本为 v1。如果集群中残留了旧版 v1beta1 资源,会导致 Knative 网络控制器无法创建路由。
  • 域名解析:Contour 默认不处理外部域名。需要确保 knative-serving 的 ConfigMap config-domain 中配置了正确的域名后缀(如 example.com),否则 Knative Service 的 URL 将无法被解析。
验证命令:使用 kubectl get pods -n knative-serving 确认所有控制器 Pod 处于 Running 状态;使用 kubectl get gateway -n knative-serving 确认网关资源已创建且 ADDRESS 字段不为空。
Knative 网关流量路径与常见断点 Knative 网关流量路径与常见断点 外部客户端 Istio / Contour 网关 ⚠ 网关配置错误 Knative 网络控制器 ⚠ CRD 版本不匹配 Knative Service ⚠ 域名未配置 常见断点说明 1. 网关配置错误:Gateway 资源未创建、标签缺失、证书挂载路径错误。 2. CRD 版本不匹配:HTTPProxy 或 VirtualService 的 API 版本与 Knative 要求不一致。 3. 域名未配置:config-domain 中缺少域名后缀,导致 Service URL 无法解析。 4. 集群版本过低:Kubernetes API 版本不支持 Knative 所需的 CRD 特性。 5. 网络策略限制:Calico/Cilium 等 CNI 插件阻止了网关到 Pod 的流量。

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 验证步骤

  1. 检查 CRD 状态:执行 kubectl get crd | grep knative.dev,确认所有 CRD 的 ESTABLISHED 列为 True。
  2. 检查 API 服务:执行 kubectl get apiservice | grep knative,确保 AVAILABLE 列为 True。
  3. 检查控制器日志:执行 kubectl logs -n knative-serving deployment/controller,搜索 error 或 failed 关键字。
  4. 创建测试 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
Knative CRD 依赖关系与安装验证流程 Knative CRD 依赖关系与安装验证流程 Kubernetes API Server CRD 注册:services / configurations / revisions / routes / triggers Knative 控制器(controller / webhook) 验证步骤:kubectl get crd → kubectl get apiservice → kubectl logs → 部署测试 Service 说明:CRD 注册必须在控制器启动之前完成。如果 CRD 缺失,控制器将陷入 CrashLoopBackOff 状态。

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 部署的前置检查。