You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kubernetes集群CoreDNS访问外部DNS服务器出现I/O超时导致DNS解析失败求助

Kubernetes集群CoreDNS访问外部DNS服务器出现I/O超时导致DNS解析失败求助

你好,我之前也碰到过类似的CoreDNS转发请求超时的问题,结合你的日志和环境信息,咱们可以从以下几个方向一步步排查:

1. 先确认CoreDNS的核心配置是否正确

首先得看看CoreDNS的Corefile有没有正确配置转发规则,毕竟它是按这个配置来转发外部DNS请求的:

kubectl -n kube-system get configmap coredns -o yaml

重点看forward插件部分,正常情况下应该是指向节点的/etc/resolv.conf,类似这样:

forward . /etc/resolv.conf

如果这里配置的DNS服务器和你节点上/etc/resolv.conf里的不一致,或者规则里加了不必要的限制,可能会导致转发失败。

2. 直接在CoreDNS Pod里测试连通性

既然日志显示是连外部DNS服务器超时,那咱们直接进到CoreDNS Pod里验证网络连通性:
先获取CoreDNS Pod的名称:

kubectl -n kube-system get pods -l k8s-app=kube-dns

然后进入Pod的shell:

kubectl -n kube-system exec -it <你的coredns-pod名称> -- sh

进去后先ping一下日志里的DNS服务器,比如ping 10.52.2.156,看看能不能通——如果ping都不通,说明网络层面有阻断。
再用dig测试DNS端口的连通性:

dig @10.52.2.156 google.com

如果这个命令也超时,那基本可以确定是UDP 53端口的流量被拦截了。

3. 检查Calico网络策略是否限制了流量

Calico的网络策略很容易不小心挡住Pod的出站流量,咱们先看看kube-system命名空间下的策略:

kubectl -n kube-system get networkpolicies

重点看有没有针对CoreDNS(标签k8s-app=kube-dns)的策略,或者默认拒绝出站的规则。如果有策略限制了UDP 53端口的出站,那得调整策略允许CoreDNS访问外部DNS服务器。
另外也别忘了检查Calico的全局网络策略,有些全局规则会影响所有Pod的流量。

4. 排查节点层面的防火墙/iptables规则

节点上的防火墙或者iptables规则也可能拦截Pod到外部DNS的流量:

  • 如果用的是iptables,直接检查相关规则:
iptables-save | grep -i dns
# 或者直接看53端口的规则
iptables-save | grep 53
  • 如果用ufw或者firewalld,确认这些服务允许UDP 53端口的出站流量,或者允许Pod所在的网段(比如Calico的Pod网段)访问外部网络。

5. 验证是否所有Pod都无法访问外部DNS

有时候可能不是CoreDNS独有的问题,而是整个Pod网络都无法访问外部网络。咱们可以跑一个debug Pod测试:

kubectl run debug-pod --image=busybox:1.36 --rm -it -- sh

进去后同样ping外部DNS服务器、用dig解析域名,如果这个Pod也无法访问,那问题大概率出在Calico的SNAT配置上——需要检查Calico的felix配置,确认natOutgoing是否设置为true,这个参数是让Pod访问外部网络时做源地址转换的,没开的话Pod就出不去。

6. 确认节点本身的DNS是否正常

最后,在集群的节点上直接测试DNS服务器的可用性:

nslookup google.com 10.52.2.156

如果节点本身也无法解析,那问题就不在Kubernetes层面,而是节点的网络或者DNS服务器本身的问题了。

备注:内容来源于stack exchange,提问作者Patrick McKeever

火山引擎 最新活动