如何解决AKS部署中部分Pod拉取ACR镜像的DNS连接拒绝错误?
问题根源
从错误日志看,核心问题是Pod无法解析ACR的域名:dial tcp: lookup prd255acr01.azurecr.io on [::1]:53: read udp [::1]:34880->[::1]:53: read: connection refused,说明Pod尝试用本地([::1]:53)的DNS服务器解析域名,但该DNS服务不可用,导致解析失败。
排查与解决步骤
检查节点的DNS配置
登录到故障Pod所在的AKS节点,查看/etc/resolv.conf文件,确认其中的DNS服务器地址是否有效(比如Azure默认DNS或自定义的可用DNS)。如果文件指向127.0.0.53或[::1]但节点本地DNS服务异常,Pod会继承这个错误配置。验证Pod的DNS策略
查看Deployment/YAML文件中的spec.template.spec.dnsPolicy设置,确保值为ClusterFirst(AKS默认配置)。如果被改为Default,Pod会直接使用节点DNS配置,节点DNS故障时就会触发解析失败。
修正后重新部署:spec: template: spec: dnsPolicy: ClusterFirst检查CoreDNS运行状态
AKS默认用CoreDNS提供集群DNS服务,执行以下命令查看CoreDNS Pod状态:kubectl get pods -n kube-system -l k8s-app=kube-dns若有Pod处于
CrashLoopBackOff或Error状态,重启CoreDNS部署:kubectl rollout restart deployment coredns -n kube-system测试Pod内的DNS解析能力
进入正常运行的Pod执行解析测试:kubectl exec -it <正常Pod名称> -- nslookup prd255acr01.azurecr.io若正常Pod能解析但故障Pod不能,可创建临时测试Pod验证集群DNS:
kubectl run -it --rm dns-test --image=busybox:1.28 -- nslookup prd255acr01.azurecr.io检查节点网络与防火墙规则
在故障节点上测试DNS服务器连通性:nslookup prd255acr01.azurecr.io <集群DNS服务器地址>同时检查节点防火墙规则,确保未阻止UDP 53端口的出站流量(DNS查询依赖该端口)。
重置异常节点
若为个别节点DNS服务异常,可将节点从集群移除并重建:# 列出节点 kubectl get nodes # 标记节点不可调度并驱逐Pod kubectl cordon <节点名称> kubectl drain <节点名称> --ignore-daemonsets # 删除节点(AKS会自动重建新节点) kubectl delete node <节点名称>
内容的提问来源于stack exchange,提问作者Ajinkya Bapat

