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 列表。
CoreDNS 插件链架构 CoreDNS 插件链架构 DNS 查询 kubernetes forward cache 响应 插件链说明: • kubernetes 插件:处理集群内部域名(如 my-svc.ns.svc.cluster.local),返回 ClusterIP。 • forward 插件:将外部域名(如 www.example.com)转发到上游 DNS 服务器。 • cache 插件:缓存 DNS 响应,减少上游查询压力,提升响应速度。
关键配置示例(Corefile):
.: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
Pod DNS 解析流程 Pod DNS 解析流程 Pod (resolv.conf) kube-proxy (DNAT) CoreDNS Pod DNS 响应 返回解析结果 关键路径说明: • Pod 的 /etc/resolv.conf 中 nameserver 指向 kube-dns Service 的 ClusterIP。 • kube-proxy 通过 iptables 或 IPVS 规则将 ClusterIP 请求 DNAT 到 CoreDNS Pod 的 Pod IP。 • CoreDNS 处理完成后,响应沿原路径返回,kube-proxy 做反向 SNAT。 • 故障点:kube-proxy 规则错误、CoreDNS Pod 不可用、网络策略阻断。

2.3 Service 发现原理

Kubernetes 中的 Service 发现依赖 DNS 记录。CoreDNS 的 kubernetes 插件自动为每个 Service 和 Pod 生成 DNS 记录,格式遵循 <service>.<namespace>.svc.cluster.local。

DNS 记录类型:
  • 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 故障的常见场景及其根因。