Kubernetes的DNS服务CoreDNS和NodeLocalDNS
内容提要
最近部署k8s集群时,容器解析集群外自建dns中配置的域名报错。将容器中的NodeLocalDNS地址注释掉后解析正常。NodeLocalDNS访问上游CoreDNS解析异常。修改/etc/resolv.conf太麻烦,将coredns cm配置中forward /etc/resolv.conf改成forward . 172.20.xx.10 172.20.xx.20临时解决。
延伸解读
故障现象与临时规避
文章描述容器解析集群外自建DNS域名失败,但CoreDNS和自建DNS本身正常。注释掉Pod内resolv.conf中的NodeLocalDNS地址后解析恢复,说明问题出在NodeLocalDNS到上游CoreDNS的链路。由于Pod数量达数百个,逐个修改resolv.conf不现实,作者将CoreDNS配置中的forward /etc/resolv.conf改为forward . 指向自建DNS地址,作为临时解决方案。
NodeLocalDNS的查询路径与备用链路
启用NodeLocal DNSCache后,Pod默认通过节点上的169.254.20.10解析域名。若本地无缓存,NodeLocalDNS会通过kube-dns服务请求CoreDNS;对于非集群内域名,CoreDNS再通过VPC DNS解析。当Pod无法连通NodeLocalDNS时,会直接通过kube-dns服务连接CoreDNS,这是备用链路。未注入本地缓存的Pod则走标准kube-dns链路。
排错关注点
从日志看,NodeLocalDNS访问上游CoreDNS时出现connection refused,指向10.96.0.10:53连接被拒。这提示需要检查kube-dns服务端点、CoreDNS Pod状态及网络连通性。文章通过修改CoreDNS forward配置临时绕过,但未说明根本原因,读者需注意该方案可能影响集群内域名解析的默认行为。
Q&A
在部署k8s集群时,容器解析外部DNS时出现了什么问题?
容器解析外部自建DNS的域名报错,NodeLocalDNS访问上游CoreDNS解析异常。
如何临时解决NodeLocalDNS导致的解析异常?
将coredns cm配置中的forward改为forward . 172.20.xx.10 172.20.xx.20。
NodeLocal DNSCache的主要功能是什么?
NodeLocal DNSCache通过在节点上运行DNS缓存代理来提高DNS性能。
启用NodeLocal DNSCache后,DNS查询的路径是怎样的?
DNS查询路径包括NodeLocal DNSCache、kube-dns服务和CoreDNS,涉及多个步骤。
为什么修改/etc/resolv.conf在Pod数量庞大的情况下很麻烦?
因为Pod数量庞大,逐个修改/etc/resolv.conf非常麻烦。
NodeLocal DNSCache在DNS查询中如何处理缓存缺失?
NodeLocal DNSCache会通过kube-dns服务请求CoreDNS进行解析,如果本地无缓存应答。