Kubernetes中流量转发至后端时出现connection_refused问题求助
问题排查与修复方案
一、核心排查步骤
验证前端容器到后端Service的连通性
- 进入前端Pod:
kubectl exec -it $(kubectl get pods -n myapp -l app=myapp-front -o jsonpath='{.items[0].metadata.name}') -n myapp -- /bin/bash - 在容器内测试后端Service访问:
curl http://myapp-back-svc:8080- 返回后端响应:说明后端Service正常,问题出在Nginx转发或外部端口访问
- 返回
connection refused:说明后端Service无法路由到Pod,需检查后端Service和Pod状态
- 进入前端Pod:
检查Nginx配置与运行状态
- 验证配置文件是否正确加载:
确认cat /etc/nginx/conf.d/myapp.confproxy_pass http://myapp-back-svc:8080无拼写错误 - 检查配置语法:
报错则修正配置;正常则查看错误日志定位原因:nginx -ttail -f /var/log/nginx/error.log
- 验证配置文件是否正确加载:
确认后端Service与Pod状态
- 查看后端Service的Endpoint信息:
检查kubectl describe svc myapp-back-svc -n myappEndpoints字段是否包含后端Pod的IP和8080端口,为空则说明Pod未被Service选中 - 确认后端Pod就绪状态:
确保所有Pod状态为kubectl get pods -n myapp -l app=myapp-backRunning且READY为1/1(readinessProbe通过)
- 查看后端Service的Endpoint信息:
测试外部访问的端口转发
- 若外部通过
https://myapp.mydomain.local:9090访问API:- 检查Ingress是否配置了9090端口规则(当前Ingress仅转发80端口)
- 若未配置Ingress,确认前端Service的LoadBalancer已开放9090端口(如云厂商安全组、防火墙)
- 集群内测试前端Service的9090端口:
返回后端响应则集群内转发正常,问题出在外部网络链路kubectl exec -it <集群内任意Pod> -n myapp -- curl http://myapp-front-svc:9090
- 若外部通过
二、针对性修复方案
情况1:前端容器无法访问后端Service
- 确认后端Service的
selector与Pod的labels完全匹配(当前配置为app:myapp-back,若有修改需对齐) - 检查后端Pod的readinessProbe:若探针失败,查看Pod日志排查应用启动问题:
kubectl logs <后端Pod名称> -n myapp
情况2:集群内转发正常但外部访问9090失败
方案A:通过Ingress统一转发API请求
修改前端Nginx ConfigMap,在80端口的server块中添加API路径转发,避免单独暴露9090端口:server { listen 80; server_name _; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; } # 添加API路径转发 location /api/ { proxy_pass http://myapp-back-svc:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }同时修改前端应用的API请求地址为
/api/xxx,Ingress的80端口即可同时处理页面和API请求。方案B:配置Ingress支持9090端口
修改Ingress配置,添加9090端口的转发规则:--- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: myapp-front-ingress namespace: myapp annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: / spec: tls: - hosts: - myapp.mydomain.local secretName: myapp-front-tls rules: - host: myapp.mydomain.local http: paths: - path: / pathType: Prefix backend: service: name: myapp-front-svc port: number: 80 # 添加9090端口转发 - path: / pathType: Prefix backend: service: name: myapp-front-svc port: number: 9090注:部分Ingress Controller需额外配置支持多端口转发,请参考对应文档。
情况3:Nginx配置语法错误或证书缺失
- 若K8s中Nginx去掉了
ssl配置,确保容器内无强制SSL依赖;若需要SSL,需将证书通过Secret挂载到Pod对应路径,并恢复listen 9090 ssl配置。
内容的提问来源于stack exchange,提问作者tba
相关产品推荐
相关产品推荐

