kube-dns Pod连接拒绝问题求助:Kubernetes v1.9.3(Ubuntu16.04LTS)
排查kube-dns连接拒绝问题(搭配Flannel在K8s v1.9.3)
我之前处理过不少类似的场景,结合你的环境(Ubuntu 16.04 LTS + Kubernetes v1.9.3 + Flannel),kube-dns出现连接拒绝的问题,通常和网络连通性、组件配置、系统防火墙规则这几个核心点有关,下面逐一拆解排查步骤:
1. 先确认Flannel网络是否正常工作
Flannel是集群Pod间通信的基础,如果它没跑起来,kube-dns必然会出问题:
- 检查所有节点上的Flannel Pod状态:
确保所有Pod都处于kubectl get pods -n kube-system -l app=flannelRunning状态,如果有CrashLoopBackOff,立刻查看日志定位错误:kubectl logs -n kube-system <你的flannel-pod名称> - 验证节点间的Flannel overlay网络连通性:随便找一个节点,ping另一个节点的Pod网段(Flannel默认是
10.244.0.0/16,每个节点会分配一个子网段)。如果不通,大概率是Ubuntu默认的ufw防火墙拦截了UDP 8472端口(Flannel的通信端口),执行以下命令开放:
同时检查iptables是否有Flannel相关的ACCEPT规则,没有的话重启flanneld Pod试试。ufw allow 8472/udp
2. 检查kubelet的DNS配置参数
kube-dns的服务IP在K8s 1.9版本里默认是10.96.0.10,必须确认kubelet启动参数里正确指定了这个地址:
- 打开kubelet的配置文件(一般在
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf),检查是否有这两行:
如果缺失,添加后重启kubelet:--cluster-dns=10.96.0.10 --cluster-domain=cluster.localsystemctl daemon-reload systemctl restart kubelet - 验证kube-dns的实际Service IP是否和配置匹配:
如果IP不是kubectl get svc -n kube-system kube-dns10.96.0.10,调整kubelet参数对应这个实际IP即可。
3. 排查kube-dns自身的配置和日志异常
你提到日志有异常,重点关注这几个方向:
- 先进入kube-dns Pod查看内部的resolv.conf配置:
正常情况应该包含kubectl exec -n kube-system <你的kube-dns-pod名称> -c kubedns cat /etc/resolv.confnameserver 10.96.0.10,且搜索域只有default.svc.cluster.local svc.cluster.local cluster.local,多余的搜索域会导致解析超时。 - 查看kube-dns各容器的日志:
如果看到kubectl logs -n kube-system <你的kube-dns-pod名称> -c kubedns kubectl logs -n kube-system <你的kube-dns-pod名称> -c dnsmasqdnsmasq: failed to create listening socket这类错误,说明节点上的53端口被占用了——Ubuntu 16.04默认的systemd-resolved会占用53端口,修改配置关闭它的监听:
编辑/etc/systemd/resolved.conf,设置DNSStubListener=no,然后重启服务:systemctl restart systemd-resolved
4. 检查防火墙或iptables规则拦截
Ubuntu的ufw或者自定义iptables规则可能会阻断集群内部流量:
- 先临时关闭ufw测试:
如果问题解决,说明需要添加允许集群内部流量的规则,比如开放Pod网段(ufw disable10.244.0.0/16)和Service网段(10.96.0.0/12)的所有通信。 - 如果你手动开启了SELinux(Ubuntu默认关闭),临时设置为Permissive模式测试:
setenforce 0
5. 确认Flannel的CNI配置是否正确
kubelet需要加载正确的CNI配置才能让Pod获取网络:
- 检查节点上的CNI配置目录
/etc/cni/net.d/,应该有一个10-flannel.conf文件,内容类似:
如果没有这个文件,从Flannel Pod里复制一份:{ "name": "cbr0", "type": "flannel", "delegate": { "isDefaultGateway": true } }
然后重启kubelet生效。kubectl cp -n kube-system <你的flannel-pod名称>:/etc/kube-flannel/cni-conf.json /etc/cni/net.d/10-flannel.conf
你可以按照这个顺序逐一排查,大部分情况下Flannel初始化异常或者kubelet DNS参数配置错误是最常见的诱因。
内容的提问来源于stack exchange,提问作者Fayas B
相关产品推荐
相关产品推荐

