Kubernetes的DNS服务CoreDNS和NodeLocalDNS

最近部署k8s集群时,容器解析集群外自建dns中配置的域名报错(coredns及自建dns服务都能正常解析),将容器中 /etc/resolv.conf 中的 NodeLocalDNS 地址注释掉后解析正常,NodeLocalDNS 访问上游 CoreDNS 解析异常,由于pod有几百个,修改 /etc/resolv.conf 太麻烦,将coredns cm配置中forward /etc/resolv.conf 改成 forward . 172.20.xx.10 172.20.xx.20(自建dns服务地址)临时解决。报错信息如下:

# cat /etc/resolv.conf
search xxx.svc.cluster.local svc.cluster.local cluster.local
nameserver 169.254.20.10
nameserver 10.96.0.10
options ndots:5

# nodelocaldns logs
2024-08-01T18:46:58.881171059+08:00 [ERROR] plugin/errors: 2 iam.svc.cluster.local. AAAA: dial tcp 10.96.0.10:53: connect: connection refused
2024-08-01T18:46:58.881479588+08:00 [ERROR] plugin/errors: 2 iam.svc.cluster.local. A: dial tcp 10.96.0.10:53: connect: connection refused
2024-08-01T18:46:59.010177938+08:00 [ERROR] plugin/errors: 2 test.svc.cluster.local. AAAA: dial tcp 10.96.0.10:53: connect: connection refused
2024-08-01T18:46:59.010188162+08:00 [ERROR] plugin/errors: 2 test.svc.cluster.local. AAAA: dial tcp 10.96.0.10:53: connect: connection refused
2024-08-01T18:46:59.010373544+08:00 [ERROR] plugin/errors: 2 test.svc.cluster.local. A: dial tcp 10.96.0.10:53: connect: connection refused
2024-08-01T18:46:59.010542563+08:00 [ERROR] plugin/errors: 2 test.svc.cluster.local. A: dial tcp 10.96.0.10:53: connect: connection refused
2024-08-01T18:46:59.242147912+08:00 [ERROR] plugin/errors: 2 console.svc.cluster.local. AAAA: dial tcp 10.96.0.10:53: connect: connection refused
......

NodeLocal DNSCache 通过在群集节点上作为DaemonSet运行dns缓存代理来提高群集DNS性能。 在k8s的体系结构中,处于ClusterFirst DNS模式的Pod可以连接到kube-dns serviceIP进行DNS查询。 通过kube-proxy添加的iptables规则将其转换为kube-dns / CoreDNS端点。 借助这种新架构,Pods将可以访问在同一节点上运行的dns缓存代理,从而避免了iptables DNAT规则和连接跟踪,解析dns时频繁查询 CoreDNS。 本地缓存代理将查询 kube-dns 服务以获取集群主机名的缓存缺失(默认为 cluster.local 后缀)。

启用 NodeLocal DNSCache 之后,DNS 查询所遵循的路径如下:

Kubernetes的DNS服务CoreDNS和NodeLocalDNS

NodeLocal DNSCache工作原理图:

Kubernetes的DNS服务CoreDNS和NodeLocalDNS

序号

描述

已注入DNS本地缓存的Pod,默认会通过NodeLocal DNSCache监听于节点上的IP(169.254.20.10)解析域名。

NodeLocal DNSCache本地若无缓存应答解析请求,则会通过kube-dns服务请求CoreDNS进行解析。

CoreDNS对于非集群内域名,会通过VPC DNS服务器进行解析。

已注入DNS本地缓存的Pod,当无法连通NodeLocal DNSCache时,会继而直接通过kube-dns服务连接到CoreDNS进行解析,此链路为备用链路。

未注入DNS本地缓存的Pod,会通过标准的kube-dns服务链路连接到CoreDNS进行解析。


CoreDNS和NodeLocalDNS学习及排错


anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/6170.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

4 评论

  1. 没有经过NodeLocalDNS性能会受到影响吧?特别时集群大,请求大的时候,后面怎么解决的?

发表评论

电子邮件地址不会被公开。 必填项已用*标注