Kubernetes Ingress-Nginx 502错误:chat-srv-service无法接收API请求
一、优先解决connect() failed (111: Connection refused)核心问题
该错误说明Ingress尝试连接chat-srv-service对应Pod时被拒绝,即便Pod状态正常,也可能是以下原因导致:
容器端口与Service端口不匹配
检查Deployment中容器的containerPort是否和Service的targetPort完全一致(数值或端口名称都要匹配)。执行以下命令验证:kubectl get deployment chat-srv -o jsonpath='{.spec.template.spec.containers[0].ports}' kubectl get service chat-srv-service -o jsonpath='{.spec.ports[0].targetPort}'若不一致,修改Service或Deployment的端口配置使其对齐。
容器内服务仅监听localhost
很多应用默认绑定127.0.0.1,导致集群内其他组件无法访问。进入容器检查监听地址:kubectl exec -it <chat-srv-pod-name> -- netstat -tulpn确保服务监听
0.0.0.0:<端口>而非127.0.0.1:<端口>。若代码硬编码了localhost,需修改为0.0.0.0或移除绑定地址配置。NetworkPolicy限制访问
检查是否存在NetworkPolicy阻止Ingress控制器Pod访问chat-srv的Pod:kubectl get networkpolicy若有相关策略,需添加规则允许Ingress控制器所在命名空间(通常是
kube-system或自定义Ingress命名空间)访问chat-srv服务的端口。Service端点关联异常
即便你确认端点配置正常,仍需再次验证Service是否正确关联Ready状态的Pod:kubectl describe service chat-srv-service查看
Endpoints字段,应显示Pod的IP和端口且状态为Ready。若端点为空或异常,检查Pod的readinessProbe是否配置错误,导致Pod未被纳入服务端点。
二、处理SSL_do_handshake() failed错误
该错误多为连接拒绝的连带问题,但也可能存在独立诱因:
Ingress后端协议配置错误
若Ingress启用了TLS,但chat-srv服务仅支持HTTP,或Ingress注解backend-protocol与后端服务不匹配,会引发握手失败。修改Ingress资源的注解:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/backend-protocol: "HTTP" # 后端为HTTPS则改为"HTTPS"后端证书不被信任(若启用HTTPS)
若chat-srv使用自签名证书,Ingress控制器默认会拒绝未知CA签发的证书。测试环境可添加注解跳过验证:nginx.ingress.kubernetes.io/ssl-verify-client: "off" nginx.ingress.kubernetes.io/ssl-verify-depth: "0"生产环境建议使用集群信任的CA签发证书,或把自签名证书加入Ingress控制器的信任存储。
三、额外验证步骤
集群内直接测试连通性
用busybox Pod直接访问chat-srv-service的ClusterIP和端口,确认问题是否出在Ingress层:kubectl run -it --rm busybox --image=busybox -- wget -O- http://<chat-srv-service-cluster-ip>:<port>若同样返回连接拒绝,问题出在Service或Pod层面;若能正常访问,再聚焦Ingress配置。
检查容器日志
即便容器状态为Running,也可能存在服务启动失败或异常:kubectl logs <chat-srv-pod-name>排查是否有服务启动报错、端口占用等信息。
内容的提问来源于stack exchange,提问作者AjmalDev

