需要在集群中部署StatefulSet时,发现使用域名无法解析到对应的ip。

创建dns测试pod:

kubectl run -n train-ticket dns-test --rm -it --image=busybox:1.28 --restart=Never -- sh

运行nslookup指令,无法解析域名。 

nslookup nacosdb-mysql-0.nacosdb-mysql
Server:    10.96.0.10
Address 1: 10.96.0.10

nslookup: can't resolve 'nacosdb-mysql-0.nacosdb-mysql'

解析默认的kubernetes.default,也无法解析

nslookup kubernetes.default
Server:    10.96.0.10
Address 1: 10.96.0.10

nslookup: can't resolve 'kubernetes.default'

查询相关教程,检查了 CoreDNS 、 kube-dns service 、以及 Pod 的 /etc/resolv.conf

均正常。

多次查询资料+询问chatgpt

最终找到解决方法:修改kubelet的dns设置:

✅ 5. 检查 kubelet 的启动参数

如果 kubelet 没配置 --cluster-dns=10.96.0.10,Pod 的 resolv.conf 会被写成宿主机 DNS(如 8.8.8.8),导致无法解析集群内服务名。

在每台 Node 上执行:

ps aux | grep kubelet | grep cluster-dns

应包含类似参数:

--cluster-dns=10.96.0.10 --cluster-domain=cluster.local

如果 kubelet 没这个参数,Pod 会用宿主机的 DNS(比如 8.8.8.8),而不是 CoreDNS,导致你看到:nslookup kubernetes.default 失败

修改方法

修改kubelet配置文件:

/etc/systemd/system/kubelet.service.d/10-kubeadm.conf

添加

Environment="KUBELET_EXTRA_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"

 重启kubelet:

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart kubelet

再次进入dns-test容器,执行nslookup,可以看到成功解析:

nslookup kubernetes.default

Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes.default
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local

 测试statufulset的域名,也正常解析:

nslookup nacosdb-mysql-0.nacosdb-mysql.train-ticket

Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      nacosdb-mysql-0.nacosdb-mysql.train-ticket
Address 1: 10.244.1.214 10-244-1-214.nacosdb-mysql-follower.train-ticket.svc.cluster.local

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐