首页/云/云与容器速查/集群内服务 DNS 解析
Kubernetes68 条

集群内服务 DNS 解析

Pod 里解析服务名的完整形态是 name.namespace.svc.cluster.local:搜索域自动补全,短名仅在当前命名空间可用;跨命名空间调用必须写 name.namespace 或全域名。

云与容器速查云更新于 2026-10-13

集群内服务 DNS 解析是什么

集群内服务发现主要靠 DNS:CoreDNS 为每个 Service 生成解析记录,Pod 内解析服务名时的完整形态是 name.namespace.svc.cluster.local。kubelet 会把搜索域与 ndots 设置写进 Pod 的 /etc/resolv.conf,短名只有在当前命名空间内才能解析,跨命名空间必须写 name.namespace 或完整域名。理解这一点,能省掉大量『本地能连、跨命名空间连不上』的排查时间。

基本信息

短名web 只在同命名空间内可解析
跨命名空间写 web.dev 或 web.dev.svc.cluster.local
解析组件CoreDNS,其 Pod 通常在 kube-system 命名空间
Headless Service返回多个 Pod IP;SRV 记录带端口与实例名
排查手段exec 进 Pod 用 nslookup 或 getent hosts 验证解析结果

典型使用场景

  • 应用配置用服务名代替固定 IP,Pod 重建后地址变化也不影响连接
  • 跨命名空间调用中间件:应用在业务命名空间、数据库在独立命名空间
  • Headless Service 配合 StatefulSet 做点对点通信与主从复制
  • 通过 SRV 记录发现实例端口与节点标识,适配需要逐台连接的中间件
  • 解析失败与连接超时的区分:先确认 DNS 是否正常,再怀疑网络与端口

验证与使用

验证与使用
kubectl exec -it web-1 -- cat /etc/resolv.conf   # 查看搜索域与 ndots
kubectl exec web-1 -- nslookup db.dev.svc.cluster.local
kubectl exec web-1 -- nslookup db.dev   # 两级名字,跨命名空间最省心的写法
# 应用配置里推荐写:db.dev 或 db.dev.svc.cluster.local
# 解析整体失败时先看解析组件是否正常
kubectl get pods -n kube-system -l k8s-app=kube-dns

写法与可解析范围

写法可解析范围使用建议
web仅同一命名空间同命名空间内的服务互调
web.dev跨命名空间应用配置的通用推荐写法
web.dev.svc.cluster.local集群内任意解析器需要排除搜索域干扰时使用
headless 服务名解析返回多个 Pod IPStatefulSet 点对点通信
ndots 配置影响解析次数与延迟:默认 ndots:5 时短名会先按搜索域逐级拼接尝试,最后才回退为绝对域名,因此跨命名空间一律写两级名字最省心也最快。
给 Service 改名或被重建不算零停机迁移:旧名字的解析记录立即失效,所有按旧名配置的调用方会同时报错;改名要按新旧名字先并存、再逐步切换的步骤推进。

易错点

  • 短名跨命名空间调用,解析失败报名字无法解析,排查时容易误判为网络问题
  • 把 Service 改名当作零停机迁移:老名字 DNS 立即失效,调用方同时报错
  • 应用把服务名解析结果缓存或长连接池不重建,Service 重建后仍连旧地址
  • 解析组件整体故障时全集群解析失败,业务大面积超时,单看某个服务日志会误判为应用缺陷

数据来源与参考

  • Kubernetes Docs:DNS for Services and Pods

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌