1. CoreDNS 概述:Kubernetes 集群的 DNS 中枢
1.1 CoreDNS 在 Kubernetes 中的角色
CoreDNS 是 Kubernetes 集群的默认 DNS 组件,自 v1.13 起取代 kube-dns。它作为集群内部的服务发现与域名解析引擎,为 Pod、Service、Node 等资源提供基于 DNS 的寻址能力。没有 CoreDNS,Pod 之间无法通过 Service 名称通信,集群的微服务架构将失去网络基础。
核心角色定义: CoreDNS 是一个由 CNCF 孵化的、模块化、可插拔的 DNS 服务器,在 Kubernetes 中作为集群 DNS 运行,监听 UDP/TCP 53 端口,处理集群内所有 DNS 查询。
1.2 核心功能:服务发现与 DNS 解析
CoreDNS 在 Kubernetes 中主要承担两大职责:
- 服务发现: 通过 Kubernetes 插件(kubernetes 插件)实时监听 API Server 中 Service 和 Pod 的变化,动态生成 DNS 记录。Pod 可以通过
<service-name>.<namespace>.svc.cluster.local格式访问其他 Service。 - DNS 解析: 处理集群内部域名(如
my-svc.default.svc.cluster.local)和外部域名(如www.example.com)的查询。内部查询由 kubernetes 插件直接响应;外部查询通过 forward 插件转发至上游 DNS 服务器(如 8.8.8.8)。
运维提示: CoreDNS 的 Pod 通常以 Deployment 形式运行,默认副本数为 2。生产环境中建议根据节点规模调整副本数,并配置 Pod 反亲和性,避免单点故障。
1.3 CoreDNS 与 kube-dns 的对比
kube-dns 是 Kubernetes 早期使用的 DNS 组件,由三个容器组成:kube-dns(主 DNS 服务)、dnsmasq(缓存与转发)、sidecar(健康检查与指标)。CoreDNS 将其整合为单一二进制,架构更简洁,性能与可扩展性更强。
| 对比维度 | kube-dns | CoreDNS |
|---|---|---|
| 架构 | 多容器(kube-dns + dnsmasq + sidecar) | 单二进制,插件化架构 |
| 配置方式 | 通过 ConfigMap 配置,格式为 stubDomains / upstreamNameservers |
通过 Corefile 配置,支持丰富的插件链 |
| 性能 | 依赖 dnsmasq 缓存,高并发下存在瓶颈 | 原生支持缓存(cache 插件),性能更高 |
| 可扩展性 | 有限,仅支持内置功能 | 强,支持 30+ 插件(如 prometheus、rewrite、hosts) |
| 协议支持 | 仅 DNS over UDP/TCP | 支持 DNS over UDP/TCP/TLS/gRPC |
| 维护状态 | 已弃用(Kubernetes v1.18+ 不再维护) | 活跃维护,CNCF 毕业项目 |
1.4 CoreDNS 在集群中的工作流程
下图展示了 CoreDNS 处理一次典型 DNS 查询的完整链路:
1.5 CoreDNS 插件架构
CoreDNS 的核心优势在于其插件化架构。每个插件负责一个独立功能,通过 Corefile 串联成处理链。下图展示了生产环境中常见的插件组合:
1.6 典型 Corefile 配置示例
以下是一个生产环境 CoreDNS 的 Corefile 配置,展示了插件链的串联方式:
.:53 {
# 健康检查端点
health {
lameduck 5s
}
# 指标暴露
prometheus :9153
# 集群内部 DNS 解析
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
# 缓存 30 秒
cache 30
# 转发外部域名
forward . /etc/resolv.conf {
max_concurrent 1000
}
# 记录查询日志(调试用)
log
# 自动加载配置
reload
}