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

Kubernetes中开源Nginx无法访问后端服务问题求助

问题原因与解决方法

核心问题

Nginx在启动阶段会尝试解析upstream块中所有静态配置的主机名,若此时解析失败(比如DNS未就绪、服务名未加跨命名空间后缀),就会直接抛出启动失败错误。你配置的resolver仅在运行时生效,无法解决启动阶段的解析问题。

具体解决步骤

1. 检查服务命名空间(必做)

如果Nginx Pod和acj-prip/acj-scpp服务不在同一个命名空间,必须使用完整的服务FQDN(全限定域名):

server acj-prip.目标命名空间.svc.cluster.local:9111;
server acj-scpp.目标命名空间.svc.cluster.local:9111;

(其他Pod能正常访问,大概率是因为它们和服务在同一命名空间,无需后缀即可解析)

2. 修改Nginx配置,让resolver在启动阶段也能生效

将resolver移到http块级别(而非upstream内部),同时改用变量+proxy_pass的方式延迟解析:

serverBlock: |-
  resolver kube-dns.kube-system.svc.cluster.local valid=5s;

  upstream samplecluster {
    server acj-prip:9111;
    server acj-scpp:9111;
  }

  server {
    listen 80 default_server;
    listen [::]:80 default_server;  
    server_name _;

    location / {
      set $upstream samplecluster;
      proxy_pass http://$upstream/;
    }
  }

通过set $upstream将上游集群名转为变量,Nginx会在运行时通过resolver动态解析,避免启动阶段的解析失败。

3. 备选方案:添加容错配置(可选)

如果服务存在临时DNS波动,可以添加以下配置提升稳定性:

serverBlock: |-
  resolver kube-dns.kube-system.svc.cluster.local valid=5s;
  resolver_timeout 1s;

  upstream samplecluster {
    server acj-prip:9111;
    server acj-scpp:9111;
  }

  server {
    listen 80 default_server;
    listen [::]:80 default_server;  
    server_name _;

    location / {
      set $upstream samplecluster;
      proxy_pass http://$upstream/;
      proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    }
  }

验证方法

修改配置后重新部署Nginx Pod,进入Pod内部执行:

nslookup acj-prip
# 跨命名空间时用完整域名测试
nslookup acj-prip.目标命名空间.svc.cluster.local

如果能正常解析到服务的ClusterIP,说明DNS配置正常,此时Nginx应该能正常启动并转发请求。

内容的提问来源于stack exchange,提问作者windowws

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:47:28