GKE NodePort服务无法接收外部流量 求排查建议
我来分享几个一步步排查的思路,从容器内部到集群外部,帮你定位问题:
排查NodePort服务无响应的步骤
1. 先确认容器内的服务端口是否配置正确
你的Deployment里给nginx容器配置了containerPort: 8080,但官方nginx:latest镜像默认是监听80端口的,除非你自定义了nginx配置文件修改监听端口。这大概率是核心问题,先验证:
- 找到目标Pod:
kubectl get pods -l app=nginxv1 - 进入容器检查端口监听:
kubectl exec -it <你的Pod名称> -- netstat -tulpn
如果输出里nginx监听的是80而非8080,那你需要:- 要么把Deployment里的
containerPort和Service里的targetPort都改成80 - 要么在容器内修改nginx配置,让它监听8080端口
- 要么把Deployment里的
2. 验证Service与Pod的关联是否正常
虽然你的selector和Pod标签看起来匹配,但还是要确认Service是否真的找到了对应的Pod:
- 查看Service详情:
kubectl describe service nginxv1
重点看输出里的Endpoints字段,如果是空的,说明Service没匹配到Pod;如果显示了Pod的IP和端口,说明关联正常。
3. 在集群内部测试连通性
先跳过NodePort,直接在集群内部测试服务是否可用,排除外部网络的干扰:
- 创建一个临时测试Pod:
kubectl run -it --rm --image=busybox:1.28 test-pod -- sh - 在测试Pod里访问Service:
curl nginxv1:80- 如果能拿到nginx的默认页面响应,说明集群内部服务正常,问题出在NodePort的外部访问链路
- 如果没响应,再直接访问Pod IP:先通过
kubectl get pods -l app=nginxv1 -o wide拿到Pod的内部IP,然后执行curl <Pod内部IP>:8080,确认Pod本身是否能提供服务
4. 确认节点IP与防火墙规则的有效性
虽然你配置了防火墙允许30100端口,但要注意几个细节:
- 你访问的必须是节点的外部公网IP,GKE节点有内部私有IP和外部公网IP,外部访问只能用公网IP
- 检查GCP防火墙规则的目标范围:确保规则应用到了你的集群节点(GKE节点默认带有
kubernetes.io/role=node标签,你的防火墙规则要覆盖这个标签) - 登录到节点上检查端口监听:
gcloud compute ssh <节点名称>,然后执行netstat -tulpn | grep 30100,确认kube-proxy是否在监听这个NodePort
5. 检查kube-proxy的运行状态
NodePort的转发是靠kube-proxy实现的,确认它在节点上正常运行:
- 登录节点后执行
systemctl status kube-proxy(如果节点用systemd管理服务) - 或者查看kube-proxy的Pod日志:
kubectl logs -n kube-system -l k8s-app=kube-proxy,排查有没有转发相关的错误日志
内容的提问来源于stack exchange,提问作者deals my
相关产品推荐
相关产品推荐

