Kubernetes集群跨Pod访问服务返回504网关超时问题求助
问题描述
- Azure Kubernetes集群中部署了accounts(用户服务)、wallet(钱包服务)两个服务
- 从accounts服务内部发起对wallet服务的调用时,请求返回504网关超时错误
- 所有不涉及该跨服务调用的接口均可正常响应
- 复现测试命令:
curl http://EXTERNAL_IP/api/v1/user/health/wallet,请求触发时accounts服务端会打印实际调用的目标URL
现有配置
Ingress配置(dev命名空间)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: dev-ingress namespace: dev annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" # nginx.ingress.kubernetes.io/use-regex: "true" # nginx.ingress.kubernetes.io/rewrite-target: /api/v1$uri spec: ingressClassName: nginx rules: - http: paths: - path: /api/v1/wallet pathType: Prefix backend: service: name: wallet-service port: number: 80 - path: /api/v1/user pathType: Prefix backend: service: name: accounts-service port: number: 80
跨服务调用配置
accounts服务中配置的wallet服务访问地址环境变量值为:http://wallet-service:3007
排查步骤
按优先级从高到低排查:
- 优先核对端口配置一致性
现有配置存在明显的端口不匹配风险:Ingress规则中配置的wallet-service对外端口为80,但accounts服务配置的调用端口为3007。- 执行
kubectl get svc wallet-service -n dev -o yaml查看wallet-service的Service配置,核对spec.ports字段下暴露的端口号、以及targetPort映射的Pod实际端口 - 如果Service仅暴露80端口映射到工作负载,3007端口没有对应的监听规则,跨服务调用会直接超时,将accounts服务中环境变量的端口改为Service实际暴露的端口即可;如果业务确实需要用3007端口访问,调整Service配置新增3007端口的映射规则即可
- 执行
- 校验集群内DNS解析与网络连通性
- 进入accounts服务的Pod执行连通性测试:
kubectl exec -it <accounts服务实际Pod名称> -n dev -- curl -v http://wallet-service:<正确端口>/<测试接口路径>,根据返回结果定位问题 - 如果提示域名解析失败,检查两个服务是否在同一命名空间:若wallet服务不在dev命名空间,短域名
wallet-service无法正常解析,需要改为全域名格式wallet-service.<wallet所在命名空间>.svc.cluster.local - 如果解析正常但连接超时,检查集群网络策略:确认是否存在NetworkPolicy规则拦截了accounts Pod到wallet Pod对应端口的访问;如果是AKS集群,同时检查节点绑定的网络安全组(NSG)是否放通了集群内部对应端口的流量
- 进入accounts服务的Pod执行连通性测试:
- 校验wallet服务本身的监听状态
- 查看wallet服务的Pod日志,确认accounts发起的请求是否实际到达:如果日志中无对应请求记录,说明流量被拦截在网络层;如果有请求记录但无正常返回,检查服务接口是否存在慢查询、死锁、逻辑阻塞问题
- 确认wallet服务的监听地址:如果服务仅绑定
127.0.0.1回环地址,集群内其他Pod无法访问,需要修改服务配置监听0.0.0.0地址
- 校验链路超时配置
- 检查accounts服务中HTTP客户端的超时配置,如果超时时间设置过短,会在wallet服务返回结果前主动断开连接触发504
- 检查Nginx Ingress的代理超时配置,如果跨服务调用耗时超过Ingress默认的60s代理超时阈值,会被Ingress截断返回504,可通过添加注解
nginx.ingress.kubernetes.io/proxy-read-timeout、nginx.ingress.kubernetes.io/proxy-send-timeout调整超时阈值适配业务场景
内容的提问来源于stack exchange,提问作者King
相关产品推荐
相关产品推荐

