4. 升级前 Ingress 健康检查清单:Pod 状态、Service 端点、TLS 证书有效性、后端服务可达性
在集群升级前,对 Ingress 控制器及其依赖链路进行全面的健康检查是避免升级过程中断流量的关键步骤。本清单从四个核心维度出发,确保 Ingress 控制器在升级前处于可恢复、可验证的健康状态。
4.1 检查清单总览
以下表格汇总了升级前必须验证的四个检查项及其关键指标:
| 检查维度 | 核心检查项 | 关键指标 / 命令 | 预期状态 |
|---|---|---|---|
| Pod 状态 | 控制器 Pod 运行状态、重启次数、就绪探针 | kubectl get pods -n ingress-nginx |
Running, Ready 1/1, 重启 < 3 |
| Service 端点 | Service 后端 Endpoints 是否正常关联 | kubectl get endpoints -n ingress-nginx |
Endpoints 列表非空,地址与 Pod IP 一致 |
| TLS 证书有效性 | 证书过期时间、域名匹配、Secret 完整性 | openssl x509 -in tls.crt -text -noout |
未过期,域名匹配,证书链完整 |
| 后端服务可达性 | Ingress 规则中的后端 Service 能否正常响应 | curl -I https://example.com |
HTTP 200/301,响应时间 < 2s |
4.2 Pod 状态检查
Ingress 控制器 Pod 的健康状态是流量调度的基础。升级前应重点检查以下指标:
- Pod 运行状态:确保所有控制器 Pod 处于
Running状态,且READY列为1/1。 - 重启次数:检查
RESTARTS列,频繁重启(如超过 3 次)可能表明存在内存泄漏或配置错误。 - 就绪探针:确认
readinessProbe配置正确,且最近探测未失败。
# 检查 Ingress 控制器 Pod 状态
kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
# 查看 Pod 详细事件
kubectl describe pod <pod-name> -n ingress-nginx | grep -A 10 Events
检查要点:如果 Pod 处于
CrashLoopBackOff 或 Pending 状态,请先排查资源限制、镜像拉取策略或配置映射问题,再进行升级。
4.3 Service 端点检查
Service 的 Endpoints 必须正确指向健康的 Pod IP。如果 Endpoints 为空,流量将无法到达控制器。
# 检查 Service 对应的 Endpoints
kubectl get endpoints -n ingress-nginx
# 验证 Endpoints 中的 IP 是否与 Pod IP 匹配
kubectl get pods -n ingress-nginx -o wide
常见问题包括:
- Selector 不匹配:Service 的
selector标签与 Pod 标签不一致。 - Pod 未就绪:即使 Pod 运行,若
readinessProbe失败,Pod 也不会被加入 Endpoints。 - 命名空间错误:Service 与 Pod 不在同一命名空间。
4.4 TLS 证书有效性检查
TLS 证书失效是升级后最常见的流量中断原因之一。升级前必须验证证书的完整性和有效性。
# 从 Secret 中提取证书并检查有效期
kubectl get secret <tls-secret-name> -n <namespace> -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text -noout | grep -E "Not Before|Not After|Subject"
# 检查证书链是否完整
kubectl get secret <tls-secret-name> -n <namespace> -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt
注意:如果使用 Let's Encrypt 等自动续签证书,请确认 cert-manager 或类似工具在升级前已完成最近一次续签,且 Secret 中的证书内容已更新。
4.5 后端服务可达性检查
最终验证环节:通过 Ingress 控制器访问实际后端服务,确认端到端链路正常。
# 通过 Ingress 控制器 IP 或域名发起请求
curl -I -k https://your-domain.com/path
# 检查响应状态码和响应头
curl -s -o /dev/null -w "%{http_code}" https://your-domain.com/path
# 检查后端响应时间
curl -s -o /dev/null -w "Connect: %{time_connect}s, TTFB: %{time_starttransfer}s, Total: %{time_total}s\n" https://your-domain.com/path
预期结果:
- HTTP 状态码为
200、301或302(取决于路由规则)。 - 响应时间(TTFB)小于 2 秒。
- 响应头中包含
X-Forwarded-For等代理信息。
4.6 健康检查流程图
以下 SVG 图展示了升级前 Ingress 健康检查的完整流程,从 Pod 状态到后端可达性验证:
4.7 常见问题与避坑指南
案例 1:Pod 重启导致端点漂移
某集群升级前检查发现 Ingress 控制器 Pod 重启 5 次,但 Endpoints 仍显示旧 IP。原因是
某集群升级前检查发现 Ingress 控制器 Pod 重启 5 次,但 Endpoints 仍显示旧 IP。原因是
readinessProbe 延迟设置过短,导致 Pod 在启动过程中被过早标记为就绪。解决方案:调整 initialDelaySeconds 至 30 秒以上。
案例 2:TLS 证书链不完整
使用自签名证书时,未将中间证书包含在 Secret 的
使用自签名证书时,未将中间证书包含在 Secret 的
tls.crt 中,导致升级后客户端报错 certificate signed by unknown authority。升级前应使用 openssl verify 验证完整链。
案例 3:后端 Service 端口变更未同步
后端应用升级后端口从 8080 改为 9090,但 Ingress 规则中的
后端应用升级后端口从 8080 改为 9090,但 Ingress 规则中的
service.port 未更新。升级前应通过 kubectl describe ingress 确认后端端口与 Service 定义一致。