2. CoreDNS 架构解析:核心组件、插件机制与数据流路径

CoreDNS 是 Kubernetes 集群默认的 DNS 解析组件,采用 插件链(Plugin Chain) 架构。理解其内部组件、插件加载顺序以及 Pod → Service → CoreDNS → 上游 DNS 的完整数据流,是定位 DNS 故障的基础。

2.1 核心组件与进程模型

CoreDNS 以单进程、多插件的方式运行,不依赖外部守护进程。其核心组件包括:

组件 说明 关键参数
Corefile 主配置文件,定义插件链、监听端口、上游 DNS 地址 .:53 { ... }
插件注册器 启动时按 Corefile 顺序注册并初始化插件实例 每个插件实现 Setup 函数
DNS 请求处理器 接收 DNS 查询,按插件链顺序依次调用 每个插件实现 ServeDNS 方法
缓存模块 内置 cache 插件,减少上游查询压力 cache 30(TTL 秒)
健康检查端点 提供 /health 和 /ready 接口 Kubernetes liveness/readiness probe
关键认知: CoreDNS 的 单进程模型 意味着所有插件共享同一地址空间,插件链中任一插件的阻塞或 panic 都会影响整个实例。生产环境建议配置 reload 插件实现热更新,避免重启导致 DNS 中断。

2.2 插件机制与链式执行

CoreDNS 的插件机制是其灵活性的核心。每个插件是一个独立的 DNS 中间件,按 Corefile 中声明的顺序组成 插件链。请求从链首进入,依次经过每个插件,直到某个插件生成响应或显式终止链。

2.2.1 插件分类

类别 代表插件 职责
查询处理 kubernetes、forward、hosts 解析集群内 Service/Pod 名称、转发外部查询、本地 hosts 匹配
安全与过滤 acl、whoami 访问控制、查询来源识别
运维与调试 log、errors、metrics 日志记录、错误捕获、Prometheus 指标暴露
缓存与性能 cache、loadbalance 响应缓存、DNS 记录轮询

2.2.2 典型 Corefile 插件链示例

.:53 {
    # 1. 日志记录(最先执行)
    log . { class denial error }
    # 2. 错误捕获
    errors
    # 3. 健康检查
    health
    # 4. 集群内 DNS 解析
    kubernetes cluster.local in-addr.arpa ip6.arpa {
        pods verified
        fallthrough in-addr.arpa ip6.arpa
    }
    # 5. 缓存(TTL 30 秒)
    cache 30
    # 6. 负载均衡(随机返回 A 记录)
    loadbalance round_robin
    # 7. 上游转发(最后执行)
    forward . /etc/resolv.conf {
        max_concurrent 1000
    }
    # 8. 查询来源识别
    whoami
}
常见陷阱: 插件顺序至关重要。kubernetes 插件必须在 forward 之前,否则集群内部域名会被错误转发到上游 DNS。同时,cache 应放在 kubernetes 之后,避免缓存未验证的 Pod 记录。

2.3 数据流路径:Pod → Service → CoreDNS → 上游 DNS

当集群内 Pod 发起 DNS 查询时,数据流经过以下完整路径。理解每一跳的组件和潜在故障点,是排查 DNS 问题的核心技能。

CoreDNS 数据流路径:Pod → Service → CoreDNS → 上游 DNS Pod 容器内 /etc/resolv.conf Service (Cluster IP) kube-proxy iptables/IPVS CoreDNS Pod 插件链处理 上游 DNS 外部递归解析 响应返回 Pod 缓存 / 直接响应 ① DNS 查询 ② 负载均衡 插件链处理 ③ 非集群域名 ④ 递归应答 ⑤ 响应回 Pod 📌 数据流关键点: • Pod 的 resolv.conf 指向 Service Cluster IP(如 10.96.0.10) • kube-proxy 将 Cluster IP 转发到 CoreDNS Pod 的 53 端口 • CoreDNS 插件链按序处理:kubernetes → cache → forward

2.4 数据流各阶段详解

  1. Pod 发起查询:Pod 内 /etc/resolv.conf 配置 nameserver 指向 CoreDNS Service 的 Cluster IP(默认 10.96.0.10),search 域包含 <namespace>.svc.cluster.local 等。
  2. Service 负载均衡:kube-proxy 通过 iptables 或 IPVS 规则将 Cluster IP 转发到某个健康的 CoreDNS Pod(随机或轮询)。
  3. CoreDNS 插件链处理:
    • kubernetes 插件:匹配 cluster.local 后缀,查询 Service/Pod 记录;若匹配则直接返回,否则 fallthrough 到下一插件。
    • cache 插件:检查缓存中是否有有效记录,命中则直接返回,减少上游查询。
    • forward 插件:对于非集群域名(如 baidu.com),转发到上游 DNS(如 /etc/resolv.conf 或指定的 8.8.8.8)。
  4. 上游递归解析:上游 DNS 完成递归查询,返回 A/AAAA 记录。
  5. 响应回传:CoreDNS 将结果(可能经缓存)沿原路径返回给 Pod。
故障排查切入点: 数据流中每一跳都可能成为瓶颈。例如:
• Pod → Service:检查 Pod 的 /etc/resolv.conf 是否正确指向 Cluster IP。
• Service → CoreDNS:检查 kube-proxy 规则是否正常,CoreDNS Service 的 Endpoint 是否就绪。
• CoreDNS 内部:检查插件链顺序、缓存命中率、forward 超时配置。
• CoreDNS → 上游:检查上游 DNS 可达性、max_concurrent 是否被耗尽。

2.5 插件链执行顺序与故障影响

插件链的执行顺序直接影响 DNS 解析结果。以下表格列出常见顺序错误及其后果:

错误顺序 实际后果 典型症状
forward 在 kubernetes 之前 集群内部域名被转发到上游 DNS,上游无法解析 cluster.local Service 域名解析失败,NXDOMAIN
cache 在 kubernetes 之前 缓存未命中时仍会查询 kubernetes 插件,但缓存可能返回过期记录 Pod IP 变更后,旧 IP 仍被缓存返回
whoami 在 forward 之后 whoami 插件无法捕获转发后的查询来源 调试日志中缺少客户端 IP 信息
缺少 errors 插件 上游 DNS 超时或格式错误时无日志输出 DNS 超时但 CoreDNS 日志无记录
最佳实践: 生产环境 Corefile 的插件链推荐顺序为:log → errors → health → kubernetes → cache → loadbalance → forward → whoami。此顺序确保日志记录、错误捕获、集群解析、缓存加速、负载均衡、上游转发和调试信息完整覆盖。