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 可以轻松扩展功能。常见的插件包括:
| 插件名称 | 功能 | 证书轮换相关 |
|---|---|---|
| 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。三者之间的关系如下:
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 中的顺序组成处理链。插件的执行顺序至关重要:
- 查询到达:CoreDNS 接收 DNS 查询。
- 匹配 Zone:根据查询域名匹配 Corefile 中定义的 Zone。
- 执行插件链:按顺序执行 Zone 内定义的插件。
- 返回响应:插件链处理完成后返回 DNS 响应。
证书轮换故障场景:当
kubernetes 插件尝试与 API Server 通信时,如果 ServiceAccount 令牌正在轮换,可能导致 TLS 握手失败。此时插件会返回 SERVFAIL,并触发 forward 插件的备选逻辑(如果配置了备选上游)。理解插件链的执行顺序,有助于快速定位故障点。