Kubernetes 1.23.x升级至1.24.x时Nginx Ingress出现502错误的兼容配置求助
我之前升级K8s版本时也踩过这个坑,确实1.24版本对Ingress Controller的健康探测逻辑做了调整,尤其是Azure环境下必须把探测路径改成/healthz才会正常,但这样又会和1.23版本不兼容,导致升级过程中Ingress掉链子。你提到的TCP探测方案确实是个靠谱的兼容思路,我来给你详细说说怎么配置和验证:
一、修改Ingress Controller的探测配置为TCP类型
不管你是用原生YAML还是Helm部署的Ingress Controller,核心都是把原来的HTTP探测换成TCP端口探测——因为TCP探测只检查端口是否处于监听状态,不依赖具体的HTTP路径,完美避开两个版本的路径差异问题。
1. 原生YAML部署的情况
找到你的Ingress Controller的Deployment或StatefulSet配置文件,把livenessProbe和readinessProbe部分改成下面这样:
livenessProbe: tcpSocket: port: 10254 # Nginx Ingress默认的健康检查端口,别改除非你自定义过 initialDelaySeconds: 10 periodSeconds: 10 readinessProbe: tcpSocket: port: 10254 initialDelaySeconds: 10 periodSeconds: 10
修改后执行kubectl apply -f <你的配置文件路径>,K8s会自动滚动更新Ingress Pod,不会一次性重启所有实例,能有效避免 downtime。
2. Helm部署的情况
如果是用官方Helm chart部署的,修改你的values.yaml文件里的探测配置:
controller: livenessProbe: enabled: true type: TCP port: 10254 readinessProbe: enabled: true type: TCP port: 10254
然后执行Helm更新命令:
helm upgrade ingress-nginx ingress-nginx/ingress-nginx -n ingress-nginx -f values.yaml
二、验证配置有效性
- 先检查Ingress Pod状态:
kubectl get pods -n ingress-nginx
确保所有Pod都处于Running状态,且READY列显示正常(比如1/1)。
2. 测试业务服务的可用性:用curl或者直接访问你的Ingress域名,确认没有502错误,服务能正常响应。
3. 可以先在测试环境把K8s版本从1.23升到1.24,全程观察Ingress的状态,确认没有出现服务中断的情况。
三、额外注意事项
- 确保你的Ingress Controller版本是兼容1.23和1.24的,比如官方的v1.3.x或v1.4.x版本,太老的版本可能不支持TCP探测或者和新K8s版本有其他兼容性问题。
- 如果你用的是AKS(Azure Kubernetes Service),负载均衡器的健康检查会自动适配TCP探测配置,不需要额外在Azure门户里调整。
这样配置后,不管是在1.23还是升级到1.24版本,Ingress Controller的健康探测都能正常工作,升级过程中就不会出现downtime了。
备注:内容来源于stack exchange,提问作者Peter Thomas

