Kubernetes集群仅Master节点Pod可解析服务名问题求助
我之前在类似的kubeadm+flannel集群环境里遇到过一模一样的问题,结合你的测试结果和配置信息,咱们一步步来排查解决:
先明确现象
Master节点Pod的解析情况
你在Master节点的etcd Pod里执行nslookup:
kubectl exec -ti etcd-master -n kube-system -- nslookup kubernetes.default
得到的输出里,DNS服务器用的是宿主机的192.168.1.1,虽然解析到的地址不符合预期(正常应该是集群内部的10.96.0.1),但至少能返回结果,说明Master节点的Pod网络和DNS链路是通的。
Slave节点Pod的解析情况
而Slave节点的busybox Pod里执行同样的命令:
kubectl exec -ti busybox -- nslookup kubernetes.default
输出显示用的是集群DNS 10.96.0.10,但完全无法解析,这说明问题大概率出在Slave节点到coredns的网络连通性,或者节点DNS配置继承的问题上。
核心问题分析
1. 节点DNS配置的隐患
你提到各节点的/etc/resolv.conf只配置了宿主机IP作为DNS:
# Generated by NetworkManager search fios-router.home nameserver 192.168.1.1
这会导致两个关键问题:
- Kubernetes Pod默认会继承节点的DNS搜索域,缺少
svc.cluster.local和cluster.local的话,Pod无法自动补全服务的集群域名后缀 - Slave节点的Pod虽然尝试用集群DNS 10.96.0.10,但如果coredns本身依赖节点的DNS解析外部域名,而节点DNS没正确配置的话,也会影响coredns的正常工作
2. Flannel网络的连通性问题
Flannel是overlay网络插件,负责跨节点的Pod通信。如果Slave节点的Pod无法访问Master节点上的coredns Pod(毕竟coredns通常跑在Master上),那肯定无法解析服务名。
具体解决步骤
第一步:修复节点的DNS配置
首先要给所有节点的DNS配置添加集群DNS和集群搜索域,而且要避免被NetworkManager覆盖:
- 用nmcli修改网络配置(替换成你的网络连接名称,比如
enp0s3):
nmcli con mod enp0s3 ipv4.dns "10.96.0.10 192.168.1.1" nmcli con mod enp0s3 ipv4.dns-search "svc.cluster.local cluster.local fios-router.home" nmcli con down enp0s3 && nmcli con up enp0s3
- 验证修改后的
/etc/resolv.conf,应该显示如下内容:
# Generated by NetworkManager search svc.cluster.local cluster.local fios-router.home nameserver 10.96.0.10 nameserver 192.168.1.1
第二步:检查Flannel网络是否正常
- 确认所有节点的flannel Pod都在运行:
kubectl get pods -n kube-system -l app=flannel
如果有Slave节点的flannel Pod状态异常,查看日志找原因:
kubectl logs -n kube-system <flannel-pod-name>
- 测试Slave节点Pod到coredns Pod的连通性:
先找到coredns的Pod IP:
kubectl get pods -n kube-system -l k8s-app=kube-dns -o wide
然后在Slave节点的busybox Pod里ping这个IP:
kubectl exec -ti busybox -- ping <coredns-pod-ip>
如果ping不通,检查VirtualBox的网络设置(确保用桥接模式,或者允许虚拟机之间的通信),同时关闭节点的防火墙或者开放Flannel需要的UDP 8472端口:
firewall-cmd --add-port=8472/udp --permanent firewall-cmd --reload
第三步:验证coredns的功能
在Slave节点的Pod里直接指定coredns IP解析服务名:
kubectl exec -ti busybox -- nslookup kubernetes.default 10.96.0.10
如果还是失败,查看coredns的日志找错误:
kubectl logs -n kube-system -l k8s-app=kube-dns
常见的错误比如coredns无法访问etcd,或者权限不足,这时候需要检查coredns的配置和RBAC权限。
按照这些步骤操作后,Slave节点的Pod应该就能正常解析服务名了。
内容的提问来源于stack exchange,提问作者anweb

