CoreDNS和NodeLocalDNS的域名解析
在 K8s 中,DNS 的解析主要用这两个工具:
- CoreDNS: 主要负责集群内部域名解析
- NodeLocalDNS: 提供 DNS 缓存
首先看一下集群中节点的 /etc/resolv.conf
配置文件
1 | # 指定了搜索域,当使用域名解析主机名时,如果主机名没有完全限定,系统会依次尝试在指定的搜索域中追加搜索后缀进行解析 |
在 K8s 中,workload 的 dnsPolicy 有四种类型:
- ClusterFirst: 与配置的集群域后缀不匹配的任何 DNS 查询(例如 “www.kubernetes.io") 都会由 DNS 服务器转发到上游名称服务器
- Default: 从运行所在的节点继承名称解析配置
- ClusterFirstWithHostNet: 对于以
hostNetwork
方式运行的 Pod,应将其 DNS 策略显式设置为ClusterFirstWithHostNet
。否则,以hostNetwork
方式和ClusterFirst
策略运行的 Pod 将会做出回退至Default
策略的行为 - None: 会使用
dnsConfig
提供的 DNS 配置
CoreDNS
CoreDNS 主要是复杂集群内部域名的解析,保证 Pod 与 Pod 只见可以通过 Service Name 进行通信。当然也可以为它添加配置,使其能够解析静态的一些 Host 👇
1 | kind: ConfigMap |
创建一个 dnsPolicy 为 ClusterFirst
的 busybox
通过这个 busybox 解析集群内部域名,通过 tcpdump
获取 53 端口的包
可以看到会根据 search 对 CoreDNS 发起多次请求
Pod -> CoreDNS -> Pod
1 | [root@controller-node-1 ~]# tcpdump -i any host 10.233.0.3 and 10.233.74.83 and port 53 -nnvvv |
通过这个 busybox 解析集群公网域名
可以看到对 www.baidu.com
域名的解析返回结果,是通过 192.168.0.5
获取到的
Pod -> CoreDNS -> 192.168.0.5 -> CoreDNS -> Pod
1 | [root@controller-node-1 ~]# tcpdump -i any host 10.233.74.83 and 10.233.0.3 or 192.168.0.5 and port 53 -nnvvv |
NodeLocalDNS
来自官方文档: NodeLocal DNSCache 通过在集群节点上作为 DaemonSet 运行 DNS 缓存代理来提高集群 DNS 性能。
NodeLocalDNS Pod 中的 /etc/resolv.conf
与宿主机是相同的
节点上也会有对应的网卡,这个地址取决于启动参数
在集群有 NodeLocalDNS 的情况下,在对集群内部域名进行解析,可以看到 DNS 请求会先经过 NodeLocalDNS,然后直接返回请求
Pod -> NodeLocalDNS -> Pod
1 | [root@controller-node-1 ~]# tcpdump -i any host 10.233.74.83 and 169.254.25.10 or 10.233.0.3 and port 53 -nnvvv |
然后在对集群外部域名进行解析
Pod -> NodeLocalDNS -> CoreDNS -> 192.168.0.5 -> CoreDNS -> NodeLocalDNS -> Pod
1 | 23:27:25.569362 IP (tos 0x0, ttl 64, id 36019, offset 0, flags [DF], proto UDP (17), length 60) |
CoreDNS和NodeLocalDNS的域名解析
https://warnerchen.github.io/2024/03/30/CoreDNS和NodeLocalDNS的域名解析/
install_url
to use ShareThis. Please set it in _config.yml
.