2. CoreDNS 架构基础:CoreDNS 在 Kubernetes 中的角色、插件化架构、核心组件

在 Kubernetes 集群中,CoreDNS 是默认的集群 DNS 组件,负责将 Service 名称解析为 Cluster IP。理解其架构是排查 DNS 故障(如证书轮换引发的解析超时)的前提。本节从角色定位、插件化架构和核心组件三个维度展开。

2.1 CoreDNS 在 Kubernetes 中的角色

CoreDNS 以 Deployment 形式运行在 kube-system 命名空间,通常由两个 Pod 构成高可用副本。它监听在 53 端口(UDP/TCP),为集群内的 Pod 提供域名解析服务。其核心职责包括:

  • Service 发现:将 my-svc.my-ns.svc.cluster.local 解析为对应的 Cluster IP。
  • Pod 解析:支持 pod-ip.my-ns.pod.cluster.local 格式的反向解析。
  • 外部域名转发:对集群外的域名(如 www.example.com)转发给上游 DNS 服务器。
  • 存根域与联邦:通过插件支持自定义域名映射和跨集群解析。
关键指标:CoreDNS 的解析性能直接影响 Pod 启动速度和 Service 间通信。证书轮换导致的解析超时,通常表现为 dial tcp: lookup xxx on 10.96.0.10:53: read udp: i/o timeout。

2.2 插件化架构

CoreDNS 采用链式插件架构,所有功能(包括 DNS 解析、缓存、转发、日志、指标)均由插件实现。插件按顺序组成处理链,每个插件可以决定是否将请求传递给下一个插件。

CoreDNS 插件链处理流程 CoreDNS 插件链处理流程 DNS 查询 whoami 身份标识 health 健康检查 kubernetes 集群 DNS forward 转发上游 cache 缓存 响应 说明: • 插件按 Corefile 中定义的顺序依次执行。 • 每个插件可以决定是否将请求传递给下一个插件(如 kubernetes 插件匹配到集群域名后直接返回)。 • 证书轮换故障通常发生在 kubernetes 插件与 API Server 通信阶段,或 forward 插件与上游 DNS 的 TLS 握手阶段。

插件链的灵活性使得 CoreDNS 可以轻松扩展功能。常见的插件包括:

插件名称 功能 证书轮换相关
kubernetes 读取 Kubernetes Service 和 Pod 记录,返回 A/AAAA/SRV 记录 与 API Server 通信使用 TLS 证书,证书过期会导致解析失败
forward 将未匹配的查询转发到上游 DNS 服务器 支持 TLS 加密转发,证书轮换期间可能握手超时
cache 缓存 DNS 响应,减少上游查询压力 缓存过期策略可能掩盖临时故障,但也会延长故障恢复时间
health 提供 HTTP 健康检查端点(默认 :8080/health) 证书问题可能导致 Pod 健康检查失败,触发重启
log 记录 DNS 查询日志 排查证书轮换故障时,日志是首要分析入口
errors 收集并输出错误日志 直接暴露证书验证失败等错误信息

2.3 核心组件

CoreDNS 的配置和行为由三个核心组件定义:Corefile、Zone 和 Plugin。三者之间的关系如下:

CoreDNS 核心组件关系 CoreDNS 核心组件关系 Corefile 主配置文件 Zone 域名区域定义 Plugin 插件处理链 配置示例 .:53 { kubernetes cluster.local forward . 8.8.8.8 cache 30 health log errors } Corefile 定义 Zone, Zone 内配置 Plugin 链。

2.3.1 Corefile

Corefile 是 CoreDNS 的配置文件,语法类似 Caddyfile。它定义了服务器监听的端口、管理的域名区域(Zone)以及每个区域使用的插件链。一个典型的 Corefile 结构如下:

.:53 {                          # 监听 53 端口,处理所有域名
    kubernetes cluster.local {  # 插件:kubernetes,管理 cluster.local 区域
        pods verified
        endpoint_pod_names
        ttl 30
    }
    forward . 8.8.8.8:53 {      # 插件:forward,转发未匹配域名
        max_concurrent 1000
    }
    cache 30                    # 插件:cache,缓存 30 秒
    health                      # 插件:health,健康检查
    log                         # 插件:log,记录日志
    errors                      # 插件:errors,错误输出
}
排查要点:证书轮换故障时,首先检查 Corefile 中 kubernetes 插件是否配置了 kubeconfig 或 tls 参数。如果使用默认配置,CoreDNS 会使用 Pod 内的 ServiceAccount 令牌与 API Server 通信,令牌轮换可能导致连接中断。

2.3.2 Zone

Zone 定义了 CoreDNS 负责解析的域名空间。在 Kubernetes 场景下,默认 Zone 是 cluster.local。Zone 的配置决定了 CoreDNS 如何处理特定域名的查询请求。常见的 Zone 类型包括:

  • 权威 Zone:CoreDNS 直接提供解析记录(如 cluster.local)。
  • 转发 Zone:将查询转发给上游 DNS 服务器(如 . 表示根域转发)。
  • 存根 Zone:将特定子域转发给指定的 DNS 服务器(如 company.local 转发到内部 DNS)。

2.3.3 Plugin

Plugin 是 CoreDNS 的功能单元。每个插件实现一个特定的 DNS 处理逻辑,并通过 Corefile 中的顺序组成处理链。插件的执行顺序至关重要:

  1. 查询到达:CoreDNS 接收 DNS 查询。
  2. 匹配 Zone:根据查询域名匹配 Corefile 中定义的 Zone。
  3. 执行插件链:按顺序执行 Zone 内定义的插件。
  4. 返回响应:插件链处理完成后返回 DNS 响应。
证书轮换故障场景:当 kubernetes 插件尝试与 API Server 通信时,如果 ServiceAccount 令牌正在轮换,可能导致 TLS 握手失败。此时插件会返回 SERVFAIL,并触发 forward 插件的备选逻辑(如果配置了备选上游)。理解插件链的执行顺序,有助于快速定位故障点。