Kubernetes同命名空间下两服务(不同Pod)无法通信排查
首先先澄清一个关键误解:Kubernetes的DNS服务并不会返回Pod的IP地址,它只会解析Service的ClusterIP。你看到的DNS记录(比如python-data-service.default.svc.cluster.local对应10.107.11.236)是完全正常的——Service的ClusterIP就是用来做服务发现的入口,Pod之间的通信是通过这个ClusterIP转发到后端Pod的,所以DNS里没出现172.17.0.X的Pod IP是预期行为,不用纠结这个点。
接下来我们一步步排查通信失败的原因:
1. 确认Pod内的应用是否正确监听端口
Service的流量最终要转发到Pod内的应用,首先得确保应用真的在监听5000端口,并且是监听在0.0.0.0而不是127.0.0.1(后者只能容器内部访问)。
进入目标Pod执行端口监听检查:
kubectl exec -it python-data-deployment-7bd65dc685-htxmj -- netstat -tulpn # 如果没有netstat,试试ss命令 kubectl exec -it python-data-deployment-7bd65dc685-htxmj -- ss -tulpn
如果输出里看不到0.0.0.0:5000的监听记录,那问题出在应用配置上——比如你的Python Flask应用需要设置app.run(host='0.0.0.0', port=5000),否则外部(包括Service)无法访问。
2. 测试Pod之间的直接连通性
先跳过Service,直接测试两个Pod的IP是否能通信,缩小问题范围:
# 从第一个Pod ping第二个Pod的IP kubectl exec -it python-data-deployment-7bd65dc685-htxmj -- ping 172.17.0.8
如果ping不通:
- 检查K8s网络插件状态:执行
kubectl get pods -n kube-system,确保calico/flannel这类CNI插件的Pod都处于Running状态 - 检查是否有NetworkPolicy阻止通信:执行
kubectl get networkpolicy,如果存在限制Pod间通信的策略,需要调整规则
3. 测试Service到Pod的端口连通性
如果Pod直接能通信,但通过Service访问失败,那要检查Service的流量转发是否正常。可以用curl(如果是HTTP服务)或telnet/nc测试端口:
# 测试访问第二个Service的ClusterIP+端口 kubectl exec -it python-data-deployment-7bd65dc685-htxmj -- curl http://10.103.97.40:5000 # 或者用telnet测试端口是否开放 kubectl exec -it python-data-deployment-7bd65dc685-htxmj -- telnet 10.103.97.40 5000 # 用nc测试 kubectl exec -it python-data-deployment-7bd65dc685-htxmj -- nc -zv 10.103.97.40 5000
注:有些轻量镜像可能没有这些工具,可以先安装:apt update && apt install -y iputils-ping telnet netcat-traditional
4. 检查Kube-proxy的状态
Kube-proxy负责维护Service的iptables/ipvs规则,是流量转发的核心组件:
# 查看kube-proxy Pod是否正常运行 kubectl get pods -n kube-system -l k8s-app=kube-proxy # 查看kube-proxy日志,排查是否有转发规则生成失败的报错 kubectl logs -n kube-system <kube-proxy-pod-name>
5. 检查Minikube节点的防火墙/iptables规则
如果是Minikube环境,进入节点检查iptables是否生成了对应的Service转发规则:
# 进入Minikube节点 minikube ssh # 过滤对应Service的iptables规则 iptables-save | grep python-data-service2
如果没有找到相关规则,说明kube-proxy没有正确配置转发,需要重启kube-proxy Pod或检查Minikube的网络配置。
内容的提问来源于stack exchange,提问作者Sakshi Ahuja




