You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes集群仅Master节点Pod可解析服务名问题求助

解决Slave节点Pod无法解析Kubernetes服务名的问题

我之前在类似的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覆盖:

  1. 用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
  1. 验证修改后的/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网络是否正常

  1. 确认所有节点的flannel Pod都在运行:
kubectl get pods -n kube-system -l app=flannel

如果有Slave节点的flannel Pod状态异常,查看日志找原因:

kubectl logs -n kube-system <flannel-pod-name>
  1. 测试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:10:27