2. Kubernetes DNS 基础:CoreDNS 架构、Pod DNS 解析流程、Service 发现原理
在 Kubernetes 集群中,DNS 是服务发现的核心基础设施。理解 CoreDNS 的架构、Pod 的 DNS 解析流程以及 Service 的发现原理,是诊断 DNS 故障、设计高可用控制平面的前提。本章从这三个维度展开,为后续的故障域隔离策略奠定理论基础。
2.1 CoreDNS 架构
CoreDNS 是 Kubernetes 1.13 及之后版本的默认 DNS 组件,以 Deployment 形式运行在 kube-system 命名空间中。它采用插件化架构,通过 Chain-of-Plugins 机制处理 DNS 查询。
- CoreDNS Pod:通常以 2 副本部署,每个 Pod 包含一个 coredns 容器。
- ConfigMap:
coredns,存储 CoreDNS 配置文件Corefile,定义插件链。 - Service:
kube-dns(ClusterIP),作为 DNS 查询入口。 - EndpointSlice:动态维护 CoreDNS Pod 的 IP 列表。
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
2.2 Pod DNS 解析流程
当 Pod 发起 DNS 查询时,解析过程遵循以下步骤。理解这一流程有助于定位 DNS 超时或解析失败的根本原因。
| 步骤 | 组件 | 动作 | 说明 |
|---|---|---|---|
| 1 | Pod 内 /etc/resolv.conf | 查询 nameserver | Pod 的 resolv.conf 指向 kube-dns Service 的 ClusterIP(如 10.96.0.10) |
| 2 | kube-proxy (iptables/IPVS) | DNAT 转发 | 将 ClusterIP 请求负载均衡到 CoreDNS Pod 的 Endpoint |
| 3 | CoreDNS Pod | 接收查询 | CoreDNS 监听 53 端口,接收 DNS 查询请求 |
| 4 | CoreDNS 插件链 | 处理查询 | 按 kubernetes → forward → cache 顺序处理 |
| 5 | CoreDNS Pod | 返回响应 | 将解析结果返回给 Pod |
2.3 Service 发现原理
Kubernetes 中的 Service 发现依赖 DNS 记录。CoreDNS 的 kubernetes 插件自动为每个 Service 和 Pod 生成 DNS 记录,格式遵循 <service>.<namespace>.svc.cluster.local。
- A/AAAA 记录:Service 的 ClusterIP(Headless Service 返回 Pod IP 列表)。
- SRV 记录:命名端口对应的端口号和域名。
- PTR 记录:反向 DNS 查询,从 IP 到域名。
| 查询域名 | 返回结果 | 示例 |
|---|---|---|
my-svc.my-ns.svc.cluster.local |
ClusterIP (10.96.1.1) | 普通 Service 发现 |
my-svc.my-ns.svc |
ClusterIP (10.96.1.1) | 省略 cluster.local 后缀 |
my-svc.my-ns |
ClusterIP (10.96.1.1) | 同命名空间可省略 svc |
my-headless-svc.my-ns.svc.cluster.local |
Pod IP 列表 | Headless Service 返回所有 Pod IP |
_http._tcp.my-svc.my-ns.svc.cluster.local |
SRV 记录 | 命名端口发现 |
- search 域配置:Pod 的 resolv.conf 包含 search 域(如
my-ns.svc.cluster.local svc.cluster.local cluster.local),短域名查询会依次尝试追加 search 域,可能导致查询延迟或错误匹配。 - Headless Service 的 DNS 行为:Headless Service(
clusterIP: None)不提供 ClusterIP,DNS 查询直接返回所有就绪 Pod 的 IP 列表,适用于 StatefulSet 等场景。 - ExternalName Service:返回 CNAME 记录,将集群内部域名映射到外部域名,不经过 CoreDNS 的 kubernetes 插件处理。
2.4 故障域视角下的 DNS 关键点
从故障域隔离的角度,DNS 组件(CoreDNS Pod、kube-dns Service、kube-proxy 规则)与控制平面组件(kube-apiserver、etcd)之间存在依赖关系。CoreDNS 的 kubernetes 插件需要访问 kube-apiserver 来获取 Service 和 Endpoint 信息。如果控制平面出现故障,CoreDNS 可能无法更新 DNS 记录,但已缓存的记录仍可正常响应。
- CoreDNS 副本分布:建议将 CoreDNS Pod 分布到不同节点或可用区,避免单点故障。
- kube-dns Service 的 ClusterIP:该 IP 在集群生命周期内固定,但 kube-proxy 规则依赖控制平面健康。
- 缓存策略:CoreDNS 的 cache 插件可以缓存 DNS 记录,在控制平面短暂不可用时仍能提供服务。
掌握 CoreDNS 的架构、Pod 的 DNS 解析流程以及 Service 的发现原理,是后续章节中设计 DNS 故障域隔离策略的基础。下一章将深入分析 DNS 故障的常见场景及其根因。