GKE Nginx Ingress同IP下test子域名DNS解析失败无法访问
DNS_PROBE_FINISHED_NXDOMAIN属于DNS解析层级故障,请求根本没有到达GKE负载均衡,更不会转发到nginx ingress控制器,因此控制器日志无请求记录属于正常现象,和集群内Service、Deployment、Ingress资源配置无直接关联。
根因判断依据
eu1.my-domain.com可正常访问返回ingress默认页面,说明以下组件运行正常:
- helm部署的nginx ingress控制器状态正常
- GKE自动创建的公网负载均衡配置正常、公网IP可达
- 公网到GKE LB的链路无阻断
故障点锁定在test.my-domain.com的DNS解析配置环节。
第一步:修复DNS解析故障
- 本地执行解析校验:运行
nslookup test.my-domain.com,确认返回结果是否为GKE负载均衡的公网IP,若返回NXDOMAIN直接调整Cloudflare解析配置:- 检查
test.my-domain.com记录类型为A记录,记录值与eu1.my-domain.com填写的LB公网IP完全一致,无拼写错误 - 调试阶段临时将该条记录的Cloudflare代理状态调整为「仅DNS」(灰云模式),排除Cloudflare代理层、DNSSEC配置冲突导致的解析失败
- 确认不存在冲突的解析记录(比如同主机名的CNAME记录、错误的通配符记录覆盖该子域名)
- 检查
- 新添加的解析记录等待1-5分钟待TTL生效,同时清空本地DNS缓存后重试:
- Windows系统执行:
ipconfig /flushdns - Mac系统执行:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder - Linux系统根据自身DNS服务执行对应缓存清理命令,或直接换用公共DNS(比如8.8.8.8)测试解析
- Windows系统执行:
第二步:解析通后的Ingress配置优化
待test.my-domain.com可正常解析到LB IP后,调整现有Ingress配置适配新版ingress-nginx控制器规则,避免出现路由不生效问题:
- 替换旧版本的Ingress类注解,改用官方推荐的
ingressClassName字段,修改后的Ingress配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: echo-ingress-global namespace: app-a annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" spec: ingressClassName: nginx rules: - host: "test.my-domain.com" http: paths: - pathType: Prefix path: "/" backend: service: name: echo1 port: number: 80
执行kubectl apply -f <你的ingress配置文件路径>应用变更。
2. 校验后端连通性:
- 执行kubectl describe ingress echo-ingress-global -n app-a,查看Events字段确认控制器已成功同步Ingress规则,无后端Service不存在的报错
- 执行集群内连通性测试:kubectl run -it --rm debug --image=curlimages/curl --restart=Never -n app-a -- curl http://echo1:80,确认返回echo1字样,说明Service与后端Pod通信正常
验证标准
本地执行curl http://test.my-domain.com返回echo1内容,同时nginx ingress控制器日志可查看到对应请求记录,即为配置生效。
注意:只要访问时仍返回
DNS_PROBE_FINISHED_NXDOMAIN错误,说明故障仍在DNS层,无需反复排查集群内资源配置,优先解决解析问题。
内容的提问来源于stack exchange,提问作者tobias

