K8s集群内Pod无法连接互联网,执行ping命令报bad address错误如何排查?
问题现象
执行Pod内的公网连通性测试命令时直接返回解析错误,无任何网络丢包、超时的返回:
[root@master micro-services]# kubectl exec -it webapp-77896f4bf8-8ptbb -- ping google.com ping: bad address 'google.com' command terminated with exit code 1
核心原因
报错本质是Pod内部的域名解析流程完全失败,请求未进入公网网络连通性测试阶段,故障点集中在K8s集群的DNS链路,而非纯粹的出口网络带宽/路由问题。
分步排查修复方案
- 核对Pod内的DNS配置文件
执行kubectl exec -it webapp-77896f4bf8-8ptbb -- cat /etc/resolv.conf,检查配置条目是否匹配集群默认CoreDNS的Service地址:若配置文件中指向的nameserver地址和集群CoreDNS的Service ClusterIP不一致、或是存在指向不可达外部地址的错误条目,会直接触发解析失败。
- 核验集群CoreDNS组件运行状态
执行kubectl get pods -n kube-system -l k8s-app=kube-dns,确认CoreDNS对应Pod是否处于正常Running状态,有没有出现频繁重启、镜像拉取失败、端口绑定异常的问题。CoreDNS组件整体异常时,集群内所有业务Pod都会出现同类域名解析报错。 - 检查宿主机节点的DNS转发链路
确认节点本身的iptables、firewalld规则没有拦截集群DNS服务的转发流量;同时如果CoreDNS配置了节点本地systemd-resolved作为上游转发,需要确认节点上的系统DNS服务是否正常运行——很多节点侧的系统DNS服务崩溃,会直接导致所有下游Pod的解析请求超时无响应。 - 排查Pod自定义DNS配置的冲突
如果业务Pod在Spec中配置了自定义dnsConfig参数,需要核对自定义的nameserver、search域、ndots参数是否和集群网络规则冲突:比如手动将nameserver设置为不可达的外部DNS地址,会直接绕过集群CoreDNS引发解析失败。 - 区分链路故障场景
在Pod内执行nslookup google.com 8.8.8.8,手动指定公共DNS地址发起解析请求:- 若指定8.8.8.8可以正常返回google.com的IP,说明故障出在集群内部的CoreDNS转发链路
- 若指定8.8.8.8也无法完成解析,说明节点本身到外部公共DNS的网络存在路由拦截、出口不通的问题
- 部分裁剪类极简镜像(如Alpine基础镜像)可能存在DNS工具链缺失的问题,可换用包含完整解析能力的镜像做交叉验证,排除镜像本身的缺陷
内容的提问来源于stack exchange,提问作者armaan mahajan
相关产品推荐
相关产品推荐

