Ubuntu 20中K8s服务名无法解析,如何应对Cluster-IP动态变化?
核心原因
你的Ubuntu主机当前的DNS服务器无法解析K8s集群内部的服务域名,只能靠手动修改/etc/host映射IP,而K8s服务的ClusterIP虽相对稳定,但手动维护显然不现实。
解决方案
方案一:配置主机DNS指向K8s的kube-dns
从你提供的kubectl get svc输出看,kube-dns的ClusterIP是10.96.0.10,把这个地址设为主机的DNS服务器之一,就能让主机直接解析K8s服务域名。
修改systemd-resolved配置(Ubuntu 20.04默认使用)
- 编辑
/etc/systemd/resolved.conf,修改以下内容:DNS=10.96.0.10 Domains=cluster.local - 重启服务生效:
sudo systemctl restart systemd-resolved - 验证配置:
查看输出是否包含resolvectl status10.96.0.10作为DNS服务器,以及cluster.local作为搜索域。
- 编辑
临时修改resolv.conf(重启后失效)
如果不想修改systemd配置,可临时调整/etc/resolv.conf:sudo sh -c 'echo "nameserver 10.96.0.10" >> /etc/resolv.conf' sudo sh -c 'echo "search ricplt.svc.cluster.local svc.cluster.local cluster.local" >> /etc/resolv.conf'注意:若systemd-resolved管理resolv.conf,重启后该配置会被覆盖,建议优先用第一种方法。
方案二:配置搜索域简化服务名访问
不想每次输入完整服务域名(如service-ricplt-e2mgr-http.ricplt.svc.cluster.local)的话,可在DNS配置里添加对应命名空间的搜索域,直接ping服务名就能自动补全后缀。
修改/etc/systemd/resolved.conf的Domains字段:
Domains=ricplt.svc.cluster.local ricxapp.svc.cluster.local svc.cluster.local cluster.local
重启systemd-resolved后,直接执行ping service-ricplt-e2mgr-http即可解析到对应ClusterIP。
方案三:部署NodeLocal DNSCache(进阶优化)
如果集群规模较大或DNS解析延迟高,可部署NodeLocal DNSCache——在每个K8s节点运行本地DNS缓存服务,主机指向节点IP的DNS端口(默认UDP 53)后,解析性能更稳定,还能降低kube-dns的压力。
部署方式:使用Kubernetes官方提供的NodeLocal DNSCache部署清单,执行kubectl apply -f <部署清单文件路径>完成部署,之后将主机DNS设置为任意K8s节点的IP地址即可。
验证方法
配置完成后,用以下命令测试服务名解析:
# 解析完整域名 dig service-ricplt-e2mgr-http.ricplt.svc.cluster.local # 配置搜索域后,直接解析服务名 dig service-ricplt-e2mgr-http # ping测试连通性 ping service-ricplt-e2mgr-http.ricplt.svc.cluster.local
内容的提问来源于stack exchange,提问作者myquest5 sh

