你遇到的问题是 CoreDNS 出现了循环查询(loop)错误,这是在 Kubernetes 集群中配置 DNS 时比较常见的一个故障。我们一步一步来分析:
🔍 问题概述
你看到的日志中出现了这个报错:
[FATAL] plugin/loop: Loop (245.0.2.107:52606 -> :53) detected for zone ".", see https://coredns.io/plugins/loop#troubleshooting. Query: "HINFO ..."
这是 CoreDNS 检测到自己递归查询自己,从而触发了 loop plugin
的保护机制,自动崩溃退出。
🚨 产生这个问题的根本原因
💥 DNS 循环(DNS loop)的典型触发场景:
CoreDNS 接到 DNS 查询时,试图递归查询上游 DNS 服务器,而配置中它可能再次指向自己,形成 递归查询死循环。
🔧 你当前配置中的线索分析
📌 CoreDNS 日志:
-
CoreDNS-1.6.7
—— 较旧版本,存在一些循环探测不完善的问题。 -
loop
插件检测到:245.0.2.107:52606 -> :53
的循环- 发起者是 Pod 的某个 IP(
245.0.2.107
) - 目标是 CoreDNS 自己的
:53
端口
- 发起者是 Pod 的某个 IP(
📌 DNS 服务的 ClusterIP 配置:
kube-dns ClusterIP 246.96.0.10 53/UDP,53/TCP
📌 /etc/resolv.conf
内容:
nameserver 246.96.0.10
→ 表示 Pod 中的 DNS 查询将会被发送到 kube-dns
(即 CoreDNS)服务的 ClusterIP。
🧠 为什么会死循环?
CoreDNS 收到 DNS 查询后,如果没有设置正确的上游转发器(forward),它尝试向 /etc/resolv.conf
中配置的 nameserver 发送查询。
⛔ 如果 /etc/resolv.conf
的 nameserver
就是 CoreDNS 自己 → 循环!
即:
CoreDNS → 查询失败 → 读 /etc/resolv.conf → 发送请求到 246.96.0.10 → 再次进入 CoreDNS → 死循环
✅ 正确做法和解决方案
✅ 1. 检查 CoreDNS 配置文件:Corefile
运行命令获取 CoreDNS 配置:
kubectl -n kube-system get configmap coredns -o yaml
重点检查 forward
插件配置是否存在:
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
forward . 8.8.8.8 114.114.114.114 # ✅ 应该显式设置上游 DNS
cache 30
loop
reload
loadbalance
}
如果缺少
forward
指令,或 forward 指向的是 CoreDNS 自己 → 会触发循环。
✅ 2. 正确配置 /etc/resolv.conf
- 对于节点上的
/etc/resolv.conf
,它可以指向 CoreDNS 的 IP - 但对于 CoreDNS 自身运行的容器环境中,必须有正确的外部 nameserver,如:
nameserver 8.8.8.8
nameserver 114.114.114.114
你可以通过为 CoreDNS 的容器设置独立的 /etc/resolv.conf
或通过 ConfigMap 的方式控制其 DNS 策略。
✅ 3. 避免使用 loopback
地址做 nameserver
例如:
nameserver 127.0.0.1
也会触发类似的问题,CoreDNS 会向自己所在容器的 127.0.0.1 发起请求,依然是循环。
📦 补充建议
动作 | 命令 |
---|---|
检查 CoreDNS 状态 | kubectl -n kube-system get pods -l k8s-app=kube-dns |
查看 CoreDNS 配置 | kubectl -n kube-system get configmap coredns -o yaml |
查看 Pod DNS 配置 | kubectl exec -it <pod-name> -- cat /etc/resolv.conf |
临时测试 DNS 正常性 | nslookup kubernetes.default |
🛠 解决步骤小结
- 检查 CoreDNS 的
Corefile
,确保存在forward
且指向有效外部 DNS(如 8.8.8.8) - 避免
/etc/resolv.conf
中的 nameserver 是 CoreDNS 自己 IP(死循环) - 重启 CoreDNS Pod 后验证是否仍报错
- 若是特殊网络插件或自定义 DNS 服务,请检查是否有 IP 冲突或 NetworkPolicy 限制