最近部署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 查询所遵循的路径如下:
序号 | 描述 |
① | 已注入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学习及排错:
服务器玩家 哈哈
@刘郎 服务器搬运工
没有经过NodeLocalDNS性能会受到影响吧?特别时集群大,请求大的时候,后面怎么解决的?
@啊实打实打算 集群不是很大,没有受啥影响,强制指定到自建的dns服务了。