使用Google Cloud Code时,如何让绑定预留静态IP的GKE LoadBalancer服务接收外部流量?
从你的描述来看,静态IP已经成功绑定到LoadBalancer服务,ping能通说明网络层面的基本可达性没问题,但流量无法到达应用,建议按以下步骤逐一排查:
1. 确认Pod状态正常
首先检查应用Pod是否处于正常运行状态:
kubectl get pods -l app=myapp,environment=sandbox
- 确保所有Pod的
STATUS为Running,READY为1/1。如果Pod处于CrashLoopBackOff或ImagePullBackOff状态:- 若为
ImagePullBackOff:确认myapp镜像存在于集群可访问的镜像仓库(比如GCR、Artifact Registry),同时查看skaffold build的输出,确认镜像是否被正确推送。 - 若为
CrashLoopBackOff:查看Pod日志排查容器启动失败原因:kubectl logs <pod-name>
- 若为
2. 验证容器内服务是否正常监听
进入Pod内部,直接访问容器的8080端口,确认服务是否正常响应:
kubectl exec -it <pod-name> -- curl localhost:8080
如果没有返回预期内容,说明容器内的服务没有在8080端口启动,或者服务本身存在故障,需要先修复应用程序。
3. 检查Service与Pod的关联(Endpoints)
确认Service是否正确关联到Pod:
kubectl describe service myapp-service
查看Endpoints字段,如果是空值,说明Service的selector与Pod的labels不匹配(注意大小写、空格等细节)。从你的清单来看,selector和Pod标签是一致的,但建议手动核对一遍标签的拼写和格式。
如果Endpoints显示有Pod的IP,再尝试通过ClusterIP在集群内部访问服务:
kubectl run -it --rm --image=curlimages/curl curl-test -- curl http://10.16.9.255:80
如果集群内部访问失败,说明Service到Pod的转发存在问题,可能是Pod的网络策略限制,或者容器端口配置错误(确认containerPort是8080,与Service的targetPort一致)。
4. 检查GCP防火墙规则
虽然ping能通,但80端口的流量可能被防火墙拦截。GKE会自动为LoadBalancer服务创建对应的防火墙规则,但需要确认规则是否生效:
- 登录GCP控制台,进入VPC网络 > 防火墙,查找名称包含
k8s-fw-lb-<your-service-name>的规则。 - 确认规则允许
0.0.0.0/0的tcp:30879(你的Service节点端口)流量,目标标签为GKE集群的节点标签(比如gke-<cluster-name>-<node-pool>-xxxx)。 - 如果规则不存在或配置错误,可以手动创建:允许Ingress流量,协议TCP,端口30879,目标选择GKE节点标签,来源0.0.0.0/0。
5. 检查负载均衡器的健康检查
GCP负载均衡器依赖健康检查来决定是否将流量转发到节点,如果健康检查失败,流量会被阻断:
- 登录GCP控制台,进入网络服务 > 负载均衡,找到对应的负载均衡器,查看后端服务的健康状态。
- 默认情况下,GKE会为LoadBalancer服务创建针对节点端口的HTTP健康检查(路径为
/,端口为节点端口)。如果你的应用根路径/不返回200状态码,或者需要特定的健康检查路径,需要在Deployment中添加livenessProbe和readinessProbe,GKE会自动同步这些配置到负载均衡器的健康检查:
修改Deployment的容器配置:
更新Deployment后,等待健康检查状态变为containers: - name: myapp image: myapp imagePullPolicy: Always ports: - containerPort: 8080 # 添加健康探针 livenessProbe: httpGet: path: /healthz # 替换为你的应用健康检查路径,没有的话用/ port: 8080 initialDelaySeconds: 3 periodSeconds: 3 readinessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 3 periodSeconds: 3健康,再测试外部IP访问。
6. 确认Skaffold部署配置
检查Skaffold的deploy部分,确认manifests指向的gcloud_k8_staticip_deployment.yaml就是你提供的正确清单,没有被其他配置覆盖。可以运行skaffold deploy --dry-run查看将要部署的资源,确认配置正确。
按照以上步骤逐一排查,应该能定位到问题所在。
内容的提问来源于stack exchange,提问作者RndmSymbl

