You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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的容器配置:
    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
    
    更新Deployment后,等待健康检查状态变为健康,再测试外部IP访问。

6. 确认Skaffold部署配置

检查Skaffold的deploy部分,确认manifests指向的gcloud_k8_staticip_deployment.yaml就是你提供的正确清单,没有被其他配置覆盖。可以运行skaffold deploy --dry-run查看将要部署的资源,确认配置正确。

按照以上步骤逐一排查,应该能定位到问题所在。

内容的提问来源于stack exchange,提问作者RndmSymbl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 22:54:08