EKS环境Nginx Ingress访问chatbot服务返回502错误问题咨询
故障说明
EKS集群搭配Nginx Ingress Controller部署业务时,develop命名空间下的chatbot服务通过Ingress暴露后持续返回502状态码,直接验证服务本身运行正常,Ingress侧报错日志为connect() failed (111: Connection refused) while connecting to upstream,对应后端地址为chatbot Pod的7070端口。
涉及的资源配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: namespace: develop name: chatbot-ingress annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - http: paths: - backend: service: name: chatbot port: number: 7070 pathType: Prefix path: / host: api.example.com --- apiVersion: v1 kind: Service metadata: name: chatbot namespace: develop spec: selector: app: chatbot ports: - port: 7070 targetPort: 7070 --- apiVersion: apps/v1 kind: Deployment metadata: name: chatbot namespace: develop spec: selector: matchLabels: app: chatbot template: metadata: labels: app: chatbot spec: containers: - name: chatbot image: chatbot imagePullPolicy: Always envFrom: - secretRef: name: chatbot-secret ports: - containerPort: 7070
根因判断
从日志可以确认Nginx Ingress已经正确识别Ingress规则、成功从Service关联到后端Pod IP,不存在路由配置错误、Service找不到后端的问题,111 Connection refused代表TCP请求已经到达Pod所在网络栈,但目标端口没有正常接收连接,90%以上的概率是以下原因导致:
- chatbot应用默认绑定了
127.0.0.1本地回环地址,没有绑定0.0.0.0,导致只有Pod内部本地访问能连通,跨网络命名空间的Ingress流量访问7070端口时会被直接拒绝,这也是“本地测服务正常但Ingress访问不通”的最高频诱因。 - 应用实际监听端口和配置声明的7070不一致,比如启动时被环境变量、配置文件覆盖为其他端口,导致7070端口无进程监听。
- 未配置就绪探针,应用还未完成启动、端口还没开始监听时,Pod就已经被加入Service后端端点列表,Ingress提前转发流量导致连接拒绝。
排查与修复步骤
按以下顺序操作即可定位并解决问题:
- 确认Service端点匹配正常
执行命令查看Service关联的后端地址,确认和实际运行的chatbot Pod IP一致:kubectl get endpoints chatbot -n develop
如果返回的端点列表为空,检查Service的selector.app值和Pod的label是否完全一致,修正拼写、空格类的匹配错误。 - 验证Pod端口跨命名空间连通性
启动临时调试Pod,从集群网络内部直接访问chatbot Pod的7070端口,绕开Ingress和Service验证连通性:kubectl run -it --rm debug --image=curlimages/curl --restart=Never -- curl http://<替换为上一步查到的chatbot Pod IP>:7070
如果这里同样返回连接拒绝,直接进入chatbot容器排查端口监听状态:kubectl exec -it <chatbot Pod名称> -n develop -- ss -tulnp
- 如果返回结果中7070端口的监听地址为
127.0.0.1:7070,修改chatbot应用的启动参数/配置文件,将监听地址改为0.0.0.0:7070,重新构建镜像发布即可。 - 如果返回结果中没有7070端口的监听记录,检查应用启动日志,确认实际监听端口,将Deployment的containerPort、Service的targetPort、Ingress的service port三个配置统一为应用实际监听的端口。
- 补充就绪探针避免启动阶段异常
在Deployment的容器配置段增加TCP就绪探针,确保只有应用端口正常监听后才会接收流量:
readinessProbe: tcpSocket: port: 7070 initialDelaySeconds: 5 periodSeconds: 10
验证方式
等Pod滚动重启完成后,先通过临时调试Pod访问Pod IP+端口确认连通正常,再通过api.example.com域名访问服务,502错误即可消除。
内容的提问来源于stack exchange,提问作者Vivid
相关产品推荐
相关产品推荐

