EKS集群Pod无法解析DNS但可ping通IP问题求助
首先,既然你的节点能正常解析DNS但Pod不行,说明VPC层面的DNS服务是正常的,问题大概率出在Kubernetes集群内部的DNS组件(CoreDNS)或者Pod到CoreDNS的网络通路里。结合你已经检查过SG和NACL的情况,给你一步步梳理排查方向:
1. 检查CoreDNS Pod的状态与日志
CoreDNS是Kubernetes集群DNS的核心,先确认它有没有正常运行:
kubectl get pods -n kube-system -l k8s-app=kube-dns
如果Pod状态是CrashLoopBackOff、Error或者Pending,直接看日志找问题:
kubectl logs <coredns-pod-name> -n kube-system
重点关注这类错误:
no nameservers found:说明CoreDNS无法连接上游DNS(即VPC的DNS服务器)timeout:网络连通性问题,比如CoreDNS Pod无法访问VPC DNSpermission denied:可能是SELinux或其他权限限制导致
2. 验证CoreDNS的配置与Service
对比Dev集群的CoreDNS ConfigMap,检查UAT的是否有配置错误:
kubectl get configmap coredns -n kube-system -o yaml
重点看forward插件的配置,是否指向了正确的上游DNS(一般是VPC的DNS地址,即VPC CIDR段+2)。另外检查CoreDNS的Service是否正常:
kubectl get service kube-dns -n kube-system
确认ClusterIP(通常是10.xx.0.10)状态正常,再检查Endpoints是否关联到CoreDNS Pod:
kubectl get endpoints kube-dns -n kube-system
如果Endpoints为空或没有对应CoreDNS Pod的IP,说明Service和Pod的关联存在问题。
3. 检查问题Pod的DNS配置
进入有问题的Pod,查看它的DNS配置文件:
kubectl exec <problem-pod-name> -- cat /etc/resolv.conf
正常情况下,nameserver应该指向CoreDNS的ClusterIP(比如10.xx.0.10),且search包含集群的域名后缀(比如default.svc.cluster.local)。如果这里显示的是节点的DNS地址,说明Pod的dnsPolicy配置异常,检查Pod的dnsPolicy是否为默认的ClusterFirst。
4. 排查Kubernetes网络策略限制
虽然你检查了SG和NACL,但Kubernetes的NetworkPolicy可能会阻止Pod访问kube-dns服务:
kubectl get networkpolicies --all-namespaces
查看有没有针对kube-system命名空间或Pod所在命名空间的NetworkPolicy,是否限制了TCP/UDP 53端口的访问。如果有,需要调整策略允许DNS流量。
5. 检查VPC的DNS相关配置
即使节点能解析,也要确认UAT集群所在VPC的以下配置是否开启:
enableDnsHostnames:必须设为true,否则节点无法获取DNS主机名enableDnsSupport:必须设为true,VPC才能提供DNS服务
可以通过AWS控制台或AWS CLI查看VPC属性,对比Dev集群的VPC配置。
6. 验证kube-proxy的状态
CoreDNS的Service是通过kube-proxy实现转发的,如果kube-proxy异常,Pod无法访问Service IP:
kubectl get pods -n kube-system -l k8s-app=kube-proxy
查看kube-proxy Pod的状态,再看日志有没有异常:
kubectl logs <kube-proxy-pod-name> -n kube-system
另外可以在工作节点上检查iptables规则,确认有没有kube-dns的转发规则:
iptables-save | grep kube-dns
7. 核对Terraform部署配置
既然是用Terraform部署的,仔细对比Dev和UAT的Terraform代码,看有没有遗漏:
- 子网的路由表是否允许访问VPC DNS服务器(VPC CIDR+2)的流量
- 集群的
cluster_endpoint_public_access/cluster_endpoint_private_access配置是否和Dev一致 - 有没有在UAT集群中额外配置了影响DNS的组件(比如自定义DNS服务)
额外提示:针对Kubernetes 1.14的特殊注意点
你的集群版本是1.14,属于较老版本,对应的CoreDNS版本可能存在一些已知问题。比如早期CoreDNS在处理某些DNS请求时会有bug,或者kube-proxy的iptables模式配置有误。可以对比Dev集群的CoreDNS版本,看UAT是否使用了相同的镜像版本。
内容的提问来源于stack exchange,提问作者shrimpy

