You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes中流量转发至后端时出现connection_refused问题求助

问题排查与修复方案

一、核心排查步骤

  • 验证前端容器到后端Service的连通性

    1. 进入前端Pod:
      kubectl exec -it $(kubectl get pods -n myapp -l app=myapp-front -o jsonpath='{.items[0].metadata.name}') -n myapp -- /bin/bash
      
    2. 在容器内测试后端Service访问:
      curl http://myapp-back-svc:8080
      
      • 返回后端响应:说明后端Service正常,问题出在Nginx转发或外部端口访问
      • 返回connection refused:说明后端Service无法路由到Pod,需检查后端Service和Pod状态
  • 检查Nginx配置与运行状态

    1. 验证配置文件是否正确加载:
      cat /etc/nginx/conf.d/myapp.conf
      
      确认proxy_pass http://myapp-back-svc:8080无拼写错误
    2. 检查配置语法:
      nginx -t
      
      报错则修正配置;正常则查看错误日志定位原因:
      tail -f /var/log/nginx/error.log
      
  • 确认后端Service与Pod状态

    1. 查看后端Service的Endpoint信息:
      kubectl describe svc myapp-back-svc -n myapp
      
      检查Endpoints字段是否包含后端Pod的IP和8080端口,为空则说明Pod未被Service选中
    2. 确认后端Pod就绪状态:
      kubectl get pods -n myapp -l app=myapp-back
      
      确保所有Pod状态为Running且READY为1/1(readinessProbe通过)
  • 测试外部访问的端口转发

    1. 若外部通过https://myapp.mydomain.local:9090访问API:
      • 检查Ingress是否配置了9090端口规则(当前Ingress仅转发80端口)
      • 若未配置Ingress,确认前端Service的LoadBalancer已开放9090端口(如云厂商安全组、防火墙)
    2. 集群内测试前端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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:24:24