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

Ubuntu 20中K8s服务名无法解析,如何应对Cluster-IP动态变化?

解决K8s集群主机无法通过服务名访问服务的问题

核心原因

你的Ubuntu主机当前的DNS服务器无法解析K8s集群内部的服务域名,只能靠手动修改/etc/host映射IP,而K8s服务的ClusterIP虽相对稳定,但手动维护显然不现实。

解决方案

方案一:配置主机DNS指向K8s的kube-dns

从你提供的kubectl get svc输出看,kube-dns的ClusterIP是10.96.0.10,把这个地址设为主机的DNS服务器之一,就能让主机直接解析K8s服务域名。

  1. 修改systemd-resolved配置(Ubuntu 20.04默认使用)

    • 编辑/etc/systemd/resolved.conf,修改以下内容:
      DNS=10.96.0.10
      Domains=cluster.local
      
    • 重启服务生效:
      sudo systemctl restart systemd-resolved
      
    • 验证配置:
      resolvectl status
      
      查看输出是否包含10.96.0.10作为DNS服务器,以及cluster.local作为搜索域。
  2. 临时修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:57:29