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 问题的核心技能。
2.4 数据流各阶段详解
- Pod 发起查询:Pod 内
/etc/resolv.conf配置nameserver指向 CoreDNS Service 的 Cluster IP(默认10.96.0.10),search域包含<namespace>.svc.cluster.local等。 - Service 负载均衡:kube-proxy 通过 iptables 或 IPVS 规则将 Cluster IP 转发到某个健康的 CoreDNS Pod(随机或轮询)。
- CoreDNS 插件链处理:
- kubernetes 插件:匹配
cluster.local后缀,查询 Service/Pod 记录;若匹配则直接返回,否则fallthrough到下一插件。 - cache 插件:检查缓存中是否有有效记录,命中则直接返回,减少上游查询。
- forward 插件:对于非集群域名(如
baidu.com),转发到上游 DNS(如/etc/resolv.conf或指定的8.8.8.8)。
- kubernetes 插件:匹配
- 上游递归解析:上游 DNS 完成递归查询,返回 A/AAAA 记录。
- 响应回传:CoreDNS 将结果(可能经缓存)沿原路径返回给 Pod。
故障排查切入点: 数据流中每一跳都可能成为瓶颈。例如:
• Pod → Service:检查 Pod 的
• Service → CoreDNS:检查 kube-proxy 规则是否正常,CoreDNS Service 的 Endpoint 是否就绪。
• CoreDNS 内部:检查插件链顺序、缓存命中率、
• CoreDNS → 上游:检查上游 DNS 可达性、
• 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。此顺序确保日志记录、错误捕获、集群解析、缓存加速、负载均衡、上游转发和调试信息完整覆盖。