集群 DNS 是什么
集群 DNS 是 Kubernetes 内部的服务发现机制:为每个服务分配可解析的域名,为无头服务下的每个实例分配独立的域名,也能按地址格式反查 Pod。集群里所有 Pod 的解析请求默认都指向它,因此服务之间通过名字互相访问成为常态,不需要把地址写进配置。
短名为什么有时能用
Pod 的解析配置里带有一串搜索域,写短名时会按顺序自动补全:先补当前命名空间,再补服务域的上级,最后才用节点上的搜索域。所以同一个名字在不同命名空间里可能解析到不同服务,跨命名空间访问必须写完整的「服务名.命名空间」。理解这个补全顺序,才能解释「明明有服务却解析不到」。
基本信息
| 适用环境 | 任何 Kubernetes 发行版,默认由集群 DNS 组件提供 |
|---|---|
| 默认域名 | cluster.local,可在集群初始化时配置 |
| 解析对象 | 服务、无头服务的实例、按地址格式表示的 Pod |
| 客户端配置 | Pod 的解析文件由 kubelet 写入,含搜索域与上游服务器 |
| 依赖组件 | 集群 DNS 组件本身以工作负载形式运行,也需要健康检查 |
| 权限要求 | 普通 Pod 即可发起解析,无需额外权限 |
典型使用场景
- 服务互访:应用配置里只写服务名,Pod 重建后不用改配置
- 跨命名空间调用:用「服务名.命名空间」写法明确指向目标
- 有状态服务寻址:通过无头服务拿到某个具体实例的地址
- 按地址反查 Pod:用地址格式域名定位某个地址属于哪个 Pod
- 排查解析问题:在容器内验证解析结果,区分是 DNS 还是网络问题
- 控制解析行为:通过 Pod 的解析策略调整短名补全或直接使用上游域名
记录形式
| 名称形式 | 解析结果 | 用途 |
|---|---|---|
| 服务名.命名空间.svc.cluster.local | 服务的虚拟地址 | 跨命名空间访问服务的完整写法 |
| 服务名(同命名空间) | 服务的虚拟地址 | 靠搜索域补全的短名写法 |
| 实例名.无头服务名.命名空间.svc.cluster.local | 该实例的 Pod 地址 | 有状态服务定位单个成员 |
| 按地址格式的 Pod 域名 | Pod 地址 | 由地址反查归属的 Pod |
验证命令
验证命令
kubectl exec -it web-x -- nslookup kubernetes.default # 基础连通性
kubectl exec -it web-x -- nslookup web.prod # 跨命名空间解析
kubectl exec -it web-x -- nslookup db-1.db-headless.prod # 实例级解析
kubectl exec -it web-x -- cat /etc/resolv.conf # 看搜索域与上游
kubectl -n kube-system get pods -l k8s-app=kube-dns # DNS 组件是否就绪
kubectl -n kube-system logs -l k8s-app=kube-dns --tail=50 # DNS 组件日志解析失败时的排查顺序
- 先在目标 Pod 内确认解析文件里的上游地址与搜索域是否符合预期
- 确认集群 DNS 组件本身是否处于就绪状态,组件挂掉时全局解析都会失败
- 确认目标服务是否存在、是否在预期命名空间、端点是否为空
- 检查网络策略是否放行了解析请求,策略生效的集群里 DNS 流量也需要显式放行
短名只能解析当前命名空间里的服务,跨命名空间必须写「服务名.命名空间」,这是排查时最容易踩的一处。
完整域名结尾带点可以跳过搜索域补全,减少无效解析尝试,在高频调用路径上有实际收益。
集群 DNS 组件也是普通工作负载,它自己的副本数、资源请求与探针配置同样会影响解析稳定性。