Kubernetes集群Pod内部无法解析域名问题排查求助
常见疑问解答
- kube-dns服务选择器配置是否正确?
该配置完全正确,kube-dns服务的k8s-app=kube-dns选择器与CoreDNS Pod的标签匹配是K8s集群的默认标准配置,不存在配置错误问题。 - kube-system下PodIP分两类是否正常?
该现象完全正常:
- 静态Pod(etcd、kube-apiserver、kube-controller-manager、kube-scheduler)、节点网络组件(flannel、kube-proxy)默认开启
hostNetwork参数,直接复用节点本身IP - 普通工作负载(CoreDNS、metrics-server)使用Flannel分配的集群Pod CIDR段IP,属于预期设计
故障根因定位
从测试结果可排除公网连通性问题:Pod ping 8.8.8.8通、指定8.8.8.8做DNS解析可拿到结果,说明Pod的公网访问、SNAT规则均正常,问题集中在两个点:
- CoreDNS Pod无法连接kube-apiserver同步集群服务记录(CoreDNS日志中
[INFO] plugin/ready: Still waiting on: "kubernetes"为明确异常标识) - 普通Pod到CoreDNS Pod的跨节点网络连通性不稳定,出现间歇性丢包、超时
排查与解决步骤
1. 修复内核参数配置(优先级最高,90%以上同类型故障都是该原因导致)
所有节点执行以下命令检查内核参数:
sysctl net.ipv4.ip_forward sysctl net.bridge.bridge-nf-call-iptables sysctl net.ipv4.conf.all.rp_filter
要求返回值分别为:net.ipv4.ip_forward = 1、net.bridge.bridge-nf-call-iptables = 1、net.ipv4.conf.all.rp_filter = 0 或 2
如果不符合要求,临时生效执行:
sysctl -w net.ipv4.ip_forward=1 sysctl -w net.bridge.bridge-nf-call-iptables=1 sysctl -w net.ipv4.conf.all.rp_filter=0 sysctl -w net.ipv4.conf.default.rp_filter=0
永久生效将上述参数写入/etc/sysctl.conf文件,执行sysctl -p加载配置,之后重启所有flannel Pod:
kubectl delete pods -n kube-system -l app=flannel
2. 检查Flannel配置适配性
查看Flannel的后端模式配置:
kubectl get configmap kube-flannel-cfg -n kube-system -o yaml | grep -A 10 net-conf.json
由于你的集群主节点和工作节点分属10.7.50.X/16、10.7.60.X/16两个不同三层网段,Flannel后端必须使用vxlan模式,如果配置为host-gw模式会导致跨节点Pod通信失败,修改为vxlan模式后重启flannel Pod即可。
同时确认所有节点之间的8472/udp端口(vxlan通信端口)没有被上层安全组、运营商封禁。
3. 验证CoreDNS到apiserver的连通性
进入CoreDNS Pod测试apiserver访问:
# 替换为你的CoreDNS Pod名称 kubectl exec -n kube-system coredns-84f8874d6d-jgvwk -- curl -k https://10.96.0.1:443
如果返回连接超时,检查kube-proxy日志是否有iptables规则创建错误:
# 替换为任意kube-proxy Pod名称 kubectl logs -n kube-system kube-proxy-948z8
4. 快速验证方案
如果以上排查后仍未恢复,可以临时将CoreDNS改为hostNetwork模式验证:
kubectl edit deployment coredns -n kube-system
在spec.template.spec层级下新增hostNetwork: true配置,保存后等待CoreDNS Pod重建,再执行DNS解析测试。如果此时解析正常,即可100%确认是Flannel跨节点通信问题,回退配置后重点排查Flannel即可。
内容的提问来源于stack exchange,提问作者Slyke

