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 查询的完整链路:

CoreDNS 查询处理流程 CoreDNS 查询处理流程 Pod A 发起查询 my-svc CoreDNS 监听 53 端口 kubernetes 插件 查询 API Server API Server 返回 Service IP Pod B 目标 Service DNS 查询 返回记录 返回 IP 说明: 1. Pod A 发起 DNS 查询 → 2. CoreDNS 接收并匹配 kubernetes 插件 → 3. 插件查询 API Server 获取 Service 后端 IP → 4. CoreDNS 返回解析结果

1.5 CoreDNS 插件架构

CoreDNS 的核心优势在于其插件化架构。每个插件负责一个独立功能,通过 Corefile 串联成处理链。下图展示了生产环境中常见的插件组合:

CoreDNS 插件链架构 CoreDNS 插件链架构(生产环境典型配置) DNS 查询 health prometheus kubernetes cache forward 插件功能说明: • health:提供 HTTP 健康检查端点(:8080/health),用于 Kubernetes liveness/readiness 探测 • prometheus:暴露 DNS 指标(请求量、延迟、错误率),供 Prometheus 采集 • kubernetes:核心插件,从 API Server 同步 Service/Pod DNS 记录 • cache:缓存 DNS 响应,减少对 API Server 和上游 DNS 的查询压力 • forward:将非集群域名转发至上游 DNS(如 8.8.8.8、集群外部 DNS)

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
}