Kubernetes集群更新RHEL7.5后外部DNS解析失败求助
从你提供的信息来看,核心问题非常清晰:kube-dns 的 skydns 组件在转发外部 DNS 请求到上游服务器 10.101.24.100 时持续出现 I/O 超时,这直接导致集群无法解析外部地址(内部通信正常是因为内部 DNS 记录由 kube-dns 自行维护,无需转发)。结合主节点升级 RHEL 7.5 后重启的背景,大概率是主机网络配置、防火墙规则或上游 DNS 可用性发生了变化。
以下是针对性的排查和修复步骤:
1. 验证上游 DNS 服务器的连通性
首先要确认 kube-dns Pod 能否正常访问上游 DNS 服务器 10.101.24.100:
- 进入 kube-dns Pod 的 kubedns 容器测试 ICMP 连通性:
kubectl exec -ti kube-dns-86f4d74b45-9m292 -n kube-system -c kubedns -- ping 10.101.24.100 - 测试 DNS 端口(UDP/TCP 53)的可达性:
kubectl exec -ti kube-dns-86f4d74b45-9m292 -n kube-system -c kubedns -- telnet 10.101.24.100 53
如果这两步都失败,说明上游 DNS 本身不可用,或者 Pod 到该服务器的网络路径被阻断。
2. 检查 kube-dns 的上游 DNS 配置
kube-dns 默认会继承主机的 /etc/resolv.conf 配置,但主节点升级重启后可能该文件内容发生了变化:
- 查看 kube-dns 的 ConfigMap 配置:
kubectl get configmap kube-dns -n kube-system -o yaml
检查是否存在 upstreamNameservers 字段,如果没有,kube-dns 会使用主机的 DNS 服务器。如果 10.101.24.100 确实不可用,可以临时替换为公共 DNS 服务器测试:
修改 ConfigMap,添加或更新 upstreamNameservers:
apiVersion: v1 kind: ConfigMap metadata: name: kube-dns namespace: kube-system data: upstreamNameservers: | ["8.8.8.8", "8.8.4.4"]
然后重启 kube-dns Pod 使配置生效:
kubectl delete pod kube-dns-86f4d74b45-9m292 -n kube-system
3. 排查主节点的防火墙与网络规则
RHEL 7.5 使用 firewalld,主节点重启后可能防火墙规则重置,阻断了 Pod 到外部 DNS 的流量:
- 查看当前 firewalld 规则:
firewall-cmd --list-all
确保允许 Kubernetes Pod 网段(这里是 10.32.0.0/16)访问外部 UDP/TCP 53 端口。如果需要,添加临时规则测试:
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.32.0.0/16" port protocol="udp" port="53" accept' --permanent firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.32.0.0/16" port protocol="tcp" port="53" accept' --permanent firewall-cmd --reload
另外,检查 iptables 规则,确认 Weave Net 的网络规则是否正常加载:
iptables-save | grep weave
如果 Weave Net 的规则缺失,重启 Weave Net Pod:
kubectl delete pods -n kube-system -l name=weave-net
4. 验证主机的 DNS 配置
检查主节点的 /etc/resolv.conf 文件,确认 DNS 服务器是否为 10.101.24.100,且该服务器在主机上能否正常解析地址:
nslookup google.com 10.101.24.100
如果主机上也无法解析,说明上游 DNS 本身存在故障,需要联系网络团队修复,或更换可用的 DNS 服务器。
内容的提问来源于stack exchange,提问作者macintoshPrime

