Kubernetes Pod 无法解析域名报错 NXDOMAIN 怎么排查?

文章导读
遇到 Pod 报 NXDOMAIN,优先检查 CoreDNS 服务状态和 Pod 的 DNS 配置,大多数情况是 CoreDNS 配置错误、上游 DNS 不可用或域名本身不存在。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

遇到 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 状态

Kubernetes Pod 无法解析域名报错 NXDOMAIN 怎么排查?

确认 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 不可达或配置错误,会导致外部域名解析失败。

Kubernetes Pod 无法解析域名报错 NXDOMAIN 怎么排查?
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 地址。

Kubernetes Pod 无法解析域名报错 NXDOMAIN 怎么排查?
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/)