Kubernetes Pod启动正常但访问时出现Nginx 502 Bad Gateway错误求助
Kubernetes Ingress返回502 Bad Gateway问题排查与解决
已知信息
- Pod已正常启动,但访问
site.myname.com时显示nginx的502错误 - 已执行排查:核对Dockerfile端口、Pod标签,调整端口/命名空间配置,对比可用YAML文件
针对性排查步骤
1. 验证Service与Pod的连通性
先确认Service到Pod的链路是否正常:
- 启动测试Pod并访问Service端口:
kubectl run -it --rm --image=busybox:1.36 test-pod -n my-name wget -O- http://my-name:5000
- 若访问失败,检查容器端口监听状态:
kubectl exec -it <pod-name> -n my-name -- netstat -tulpn
确认5000端口处于LISTEN状态
- 核对Service selector与Pod标签是否完全匹配:
kubectl get service my-name -n my-name -o jsonpath='{.spec.selector}' kubectl get pod -n my-name -o jsonpath='{.items[0].metadata.labels}'
确保app: my-name标签无大小写、空格等差异
2. 查看Ingress Controller日志
获取nginx-ingress控制器的错误详情:
kubectl logs -n kube-system -l app=nginx-ingress -c nginx-ingress-controller
重点关注与site.myname.com、my-name Service相关的错误,常见原因包括后端无可用端点、连接被拒绝、TLS配置异常等
3. 检查Endpoints状态
确认Service已关联到正常的Pod端点:
kubectl get endpoints my-name -n my-name
- 若
ADDRESSES为空:说明Service selector未匹配到Pod,回到步骤1核对标签 - 若有地址但仍无法访问:检查Pod网络策略、节点防火墙是否限制了端口访问
4. 验证应用监听地址
环境变量SOMEURLS配置为http://*:5000;http://*:5105,部分应用可能实际仅监听回环接口,需验证:
# 容器内访问localhost kubectl exec -it <pod-name> -n my-name -- curl http://localhost:5000 # 用Pod IP访问 kubectl exec -it <pod-name> -n my-name -- curl http://<pod-ip>:5000
若localhost可访问但Pod IP不行,说明应用需修改为监听0.0.0.0而非127.0.0.1
5. 核对TLS证书配置
当前YAML存在明显配置冲突:
- Certificate的
dnsNames为"my-name",但Ingress TLS的hosts是"site.myname.com",域名不匹配会导致cert-manager无法签发有效证书,进而引发Ingress转发异常
修改后的Certificate配置示例:
# LetsEncrypt certificate apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: my-name namespace: my-name # 需与Ingress同命名空间 labels: env: "Test" spec: secretName: my-name dnsNames: - "site.myname.com" # 与Ingress域名保持一致 issuerRef: name: letsencrypt-prod kind: ClusterIssuer
验证证书状态:
kubectl get certificate my-name -n my-name
确保状态为Ready
额外优化点
- 当前PodDisruptionBudget未指定namespace,默认创建在
default空间,无法匹配my-name空间的Pod,可添加namespace: my-name或删除该冗余配置
内容的提问来源于stack exchange,提问作者Mitar
相关产品推荐
相关产品推荐

