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 提供统一的访问入口。

核心特征: Deployment 模式下的 CoreDNS Pod 通常被调度到集群中的部分节点上,副本数建议为 2 或更多(通常为节点数的 1/10 到 1/5),以实现高可用和负载均衡。

3.1.1 架构与流量路径

在 Deployment 模式下,所有 Pod 的 DNS 查询请求通过 kubelet 配置的 --cluster-dns 参数指向 CoreDNS 的 ClusterIP。请求经过 iptables/IPVS 规则转发到后端的 CoreDNS Pod。

Deployment 模式:CoreDNS 流量路径 客户端 Pod kubelet 配置 cluster-dns: 10.96.0.10 ClusterIP Service kube-dns: 10.96.0.10 iptables / IPVS CoreDNS Pod-1 (10.1.1.1) CoreDNS Pod-2 (10.1.1.2) CoreDNS Pod-3 (10.1.1.3) 说明: 客户端 Pod 通过 kubelet 配置的 cluster-dns 地址(10.96.0.10)发起 DNS 查询,请求经过 ClusterIP Service 和 iptables/IPVS 规则,最终被负载均衡到后端的 CoreDNS Pod。

3.1.2 优缺点分析

维度 说明
优点
  • 资源隔离: CoreDNS Pod 独占资源,不受节点上其他 Pod 的干扰。
  • 弹性伸缩: 可根据集群规模调整副本数,支持 HPA 自动扩缩容。
  • 故障域小: 单个节点故障不会导致所有 CoreDNS 实例不可用。
  • 升级安全: 支持滚动更新,Pod 逐个替换,服务不中断。
缺点
  • 跨节点延迟: 客户端 Pod 可能被调度到没有 CoreDNS 实例的节点上,DNS 查询需要跨节点转发,增加网络跳数。
  • 资源浪费: 需要预留额外的资源给 CoreDNS Pod,且副本数需要根据集群规模手动调整。

3.2 DaemonSet 模式:节点级 DNS 缓存

DaemonSet 模式在每个节点上运行一个 CoreDNS Pod,作为该节点的本地 DNS 缓存。这种模式在大型集群或对 DNS 延迟敏感的场景中具有显著优势。

适用场景: 大规模集群(节点数 > 100)、高频 DNS 查询应用、对网络延迟要求苛刻的微服务架构。

3.2.1 架构与流量路径

DaemonSet 模式下,每个节点上的 CoreDNS Pod 监听本节点的 nodeIP 或使用 hostNetwork: true 直接绑定节点端口。客户端 Pod 的 DNS 查询通过 kubelet 配置的 --cluster-dns 指向本节点的 CoreDNS 实例,实现“本地优先”解析。

DaemonSet 模式:节点级 DNS 缓存 Node-1 (10.0.1.1) Pod-A Pod-B CoreDNS Node-2 (10.0.1.2) Pod-C Pod-D CoreDNS Node-3 (10.0.1.3) Pod-E Pod-F CoreDNS 关键点: 每个节点上运行的 CoreDNS 实例处理本节点所有 Pod 的 DNS 查询,查询无需跨节点转发,显著降低延迟。节点故障仅影响该节点上的 Pod。

3.2.2 优缺点分析

维度 说明
优点
  • 极低延迟: DNS 查询在节点内完成,无跨网络跳转。
  • 高可用性: 节点故障不影响其他节点的 DNS 解析。
  • 自动扩展: 新增节点自动部署 CoreDNS,无需手动调整副本数。
  • 资源分散: DNS 负载均匀分布到所有节点,避免单点瓶颈。
缺点
  • 资源占用高: 每个节点都需要运行一个 CoreDNS Pod,资源消耗随节点数线性增长。
  • 管理复杂度: 需要为每个 CoreDNS 实例配置独立的 ConfigMap 或使用共享配置。
  • 升级影响面大: 滚动升级需要逐个节点进行,耗时较长。

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),方便监控系统无缝切换。
注意: kube-dns 兼容模式并非 100% 功能等价。例如,kube-dns 的 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 的工作原理

  1. 虚拟 IP 分配: 创建 Service 时,Kubernetes 从集群的 Service CIDR 中分配一个虚拟 IP(ClusterIP)。
  2. DNS 记录注册: CoreDNS 自动为 Service 创建 A/AAAA 记录,格式为 <service>.<namespace>.svc.cluster.local。
  3. 流量转发: kube-proxy 在节点上创建 iptables 或 IPVS 规则,将发往 ClusterIP 的流量转发到后端的 Pod。
  4. 负载均衡: 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。
最佳实践: 在大型集群中,建议使用 IPVS 模式替代 iptables 模式,并启用 CoreDNS 的 ready 插件和 health 插件,确保 kube-proxy 能够及时感知后端 Pod 的健康状态。