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 解析通常经历以下步骤:
- 客户端发起查询:应用程序(如浏览器)调用系统解析器(
gethostbyname或getaddrinfo),向本地 DNS 缓存(如nscd、systemd-resolved)发起查询。 - 递归查询:若本地无缓存,系统将查询请求发送至配置的递归 DNS 服务器(如
8.8.8.8或集群内的 CoreDNS)。 - 迭代查询:递归服务器从根 DNS 服务器开始,依次查询顶级域(TLD)服务器、权威 DNS 服务器,最终获得目标域名的 IP 地址。
- 返回结果:递归服务器将结果返回给客户端,并缓存结果以加速后续查询。
关键性能指标: 解析延迟(RTT)、缓存命中率、查询失败率。在 Kubernetes 环境中,CoreDNS 的响应时间直接影响 Pod 间的服务发现效率。
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)。
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指标端口,用于监控查询速率、延迟和错误率。