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

配置控制平面授权网络后,Cloud Function如何访问GKE集群?

GKE控制平面授权网络配置后Cloud Function无法访问的解决方法

1. 核对Serverless VPC连接器基础配置

  • 确保连接器与GKE集群处于同一个VPC网络,跨VPC需先配置VPC对等连接
  • 确认连接器所在子网的完整CIDR已添加到GKE控制平面的授权网络列表,避免只添加单个IP
  • 检查连接器状态为RUNNING,可通过GCP控制台或gcloud compute networks vpc-access connectors describe CONNECTOR_NAME --region REGION命令查看

2. 修正Cloud Function的VPC连接设置

  • 确保Cloud Function已启用Serverless VPC连接器,并选择正确的连接器实例
  • 开启路由所有出站流量通过VPC连接器选项:若仅路由私有IP流量,GKE控制平面的公网endpoint会走Cloud Function默认公网出口,无法触发授权网络规则
  • 若连接器配置了云NAT,需确认NAT IP范围也已添加到GKE授权网络(如果流量走NAT出口的话)

3. 验证GKE控制平面授权网络配置

  • 执行命令gcloud container clusters describe CLUSTER_NAME --zone ZONE,查看masterAuthorizedNetworksConfig.cidrBlocks字段,确认目标CIDR已正确添加
  • 若使用共享VPC,需添加宿主项目子网的CIDR,而非服务项目的CIDR

4. 确认服务账号权限有效性

  • 确保Cloud Function绑定的服务账号拥有container.clusters.get权限,可通过绑定roles/container.clusterViewer角色实现
  • 避免因权限变更导致访问失败,可通过gcloud projects get-iam-policy PROJECT_ID --filter="bindings.members:serviceAccount:SA_NAME"验证权限绑定

5. 优化代码中的认证与访问逻辑

  • 不建议关闭SSL验证(configuration.verify_ssl = False),GCP环境默认信任GKE控制平面的SSL证书,开启验证更安全
  • 使用标准的Kubernetes客户端认证方式,替代手动设置api_key:
    credentials, project_id = google.auth.default(
        scopes=['https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/kubernetes.io']
    )
    credentials.refresh(google.auth.transport.requests.Request())
    
    cluster_manager_client = ClusterManagerClient(credentials=credentials)
    cluster = cluster_manager_client.get_cluster(
        name=f'projects/{project_id}/locations/{zone}/clusters/{cluster_id}'
    )
    
    configuration = client.Configuration()
    configuration.host = f"https://{cluster.endpoint}:443"
    configuration.verify_ssl = True
    # 标准Bearer token配置方式
    configuration.api_key_prefix['authorization'] = 'Bearer'
    configuration.api_key['authorization'] = credentials.token
    client.Configuration.set_default(configuration)
    

6. 排查网络连通性

  • 在Cloud Function中添加测试代码,验证与GKE控制平面的连通性:
    import requests
    test_url = f"https://{cluster.endpoint}/version"
    headers = {"Authorization": f"Bearer {credentials.token}"}
    response = requests.get(test_url, headers=headers)
    print(f"状态码: {response.status_code}, 响应内容: {response.text}")
    
    • 若返回403 Forbidden:网络已连通,但授权网络或权限配置有误
    • 若返回超时/无法连接:需检查VPC连接器路由、防火墙规则(允许443端口出站)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:37:12