如何为两个GCP项目的GKE Pod配置网络?共享VPC未生效
故障原因分析与排查步骤
可能的核心原因
- NodePort服务访问方式误解:你提到的
10.0.37.97是服务的ClusterIP,而非NodePort的访问入口。NodePort服务需要通过集群节点的内部IP + 分配的NodePort端口访问,直接访问ClusterIP仅在同一集群内有效。 - 共享VPC防火墙规则缺失:默认GKE防火墙规则仅允许同一集群内的流量访问NodePort,跨集群(即使在同一共享VPC)的流量会被拦截。
- 跨集群路由配置异常:虽然共享VPC子网包含两个集群的Pod/服务网段,但可能缺少指向tts集群节点所在网段的路由,导致gateway集群Pod无法到达tts节点。
分步排查步骤
步骤1:确认NodePort服务的正确访问信息
在tts集群中执行以下命令,获取服务的NodePort端口和节点内部IP:
# 获取服务的NodePort端口 kubectl get svc <你的服务名称> -o jsonpath='{.spec.ports[0].nodePort}' # 获取tts集群所有节点的内部IP kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="InternalIP")].address}'
尝试用gateway集群的Pod访问 tts节点内部IP:NodePort端口,而非直接访问ClusterIP 10.0.37.97。
步骤2:检查共享VPC的防火墙规则
在宿主项目(HOST_PROJECT_ID)的VPC网络控制台中操作:
- 进入「防火墙」页面,确认是否存在允许
10.192.0.0/14(gateway集群Pod网段)访问tts集群节点IP段的NodePort端口规则 - 若没有,创建新规则:
- 名称:
allow-gateway-pod-to-tts-nodeport - 网络:
shared-net - 方向:入站
- 目标:选择tts集群的节点标签(如
cloud.google.com/gke-nodepool=tts-nodepool) - 来源IP范围:
10.192.0.0/14 - 协议和端口:
tcp:30000-32767(对应NodePort默认端口范围)
- 名称:
步骤3:验证跨集群节点的可达性
在gateway集群的Pod中执行以下命令,测试网络连通性:
# ping tts集群的节点内部IP,确认基础网络连通 ping <tts节点内部IP> # 测试NodePort端口是否开放 telnet <tts节点内部IP> <NodePort端口>
如果ping不通,需检查宿主项目VPC的路由配置:
- 进入「路由」页面,确认存在指向tts集群节点所在子网段的路由,下一跳为默认网关
- 确认两个集群的节点都在共享子网
tts内,且子网IP段覆盖所有节点IP
步骤4:检查共享VPC权限配置
确认服务项目已被正确授权使用共享VPC:
- 在宿主项目的IAM页面,找到服务项目的GKE服务账号(格式:
service-<服务项目ID>@container-engine-robot.iam.gserviceaccount.com) - 确认该账号拥有
Compute Network User角色,确保集群节点能正常使用共享VPC资源
步骤5:二次确认网络策略状态
即使配置显示Network policy Disabled,仍需检查是否存在残留规则:
# 在tts集群执行,检查所有命名空间的网络策略 kubectl get networkpolicies --all-namespaces
如果存在限制跨集群流量的规则,删除或调整规则以允许gateway集群Pod的访问。
内容的提问来源于stack exchange,提问作者Konstantin Amelichev
相关产品推荐
相关产品推荐

