3. Kubernetes 集群 DNS 架构:CoreDNS 部署模式、Pod DNS 策略与 Service/Endpoint 映射
在 Kubernetes 集群中,DNS 是服务发现与外部域名解析的核心基础设施。理解 CoreDNS 的部署模式、Pod 的 DNS 策略以及 Service 与 Endpoint 的映射关系,是排查证书轮换引发解析失败的前提。本章从这三个维度拆解集群 DNS 架构。
3.1 CoreDNS 部署模式
Kubernetes 1.13+ 默认使用 CoreDNS 作为集群 DNS 组件,替代了早期的 kube-dns。CoreDNS 以 Deployment 形式运行,通常部署 2 个副本以保证高可用,并通过 ClusterIP Service 暴露 DNS 解析入口。
关键部署特征:
- Pod 数量: 通常 2 副本,可通过 HPA 自动扩缩。
- 监听端口: UDP/TCP 53(DNS 协议),以及 9153(Prometheus 指标)。
- 配置方式: 通过 ConfigMap
coredns动态加载 Corefile 配置。 - 网络模式: 使用 hostNetwork: false,通过 ClusterIP 暴露。
CoreDNS 采用插件化架构,核心插件包括:
| 插件名称 | 功能说明 | 排错关注点 |
|---|---|---|
| kubernetes | 将 Service 名称解析为 ClusterIP | 检查 zone 配置是否匹配集群域名(如 cluster.local) |
| forward | 将外部域名请求转发至上游 DNS 服务器 | 证书轮换后,上游 DNS 的 TLS 证书是否受信任 |
| cache | 缓存 DNS 查询结果,减少上游压力 | 缓存过期时间(TTL)可能导致解析延迟 |
| loop | 检测并防止 DNS 解析环路 | 配置错误时可能导致解析超时 |
| health | 提供健康检查端点(:8080/health) | Pod 状态正常但插件异常时可能误判 |
排错提示: 证书轮换场景下,重点关注
forward 插件的 tls 配置段。如果上游 DNS 更换了证书,但 CoreDNS 的 Corefile 中未更新 CA 证书或未配置 tls_servername,会导致外部域名解析失败。
3.2 Pod DNS 策略
每个 Pod 可以通过 dnsPolicy 字段控制 DNS 解析行为。Kubernetes 支持四种策略,理解其差异对排错至关重要:
| 策略名称 | 行为描述 | 典型场景 | 证书轮换影响 |
|---|---|---|---|
| Default | Pod 继承所在节点的 /etc/resolv.conf | 需要直接使用宿主机 DNS 配置 | 不受集群 DNS 证书影响,但可能绕过集群解析 |
| ClusterFirst | 优先使用集群 DNS(CoreDNS),外部域名通过 forward 转发 | 默认策略,绝大多数工作负载 | 直接受影响:forward 插件 TLS 握手失败导致解析中断 |
| ClusterFirstWithHostNet | Pod 使用 hostNetwork 时,仍保留 ClusterFirst 行为 | 网络插件 DaemonSet 等 | 同 ClusterFirst,但需额外检查 hostNetwork 冲突 |
| None | 完全忽略集群 DNS,使用 dnsConfig 自定义配置 | 需要完全自定义 DNS 解析路径 | 不受集群 DNS 影响,但需确保自定义配置正确 |
排错陷阱: 证书轮换后,如果 Pod 使用
ClusterFirst 策略,但 CoreDNS 的 forward 插件未更新上游 DNS 证书,Pod 解析外部域名会失败。此时使用 Default 策略的 Pod 可能不受影响,造成“部分 Pod 正常、部分 Pod 异常”的假象。
3.3 Service 与 Endpoint 的 DNS 映射
Kubernetes 中,Service 的 DNS 解析最终映射到后端 Pod 的 Endpoint。理解这一映射关系有助于定位“服务解析正常但访问失败”的问题。
3.3.1 映射流程
- Service 创建: 分配 ClusterIP,并创建对应的 DNS A/AAAA 记录(格式:
<service>.<namespace>.svc.cluster.local)。 - Endpoint 自动生成: 根据 Service 的 Selector 匹配 Pod,生成 Endpoint 对象,记录所有后端 Pod IP。
- CoreDNS 响应: 当查询 Service 名称时,CoreDNS 返回 ClusterIP;当查询
headless service时,返回 Endpoint 列表(Pod IP)。
关键区别:
- 普通 Service: DNS 返回 ClusterIP,由 kube-proxy 转发到后端 Pod。
- Headless Service(clusterIP: None): DNS 直接返回所有就绪 Pod 的 IP 列表,客户端自行负载均衡。
3.4 架构总结与排错切入点
| 架构层级 | 组件 | 证书轮换影响点 | 排错命令 |
|---|---|---|---|
| Pod 层 | dnsPolicy / dnsConfig | ClusterFirst 策略使 Pod 依赖 CoreDNS | kubectl exec <pod> -- cat /etc/resolv.conf |
| Service 层 | kube-dns Service | ClusterIP 不变,但后端 CoreDNS Pod 可能异常 | kubectl get svc -n kube-system kube-dns |
| CoreDNS 层 | CoreDNS Pod + Corefile | forward 插件 TLS 证书配置 | kubectl logs -n kube-system coredns-xxx |
| 上游 DNS 层 | 外部 DNS 服务器 | 证书更换后,CoreDNS 未更新信任链 | dig @<upstream> example.com |
排错黄金命令: 在 Pod 内执行
nslookup kubernetes.default.svc.cluster.local 验证集群内部解析;执行 nslookup example.com 验证外部解析。如果内部正常、外部失败,问题大概率在 CoreDNS 的 forward 插件或上游 DNS 证书。