1. DNS 基础回顾:DNS 解析流程、A/AAAA/CNAME/SRV 记录、Kubernetes 内部 DNS 工作原理

1.1 DNS 解析流程

DNS(Domain Name System)是互联网的“电话簿”,负责将人类可读的域名(如 www.example.com)转换为机器可读的 IP 地址(如 93.184.216.34)。一次完整的 DNS 解析通常经历以下步骤:

  1. 客户端发起查询:应用程序(如浏览器)调用系统解析器(gethostbyname 或 getaddrinfo),向本地 DNS 缓存(如 nscd、systemd-resolved)发起查询。
  2. 递归查询:若本地无缓存,系统将查询请求发送至配置的递归 DNS 服务器(如 8.8.8.8 或集群内的 CoreDNS)。
  3. 迭代查询:递归服务器从根 DNS 服务器开始,依次查询顶级域(TLD)服务器、权威 DNS 服务器,最终获得目标域名的 IP 地址。
  4. 返回结果:递归服务器将结果返回给客户端,并缓存结果以加速后续查询。
关键性能指标: 解析延迟(RTT)、缓存命中率、查询失败率。在 Kubernetes 环境中,CoreDNS 的响应时间直接影响 Pod 间的服务发现效率。
DNS 解析流程示意图 DNS 解析流程(递归 + 迭代) 客户端 递归服务器 根 DNS TLD DNS 权威 DNS 查询 迭代 NS 委派 迭代 NS 委派 迭代 A/AAAA 记录 响应 说明:实线箭头为查询方向,虚线箭头为响应方向。递归服务器承担了大部分迭代工作,客户端仅需一次查询。

1.2 DNS 记录类型

不同的 DNS 记录类型服务于不同的解析场景。在 Kubernetes 服务发现中,最常用的记录类型包括:

记录类型 用途 示例 Kubernetes 场景
A 将域名映射到 IPv4 地址 www.example.com. IN A 93.184.216.34 Service ClusterIP 的 IPv4 解析
AAAA 将域名映射到 IPv6 地址 www.example.com. IN AAAA 2606:2800:220:1:248:1893:25c8:1946 双栈集群中的 IPv6 服务解析
CNAME 域名别名,指向另一个域名 blog.example.com. IN CNAME www.example.com. ExternalName Service 的实现基础
SRV 指定服务所在的主机名和端口号 _http._tcp.example.com. IN SRV 0 5 80 www.example.com. Headless Service 的端口发现、etcd 集群引导
性能提示: CNAME 记录会引入额外的 DNS 查询,增加解析延迟。在 CoreDNS 中,应避免过长的 CNAME 链,建议将高频访问的服务直接使用 A/AAAA 记录。

1.3 Kubernetes 内部 DNS 工作原理

Kubernetes 集群内部 DNS 由 CoreDNS(或旧版 kube-dns)实现。其核心工作原理如下:

  • Pod 自动注入 DNS 配置:每个 Pod 的 /etc/resolv.conf 被自动配置为指向 CoreDNS Service 的 ClusterIP(通常为 10.96.0.10),并设置搜索域(如 namespace.svc.cluster.local)。
  • Service 域名解析:CoreDNS 监听 Kubernetes API Server 的 Service 和 Endpoint 变化,动态生成 DNS 记录。例如,Service my-svc 在 default 命名空间下,会被解析为 my-svc.default.svc.cluster.local。
  • Pod 域名解析:通过 hostname.subdomain.namespace.svc.cluster.local 格式,可以解析到特定 Pod 的 IP 地址(需启用 publishNotReadyAddresses 或 Headless Service)。
  • 外部域名转发:对于集群外部域名(如 www.baidu.com),CoreDNS 通过配置的 forward 插件将请求转发至上游 DNS 服务器(如 8.8.8.8 或云厂商 DNS)。
Kubernetes 内部 DNS 工作原理 Kubernetes 内部 DNS 工作原理 Pod A resolv.conf → 10.96.0.10 CoreDNS kube-dns:10.96.0.10 API Server Service/Endpoint 变更 上游 DNS Service B 查询 my-svc Watch Service/Endpoint 更新 返回 ClusterIP 转发外部域名 说明:CoreDNS 通过 Watch API Server 实时获取 Service/Endpoint 变化,动态生成 DNS 记录。 Pod 的 resolv.conf 自动指向 CoreDNS Service IP,搜索域为 <namespace>.svc.cluster.local。 外部域名通过 forward 插件转发至上游 DNS,避免集群内解析失败。

1.4 CoreDNS 插件链与性能关键点

CoreDNS 通过插件链(Plugin Chain)处理每个 DNS 查询。默认配置中,插件按以下顺序执行:

.:53 {
    errors
    health
    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
    cache 30
    loop
    reload
    loadbalance
}

性能关键点:

  • cache 插件:设置合理的 TTL(如 30s)可大幅减少对 API Server 和上游 DNS 的查询压力。
  • forward 插件:配置多个上游 DNS 服务器并启用健康检查,避免单点故障。
  • kubernetes 插件:pods insecure 模式允许 Pod 域名解析,但会增加内存占用;若不需要,建议关闭。
  • prometheus 插件:暴露 :9153 指标端口,用于监控查询速率、延迟和错误率。