k8s-dns-failed

Kubernetes 集群内 DNS 解析失败的定位与修复

现象

Pod 内解析 Service 名称失败,报 no such host、Temporary failure in name resolution 或超时。用 IP 能访问,用 service.namespace.svc.cluster.local 不行。

快速定位

kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide
kubectl get svc -n kube-system kube-dns
kubectl get endpoints -n kube-system kube-dns
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=50
kubectl run -it --rm debug --image=busybox:1.36 --restart=Never -- nslookup kubernetes.default

容器内:

cat /etc/resolv.conf
nslookup <service>.<namespace>.svc.cluster.local

常见根因

  1. CoreDNS Pod 未运行、副本不足或崩溃。
  2. kube-dns Service 没有 Endpoints,或 selector 错误。
  3. NetworkPolicy 拦截了 UDP/TCP 53。
  4. kube-proxy/CNI 异常,Pod 到 CoreDNS 不通。
  5. ndots/search 配置导致短域名解析到错误位置。
  6. CoreDNS 上游 DNS 不可达或转发配置错误。

修复

相关命令

读完自测

合上页面,先回答,再展开对照。

  1. Pod 内用 Service 名解析失败但用 IP 可访问,先检查哪些对象?
  2. 如何区分是 CoreDNS 故障、NetworkPolicy 拦截还是上游 DNS 问题?
  3. 短域名解析异常如何验证和修复?
答案
  1. 先查 kube-system 中 CoreDNS Pod、kube-dns Service 及其 Endpoints 是否正常。
  2. 看 CoreDNS 日志区分查询失败、上游超时或策略拒绝,并检查 NetworkPolicy 和 CNI 是否放行 UDP/TCP 53。
  3. 用 FQDN 验证,必要时调整 dnsConfig 的 ndots/search,修 Corefile 或节点 resolv.conf 的上游配置。