遇到 Pod 报 NXDOMAIN,优先检查 CoreDNS 服务状态和 Pod 的 DNS 配置,大多数情况是 CoreDNS 配置错误、上游 DNS 不可用或域名本身不存在。
先说结论:NXDOMAIN 表示 DNS 服务器明确返回域名不存在,排查重点在于确认是配置错误还是上游解析失败。
- 先确认 CoreDNS Pod 是否 Running 且日志无报错
- 检查 Pod 内 resolv.conf nameserver 指向
- 验证 CoreDNS ConfigMap 中 forward 插件配置
命令速用版
以下命令可在集群控制节点或有权限的客户端执行:
# 检查 CoreDNS Pod 状态
kubectl get pods -n kube-system -l k8s-app=kube-dns
# 查看 CoreDNS 日志
kubectl logs -n kube-system -l k8s-app=kube-dns `--tail`=50
# 进入业务 Pod 测试解析
kubectl exec -it <pod-name> -- nslookup www.google.com
# 查看 Pod DNS 配置
kubectl exec -it <pod-name> -- cat /etc/resolv.conf
# 查看 CoreDNS 配置
kubectl get configmap coredns -n kube-system -o yaml为什么会这样
Kubernetes 集群内默认通过 CoreDNS 提供域名解析服务。当 Pod 发起 DNS 查询时,请求会被发送到 kube-dns 服务 IP。NXDOMAIN 错误码意味着 DNS 服务器收到了请求,但查询不到对应的记录。这通常不是网络不通(那是 TIMEOUT),而是解析逻辑或上游数据的问题。
分步处理
1. 检查 CoreDNS 状态
确认 kube-system 命名空间下的 CoreDNS Pod 是否正常运行。如果 Pod 处于 CrashLoopBackOff 或 Error 状态,执行 kubectl logs -n kube-system -l k8s-app=kube-dns 查看报错。
2. 检查 Pod DNS 配置
进入业务 Pod 查看/etc/resolv.conf,确认 nameserver 指向了集群内部 DNS 服务 IP(通常是 kube-dns 服务地址)。如果指向了外部 DNS,可能无法解析集群内部服务名。
3. 检查 CoreDNS 配置
查看 CoreDNS 的 ConfigMap,确认 forward 插件指向的上游 DNS 是否可用。如果上游 DNS 不可达或配置错误,会导致外部域名解析失败。
kubectl get configmap coredns -n kube-system -o yaml重点检查 Corefile 配置中的 forward 行,例如 forward . /etc/resolv.conf 或指定具体 DNS IP。若上游 DNS 不可达,CoreDNS 可能无法解析外部域名。
4. 检查网络策略
如果有 NetworkPolicy,确认是否允许 Pod 向 kube-dns 发送 UDP 53 端口流量。注意:网络策略拦截通常导致连接超时(Timeout),但若 CoreDNS 无法访问上游 DNS,也可能间接导致解析异常。
怎么验证是否生效
在 Pod 内再次执行 nslookup 或 dig 命令,观察是否返回正确的 IP 地址。
dig @<dns-service-ip> <domain>同时观察业务日志,确认域名连接错误消失。如果之前是应用启动报错,重启 Pod 后应能正常启动。
常见坑
1. dnsPolicy 设置错误:如果 Pod 设置了 dnsPolicy: None,需要手动配置 dnsConfig,否则无法使用集群 DNS。
2. CoreDNS 循环检测:CoreDNS 启动时如果检测到循环解析会拒绝启动,日志中会出现 loop 插件报错。
3. 宿主机 DNS 问题:如果 CoreDNS 配置为转发到宿主机 DNS,宿主机 resolv.conf 配置错误会影响集群整体解析。
参考来源
- Kubernetes 官方文档 - Debugging DNS Resolution (https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/)
- CoreDNS 官方文档 - Plugins (https://coredns.io/plugins/)