DNS 原理概述
更新时间:2024-10-11
在 CCE 集群中中,由 CoreDNS 组件为集群中工作负载提供 DNS 域名解析服务。
CoreDNS 为 CNCF 托管项目,拥有丰富的插件集,可以为集群中负载提供集群内、集群外公网域名、私有域名等域名解析。
DNS 原理说明
CCE 集群中的 CoreDNS 工作负载,该负载默认有 3 个 CoreDNS pod,并会通过名为 kube-dns 的服务名暴露 DNS 服务。 示意如下:
# kubectl -n kube-system get svc kube-dns
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 172.16.0.10 <none> 53/UDP,53/TCP,9153/TCP 13d
# kubectl -n kube-system get pod | grep coredns
coredns-5bcb94c99b-2g5fq 1/1 Running 0 12d
coredns-5bcb94c99b-x4xxk 1/1 Running 0 12d
coredns-5bcb94c99b-x5kjg 1/1 Running 0 12d
集群中 Pod 内的 DNS 域名解析配置文件 /etc/resolv.conf 内容如下:
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 172.16.0.10
options ndots:5
参数说明:
- search:域名的查找后缀规则规则
- nameserver:DNS 服务器的 IP 地址,这里为 kube-dns 的 ClusterIP
- options:定义域名解析配置文件选项;如果域名中点字符数量大于等于 ndots 值,则认为是完整域名,将被直接解析,如果小于 ndots 值,则追加 search 中指定的后缀依次查询
因此,pod 会通过 kube-dns 的 ClusterIP,如 172.16.0.10 请求 CoreDNS pod,拿到目标服务的 ClusterIP,然后对目标服务发起请求。
CCE 集群中 DNS 工作原理如下图所示:
通过 dnsPolicy 自定义 DNS 策略
在 CCE 集群中,DNS 策略可以逐个 Pod 来设定。目前支持以下特定 Pod 的 DNS 策略。 这些策略可以在 Pod Spec 中的 dnsPolicy 字段设置:
- "Default": Pod 从运行所在的节点继承名称解析配置,即使用云上 DNS 服务器进行域名解析服务
- "ClusterFirst": 使用 CoreDNS 进行域名解析服务,pod 内 /etc/resolv.conf 中 nameserver 将指向 kube-dns 服务的 ClusterIP
- "ClusterFirstWithHostNet": 对于以 hostNetwork 方式运行的 Pod,应将其 DNS 策略显式设置为 "ClusterFirstWithHostNet"。否则,以 hostNetwork 方式和 "ClusterFirst" 策略运行的 Pod 将会做出回退至 "Default" 策略的行为
- "None": 此设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置,Pod 会使用其 dnsConfig 字段所提供的 DNS 设置
说明:"Default" 不是默认的 DNS 策略。如果未明确指定 dnsPolicy,则默认使用 "ClusterFirst"。