2. CoreDNS 架构解析:插件化架构、核心插件与请求生命周期
CoreDNS 是 CNCF 毕业项目,采用 插件链(Plugin Chain) 架构,所有 DNS 功能均由插件按序组合完成。理解其内部数据流与核心插件机制,是治理容器网络 DNS 的基础。
2.1 插件化架构与核心设计
CoreDNS 摒弃了传统 DNS 服务器的模块堆叠模式,将每个功能(如记录查询、转发、缓存、健康检查)封装为独立插件。服务启动时通过 Corefile 定义插件链,请求按链式顺序依次经过每个插件处理。
| 设计维度 | 说明 |
|---|---|
| 插件注册 | 每个插件实现 plugin.Handler 接口,在 init() 中注册到全局插件树 |
| 链式执行 | 请求从链首插件进入,每个插件可选择处理、转发或拒绝,最终由 NextOrFailure 决定是否传递 |
| Corefile 驱动 | 配置文件中的块顺序即插件链顺序,kubernetes、forward 等按声明次序串联 |
| 生命周期 | 插件可注册 OnStartup / OnShutdown 钩子,用于预热缓存或清理连接 |
运维要点: 插件顺序决定 DNS 查询路径。例如
kubernetes 放在 forward 之前,集群内域名优先由 k8s 插件解析,避免泄漏到外部 DNS。
2.2 核心插件详解
以下五个插件构成 Kubernetes 场景下 CoreDNS 的骨干能力:
| 插件名 | 功能定位 | 典型配置片段 | 运维关注点 |
|---|---|---|---|
| kubernetes | 将 Service/Pod 名称解析为 Cluster IP | kubernetes cluster.local in-addr.arpa ip6.arpa |
需配置 pods verified 避免 Pod 记录泄露;fallthrough 控制未命中时是否传递 |
| forward | 将未匹配的查询转发至外部 DNS 服务器 | forward . 8.8.8.8 1.1.1.1 |
支持 max_concurrent 限制并发;prefer_udp 控制传输协议;健康检查间隔可调 |
| hosts | 基于本地 hosts 文件或内嵌记录提供解析 | hosts /etc/coredns/custom.hosts |
常用于注入节点级静态记录;文件变更需 reload 或 SIGHUP |
| cache | 对 DNS 响应进行 TTL 缓存,降低上游压力 | cache 30 |
默认缓存 30s;prefetch 可提前刷新热点记录;注意负缓存对故障切换的影响 |
| loop | 检测 DNS 解析环路,自动终止异常链 | loop |
必须放在链尾;检测到环路时记录日志并退出进程,防止递归风暴 |
配置漂移风险:
kubernetes 插件的 fallthrough 行为、cache 的 TTL 值、forward 的上游列表,是蓝绿发布和灰度场景中最易被误改的参数。建议将 Corefile 纳入 GitOps 审计。
2.3 数据流与请求生命周期
一个完整的 DNS 请求在 CoreDNS 内部经历以下阶段:
- 网络接收: CoreDNS 监听 UDP/TCP 53 端口,解析请求报文,提取查询名称、类型(A/AAAA/SRV 等)和客户端 IP。
- 插件链入口: 请求进入 Corefile 定义的第一个插件。常见链首为
kubernetes或hosts。 - 匹配与处理: 每个插件检查查询是否属于自身管辖的域名空间。例如
kubernetes仅处理cluster.local后缀的查询。 - 命中返回: 若插件命中记录,直接构造 DNS 响应报文,沿链反向返回给客户端,不再执行后续插件。
- 未命中传递: 若插件未命中(如
kubernetes遇到外部域名),调用NextOrFailure将请求传递给链中下一个插件。 - 缓存查询:
cache插件在收到上游响应后,按 TTL 缓存记录;后续相同查询直接返回缓存,跳过上游。 - 转发与递归:
forward插件将请求发送至配置的上游 DNS 服务器,等待响应后返回给调用方。 - 环路检测:
loop插件通过发送特殊查询并检测是否回环,确保链尾不会形成递归。 - 响应返回: 最终响应沿插件链反向路径返回,经过
cache写入缓存后,由网络层发送给客户端。
2.4 典型 Corefile 示例
以下配置展示了 Kubernetes 场景下标准插件链的声明方式:
.:53 {
# 启用日志与错误记录
log
errors
# 集群内域名解析
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods verified
fallthrough in-addr.arpa ip6.arpa
}
# 静态 hosts 记录
hosts /etc/coredns/custom.hosts {
fallthrough
}
# 缓存 30 秒,热点记录提前刷新
cache 30 {
prefetch 3 30m 20%
}
# 转发至上游 DNS
forward . 8.8.8.8 1.1.1.1 {
max_concurrent 1000
}
# 环路检测(必须放在链尾)
loop
# 自动加载 Corefile 变更
reload
}
审计关键点: 上述配置中
fallthrough 的声明位置、cache 的 TTL 值、forward 的 max_concurrent 阈值,是配置漂移审计的高频检查项。建议在 CI/CD 中增加 Corefile 的 schema 校验步骤。