Kubernetes DNS解析失败需分层排查:先验Pod的resolv.conf和内部/外部域名解析,再查CoreDNS Pod、Service、Endpoint及日志,通过直连PodIP隔离数据面与CoreDNS自身问题,若启用NodeLocal DNSCache需确认节点resolv.conf并重启其Pod。

Kubernetes 中 DNS 解析失败通常不是单一原因导致的,而是涉及 Pod 配置、CoreDNS 状态、网络连通性、上游 DNS 可达性等多个环节。排查关键在于分层验证:先确认内部服务能否解析,再判断外部域名是否正常,最后定位是 CoreDNS 自身问题还是数据面转发异常。
检查 Pod 的 DNS 配置和基础连通性
进入异常 Pod 执行以下命令:
-
查看 /etc/resolv.conf:确认 nameserver 是否指向集群 DNS Service IP(如 10.96.0.10),search 域是否包含
svc.cluster.local;若出现多个 nameserver 或指向宿主机 IP(如 127.0.0.53),说明 dnsPolicy 或节点配置异常。 -
测试内部域名:运行
nslookup kubernetes.default,成功表示 CoreDNS 内部解析正常;失败则聚焦 CoreDNS 本身或 Service/Endpoint。 -
测试外部域名:运行
nslookup google.com,失败但内部成功,大概率是 upstream DNS 不可达或 NodeLocal DNSCache 未更新。
验证 CoreDNS 组件健康与配置
在 kube-system 命名空间中执行:
-
Pod 状态:运行
kubectl get pods -n kube-system -l k8s-app=kube-dns,确保所有副本 Running 且 Ready。 -
Service 和 Endpoint:运行
kubectl get svc,endpoint -n kube-system kube-dns,确认 Endpoint 列出的 IP 与 CoreDNS Pod IP 一致,且端口映射正确(53/TCP & UDP)。 -
日志线索:运行
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=100,重点关注i/o timeout、Failed to watch、forward plugin: no upstream等错误,它们分别指向上游超时、API 访问异常或 forward 配置缺失。 -
Corefile 检查:运行
kubectl get cm coredns -n kube-system -o yaml,确认forward插件后跟了有效上游(如8.8.8.8或节点 resolv.conf 中的地址)。
区分是 CoreDNS 自身问题还是数据面转发故障
用直连方式绕过 Service VIP 进行隔离:
- 获取某个 CoreDNS Pod 的 IP:
kubectl get pod -n kube-system -l k8s-app=kube-dns -o wide - 在业务 Pod 中直接查询:
nslookup kubernetes.default <coredns-pod-ip> - 若直连成功但走 Service IP 失败,问题在 kube-proxy(iptables/IPVS 规则)、conntrack 表满、NetworkPolicy 拦截或 CNI 插件转发异常;可进一步检查
kubectl get nodes -o wide对应节点的 kube-proxy 日志和 iptables 规则。 - 若直连也失败,则问题在 CoreDNS Pod 内部:资源不足、配置错误、上游不可达,或节点级 DNS 配置(如 /etc/resolv.conf)被 NodeLocal DNSCache 错误缓存。
处理 NodeLocal DNSCache 导致的上游失效
如果集群启用了 NodeLocal DNSCache(DaemonSet,标签 k8s-app=nodelocaldns):
- 登录异常节点,检查
/etc/resolv.conf是否配置了可用的 nameserver(如114.114.114.114或云厂商提供的 DNS); - NodeLocal DNSCache 启动后不会自动重读该文件,修改后必须重启对应节点上的 Pod:
kubectl delete pod -n kube-system -l k8s-app=nodelocaldns --field-selector spec.nodeName=<node-name>; - 验证新 Pod 启动后是否加载了更新后的上游:
kubectl exec -n kube-system <nodelocaldns-pod> -- cat /etc/resolv.conf(它会显示自己从节点读取的 upstream)。


















