AWS EKS部署Nginx报错upstream主机udagram-users:8080未找到
问题排查与解决步骤
1. 检查是否漏部署业务服务的Deployment和Service
你给出的部署步骤中仅列出了密钥、配置和反向代理的部署命令,首先要确认是否已经成功部署udagram-users、udagram-feed两个业务服务的Deployment和对应Service:
- 执行
kubectl get svc查看命名空间下是否存在名称为udagram-users、udagram-feed的Service,K8s服务名大小写敏感,必须和nginx配置中写的完全一致 - 执行
kubectl get pods查看两个业务服务的Pod是否处于Running状态,无崩溃、拉取镜像失败等异常
如果没有上述资源,先完成两个业务服务的部署,再启动反向代理。
2. 修正nginx配置中的DNS解析设置
你当前nginx配置中resolver填写的是公网DNS8.8.8.8,无法解析K8s集群内部的服务域名,需要替换为集群内部DNS:
- 执行
kubectl get svc kube-dns -n kube-system获取集群CoreDNS的ClusterIP - 将nginx配置中所有
resolver 8.8.8.8;替换为resolver <CoreDNS的ClusterIP> valid=5s;,或者直接填写集群DNS域名resolver kube-dns.kube-system.svc.cluster.local valid=5s;
3. 优化nginx配置避免启动强依赖上游
nginx默认启动时会预先解析所有upstream块中的域名,只要有一个解析失败就会直接启动报错,可以调整配置去掉upstream块,改为动态解析模式:
worker_processes 1; events { worker_connections 1024; } error_log /dev/stdout debug; http { sendfile on; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; server { listen 8080; location /api/v0/feed { resolver kube-dns.kube-system.svc.cluster.local valid=5s; proxy_pass http://udagram-feed:8080; } location /api/v0/users { resolver kube-dns.kube-system.svc.cluster.local valid=5s; proxy_pass http://udagram-users:8080; } } }
修改后重新构建反向代理镜像再部署即可,调整后nginx启动时不会提前解析上游域名,仅在请求到来时解析,不会因为上游服务暂时不可用导致反向代理启动失败。
4. 检查命名空间匹配问题
如果你的业务服务没有部署在default命名空间,需要在nginx配置中补全完整的K8s服务域名,格式为<服务名>.<命名空间>.svc.cluster.local,比如业务服务部署在udagram命名空间,就需要将域名写为udagram-users.udagram.svc.cluster.local。
5. 验证集群DNS服务是否正常
如果上述配置都正确还是解析失败,检查集群CoreDNS是否正常运行:
- 执行
kubectl get pods -n kube-system | grep coredns,确认所有CoreDNS Pod都处于Running状态 - 启动临时测试Pod验证解析:
kubectl run -it --rm --image=busybox:1.28 dns-test -- nslookup udagram-users,如果返回解析失败,需要先排查集群CoreDNS的故障。
内容的提问来源于stack exchange,提问作者Oussama Bouchikhi
相关产品推荐
相关产品推荐

