3. CoreDNS 在 K8s 中的部署模式:Deployment vs DaemonSet、kube-dns 兼容模式、ClusterIP 服务发现
CoreDNS 作为 Kubernetes 集群的默认 DNS 组件,其部署模式直接影响 DNS 解析的延迟、吞吐量以及集群的故障域。本章深入剖析三种核心部署模式:Deployment、DaemonSet 以及 kube-dns 兼容模式,并解析 ClusterIP 服务发现机制如何与这些模式协同工作。
3.1 Deployment 模式:高可用与资源隔离
Deployment 是 CoreDNS 最常用的部署模式,也是 kubeadm 等工具默认的部署方式。它通过 ReplicaSet 管理多个 Pod 副本,并利用 ClusterIP Service 提供统一的访问入口。
3.1.1 架构与流量路径
在 Deployment 模式下,所有 Pod 的 DNS 查询请求通过 kubelet 配置的 --cluster-dns 参数指向 CoreDNS 的 ClusterIP。请求经过 iptables/IPVS 规则转发到后端的 CoreDNS Pod。
3.1.2 优缺点分析
| 维度 | 说明 |
|---|---|
| 优点 |
|
| 缺点 |
|
3.2 DaemonSet 模式:节点级 DNS 缓存
DaemonSet 模式在每个节点上运行一个 CoreDNS Pod,作为该节点的本地 DNS 缓存。这种模式在大型集群或对 DNS 延迟敏感的场景中具有显著优势。
3.2.1 架构与流量路径
DaemonSet 模式下,每个节点上的 CoreDNS Pod 监听本节点的 nodeIP 或使用 hostNetwork: true 直接绑定节点端口。客户端 Pod 的 DNS 查询通过 kubelet 配置的 --cluster-dns 指向本节点的 CoreDNS 实例,实现“本地优先”解析。
3.2.2 优缺点分析
| 维度 | 说明 |
|---|---|
| 优点 |
|
| 缺点 |
|
3.3 Deployment 与 DaemonSet 对比
| 对比维度 | Deployment 模式 | DaemonSet 模式 |
|---|---|---|
| Pod 分布 | 部分节点,副本数固定 | 每个节点一个 Pod |
| DNS 查询延迟 | 可能跨节点,延迟较高 | 节点内完成,延迟极低 |
| 资源消耗 | 较低,与副本数相关 | 较高,与节点数线性相关 |
| 故障域 | 节点故障影响部分副本 | 节点故障仅影响本节点 |
| 伸缩性 | 手动或 HPA 调整副本数 | 随节点自动伸缩 |
| 升级策略 | 滚动更新,影响面小 | 逐个节点升级,耗时较长 |
| 适用集群规模 | 中小型集群(< 100 节点) | 大型集群(> 100 节点) |
3.4 kube-dns 兼容模式
Kubernetes 1.11 版本之前,集群默认使用 kube-dns 作为 DNS 组件。为了平滑迁移,CoreDNS 提供了 kube-dns 兼容模式,允许 CoreDNS 完全替代 kube-dns 而无需修改客户端配置。
3.4.1 兼容模式的核心机制
- Service 名称与端口: CoreDNS 仍然使用名为
kube-dns的 Service,监听 UDP/TCP 53 端口,与 kube-dns 完全一致。 - ConfigMap 兼容: CoreDNS 可以读取 kube-dns 的 ConfigMap 格式(
stubDomains、upstreamNameservers等),并自动转换为 CoreDNS 的 Corefile 配置。 - 指标接口: CoreDNS 暴露与 kube-dns 兼容的 Prometheus 指标(如
kubedns_kubedns_dns_response_size_bytes),方便监控系统无缝切换。
dnsmasq 缓存功能在 CoreDNS 中由 cache 插件替代,配置方式不同。建议在迁移后使用 CoreDNS 原生配置以获得最佳性能。
3.4.2 兼容模式配置示例
以下是一个兼容模式的 CoreDNS Corefile 配置,它模拟了 kube-dns 的行为:
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
3.5 ClusterIP 服务发现机制
无论采用 Deployment 还是 DaemonSet 模式,CoreDNS 都通过 ClusterIP Service 对外暴露服务。ClusterIP 是 Kubernetes 服务发现的基石,其工作机制直接影响 DNS 查询的效率和可靠性。
3.5.1 ClusterIP 的工作原理
- 虚拟 IP 分配: 创建 Service 时,Kubernetes 从集群的 Service CIDR 中分配一个虚拟 IP(ClusterIP)。
- DNS 记录注册: CoreDNS 自动为 Service 创建 A/AAAA 记录,格式为
<service>.<namespace>.svc.cluster.local。 - 流量转发: kube-proxy 在节点上创建 iptables 或 IPVS 规则,将发往 ClusterIP 的流量转发到后端的 Pod。
- 负载均衡: iptables/IPVS 规则实现轮询(Random)或最小连接数(Least Connection)等负载均衡策略。
3.5.2 ClusterIP 与 CoreDNS 的交互
| 组件 | 角色 | 关键参数 |
|---|---|---|
| kubelet | 配置 Pod 的 DNS 解析器 | --cluster-dns=10.96.0.10(CoreDNS Service 的 ClusterIP) |
| CoreDNS Service | 提供稳定的 DNS 访问入口 | ClusterIP: 10.96.0.10, Port: 53 (UDP/TCP) |
| kube-proxy | 实现 ClusterIP 到 Pod IP 的转发 | iptables 模式:随机转发;IPVS 模式:支持更多调度算法 |
| CoreDNS Pod | 处理 DNS 查询请求 | 监听 53 端口,响应 DNS 查询 |
3.5.3 ClusterIP 模式下的性能考量
- 连接跟踪(conntrack): iptables 模式依赖 conntrack 维护连接状态,高并发场景下可能成为瓶颈。IPVS 模式无需 conntrack,性能更优。
- 服务端口的冲突: 如果 CoreDNS Service 的端口与节点上的其他服务冲突,可能导致 DNS 查询失败。建议使用标准端口 53。
- DNS 查询超时: 当后端 CoreDNS Pod 不可用时,iptables/IPVS 规则会将请求转发到其他 Pod,但可能引入额外的超时时间。建议配置
lameduck机制优雅移除不健康的 Pod。
ready 插件和 health 插件,确保 kube-proxy 能够及时感知后端 Pod 的健康状态。