集群内服务 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 IP | StatefulSet 点对点通信 |
ndots 配置影响解析次数与延迟:默认 ndots:5 时短名会先按搜索域逐级拼接尝试,最后才回退为绝对域名,因此跨命名空间一律写两级名字最省心也最快。
给 Service 改名或被重建不算零停机迁移:旧名字的解析记录立即失效,所有按旧名配置的调用方会同时报错;改名要按新旧名字先并存、再逐步切换的步骤推进。