首页/云/Kubernetes 速查/集群内 DNS 解析失败排查
网络与服务55 条

集群内 DNS 解析失败排查

从一个 Pod 的解析行为入手:先看 Pod 的 resolv.conf 与搜索域,再查 CoreDNS 副本、Service 与上游转发。

Kubernetes 速查云更新于 2026-10-13

排查定位

集群内 DNS 解析失败的表现通常是应用报 name resolution 错误、连不上另一个 Service。适用平台是 Kubernetes,名字解析由 kube-system 里的 CoreDNS(旧集群是 kube-dns)承担:Pod 的 /etc/resolv.conf 指向 kube-dns Service,CoreDNS 依据 Service 与 EndpointSlice 生成记录,集群外域名再转发给上游 DNS。定位顺序应该是「先看 Pod 的解析配置,再看 CoreDNS 是否健康,最后看上游转发」,而不是一上来重启组件。

基本信息

适用平台Kubernetes,DNS 由 CoreDNS 提供(kube-dns Service 为入口)
Pod 侧配置/etc/resolv.conf 的 nameserver、search、ndots 由 kubelet 按集群 DNS 配置注入
记录形式<service>.<ns>.svc.cluster.local,Pod 级记录仅 Headless Service 才有
权限要求能读 kube-system 下的 Pod、Service、ConfigMap

典型使用场景

  • 应用报连不上下游服务:先区分是 DNS 解析失败还是解析成功但连接被拒
  • 新命名空间部署后名字解析不了:确认 Service 是否创建、名字是否写错命名空间
  • 外部域名解析失败:集群内名字正常,说明问题在上游转发或 CoreDNS 的 forward 配置
  • 间歇性超时:怀疑 ndots 触发多次查询或上游不稳定,用临时 Pod 反复验证
  • 排查 NodeLocal DNSCache 引入的变化:部署后解析走本机缓存,排查点跟着变

三步定位

三步定位
kubectl run dnsutils --rm -it --restart=Never --image=registry.k8s.io/e2e-test-images/agnhost:2.45 -- nslookup kubernetes.default
kubectl get pods -n kube-system -l k8s-app=kube-dns          # CoreDNS 副本是否齐全
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=50    # 看 SERVFAIL、超时与上游报错
kubectl get svc -n kube-system kube-dns                      # 入口 Service 与端口
kubectl exec -it web-x -- cat /etc/resolv.conf               # 故障 Pod 自己的解析配置
kubectl get endpoints kube-dns -n kube-system                # DNS 自身有没有可用后端

现象与原因对照

现象常见原因处理方向
集群内名字解析失败,外部正常Service 不存在或命名空间写错核对 svc 名与 FQDN
全部名字都失败CoreDNS 副本全挂或 kube-dns Service 无端点看副本数、重启次数与端点
只有外部域名失败CoreDNS forward 指向的上游不通查 CoreDNS ConfigMap 的 forward 配置与节点出网
偶发超时ndots 触发多轮查询或上游抖动观察 resolv.conf 的 ndots 与 search
某个 Pod 单独失败该 Pod 的 dnsPolicy 或 dnsConfig 被改写对比正常 Pod 的解析配置
resolv.conf 里的 ndots 与 search 决定解析路径:ndots 默认为 5,域名里的点少于该值时先拼 search 后缀逐个尝试,这就是「解析慢但最终成功」的常见来源。
排查时在故障 Pod 与新建临时 Pod 上各测一次,可以快速区分是个例(该 Pod 的配置或网络策略问题)还是集群级问题(CoreDNS 或上游)。
重启 CoreDNS 期间集群内所有新解析都会受影响,排障应先取证(日志、端点、副本状态)再考虑重启,避免现场被清掉。

易错点

  • 只在故障 Pod 上验证:新建一个临时 Pod 对比,可区分个例与集群级问题,否则容易把配置问题误判成组件故障
  • 忽略上游转发:集群内名字正常但外部域名失败,问题通常在上游 DNS 与 CoreDNS 转发配置,而不是集群本身
  • 把 DNS 问题当网络问题:解析失败与连不上目标是两件事,先用 nslookup 确认名字能不能解析,再查连通性
  • 改了 CoreDNS 的 Corefile 没做语法检查就 reload,错误的 Corefile 会让全部解析立刻失败,改动前先备份

数据来源与参考

  • Kubernetes 官方文档 · DNS 服务与调试
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌