集群 DNS 解析失败是什么
Pod 内解析服务名或外网域名失败,报错常见 no such host、Temporary failure in name resolution、SERVFAIL。集群里 Pod 的 DNS 请求默认都发给 kube-dns 这个 Service,由 CoreDNS 处理,因此排查分两条线:CoreDNS 自身是否正常,以及调用方的解析配置与网络策略是否放行了 53 端口。
基本信息
| 解析入口 | Service kube-dns,后端是 kube-system 里的 CoreDNS Pod |
|---|---|
| 调用方配置 | Pod 的 /etc/resolv.conf 写入 nameserver、search 域与 ndots |
| 搜索域 | 默认包含 svc.cluster.local 等,决定短名如何补全 |
| ndots | 名字里点数少于此值时先拼搜索域,跨命名空间短名由此失败 |
| 日志 | kubectl logs -n kube-system deploy/coredns 看 SERVFAIL 与上游超时 |
现象与根因对照
| 现象 | 根因 | 处置 |
|---|---|---|
| 所有域名都解析不了 | CoreDNS 未就绪或 kube-dns 无端点 | 先看 CoreDNS Pod 与 Endpoints 是否为空 |
| 只有跨命名空间短名失败 | 短名未补全成完整域名 | 改用 name.ns.svc.cluster.local |
| 解析偶发超时 | 上游 DNS 抖动或 CoreDNS 负载高 | 看 CoreDNS 日志,扩副本并调缓存 |
| 某命名空间内全失败 | 默认拒绝的策略拦了 53 端口 | 放行 UDP/TCP 53 到 kube-dns |
| 域外域名解析慢 | CoreDNS 转发上游配置不当 | 检查 Corefile 的 forward 与 cache |
排查命令
排查命令
kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide # CoreDNS 是否就绪
kubectl exec -it web-1 -- cat /etc/resolv.conf # 看 search 域与 ndots
kubectl exec -it web-1 -- nslookup kubernetes.default.svc.cluster.local
kubectl exec -it web-1 -- getent hosts db.dev.svc.cluster.local # 换解析器交叉验证
kubectl logs -n kube-system deploy/coredns --tail=50 # 看错误与上游超时
kubectl get endpoints -n kube-system kube-dns # 端点是否为空典型使用场景
- 微服务用短名互访失败,需要用完整域名区分是搜索域问题还是服务压根不存在
- 新上了默认拒绝的 NetworkPolicy,随后业务整体解析超时
- CoreDNS 单副本所在节点故障,整个集群解析抖动
- 外部依赖域名解析变慢,各类超时都指向连接建立阶段
- 迁移命名空间后老配置里的短名不再解析,需要批量改完整域名
短名要拼 search 域才能解析:名字里的点数少于 ndots(默认 5)时,系统会先拼接搜索域尝试。跨命名空间访问写成 db.dev 在多数环境解析不到,用 db.dev.svc.cluster.local 最稳。
上游 DNS 抖动会表现为集群内解析普遍变慢,CoreDNS 日志里的 SERVFAIL 或 timeout 就是直接证据;此时改业务侧 dnsConfig 无效,应更换上游、增加副本与缓存。
先分清解析失败与网络不通:报 no such host 属 DNS 问题,报 connection refused 或超时才看链路,两条路径的排查手段完全不同,混着查会浪费大量时间。