在共享 VPC 宿主项目中配置连接器

如果您的组织使用共享 VPC,则您可以在服务项目或宿主项目中设置无服务器 VPC 访问通道连接器。本指南介绍了如何在宿主项目中设置连接器。

如果您需要在服务项目中设置连接器,请参阅在服务项目中配置连接器。如需了解每种方法的优点,请参阅连接到共享 VPC 网络

准备工作

  1. 检查您当前使用的帐号的 Identity and Access Management (IAM) 角色。活跃帐号必须在宿主项目上具有以下角色:

  2. 选择您的首选环境中的宿主项目。

控制台

  1. 打开 Cloud Console 信息中心。

    前往 Cloud Console 信息中心

  2. 在信息中心顶部的菜单栏中,点击项目下拉菜单,然后选择宿主项目。

gcloud

通过在终端中运行以下命令,将 gcloud CLI 中的默认项目设置为宿主项目:

gcloud config set project HOST_PROJECT_ID

替换以下内容:

  • HOST_PROJECT_ID:共享 VPC 宿主项目的 ID

创建 Serverless VPC Access 连接器

如需向您的 VPC 网络发送请求并接收相应的响应,您必须创建无服务器 VPC 访问通道连接器。您可以使用 Google Cloud Console、Google Cloud CLI 或 Terraform 创建连接器:

控制台

  1. 为您的项目启用 Serverless VPC Access API。

    启用 API

  2. 转到 Serverless VPC Access 概览页面。

    转到无服务器 VPC 访问通道

  3. 点击创建连接器

  4. 名称字段中,为连接器输入名称。该名称必须遵循 Compute Engine 命名惯例,并且少于 21 个字符。连字符 (-) 计为两个字符。

  5. 区域字段中,选择连接器的区域。此区域必须与您的无服务器服务的区域相匹配。

    如果您的服务位于 us-centraleurope-west 区域,请使用 us-central1europe-west1

  6. 网络字段中,选择要将连接器连接到的 VPC 网络。

  7. 点击子网下拉菜单:

    选择未使用的 /28 子网。

    • 子网必须专供连接器使用。其他资源(例如虚拟机、Private Service Connect 或内部 HTTP(S) 负载均衡)不能使用这些子网。
    • 如需确认您的子网未用于 Private Service Connect 或内部 HTTP(S) 负载均衡,请通过在 gcloud CLI 中运行以下命令来检查子网 purpose 是否为 PRIVATE
      gcloud compute networks subnets describe SUBNET_NAME
      
      SUBNET_NAME 替换为您的子网名称。
  8. (可选)如需设置扩缩选项以更好地控制连接器,请点击显示扩缩设置以显示扩缩表单。

    1. 设置连接器的实例数下限和上限,或使用默认值 2(下限)和 10(上限)。连接器会随着流量的增加而扩容到指定的最大值,但在流量减少时连接器不会缩容。必须使用介于 210 之间的值,并且 MIN 值必须小于 MAX 值。
    2. 在“实例类型”下拉菜单中,选择要用于连接器的机器类型,或者使用默认的 e2-micro。当您选择实例类型时,请注意右侧的费用边栏,其中显示带宽和费用估算值:
  9. 点击创建

  10. 准备就绪后,连接器名称旁边会出现绿色的对勾标记。

gcloud

  1. gcloud 组件更新到最新版本:

    gcloud components update
    
  2. 为您的项目启用 Serverless VPC Access API:

    gcloud services enable vpcaccess.googleapis.com
    
  3. 创建无服务器 VPC 访问通道连接器:

    gcloud compute networks vpc-access connectors create CONNECTOR_NAME \
    --region=REGION \
    --subnet=SUBNET \
    --subnet-project=HOST_PROJECT_ID \
    # Optional: specify minimum and maximum instance values between 2 and 10, default is 2 min, 10 max.
    --min-instances=MIN \
    --max-instances=MAX \
    # Optional: specify machine type, default is e2-micro
    --machine-type=MACHINE_TYPE
    

    替换以下内容:

    • CONNECTOR_NAME:连接器的名称。该名称必须遵循 Compute Engine 命名惯例,并且少于 21 个字符。连字符 (-) 计为两个字符。
    • REGION:连接器的区域;此区域必须与无服务器服务的区域相匹配。如果您的服务位于 us-centraleurope-west 区域,请使用 us-central1europe-west1
    • SUBNET:未使用的 /28 子网的名称。
      • 子网必须专供连接器使用。其他资源(例如虚拟机、Private Service Connect 或内部 HTTP(S) 负载均衡)不能使用这些子网。
      • 如需确认您的子网未用于 Private Service Connect 或内部 HTTP(S) 负载均衡,请通过在 gcloud CLI 中运行以下命令来检查子网 purpose 是否为 PRIVATE
        gcloud compute networks subnets describe SUBNET_NAME
        
        替换以下内容:
        • SUBNET_NAME:您的子网的名称
    • HOST_PROJECT_ID:宿主项目的 ID
    • MIN:用于连接器的实例数下限。请使用介于 29 之间的整数。默认值为 2。 如需了解连接器扩缩,请参阅吞吐量和扩缩
    • MAX:用于连接器的实例数上限。请使用介于 310 之间的整数。默认值为 10。 如果流量需要,连接器会扩容到 [MAX] 实例,但不会缩减。 如需了解连接器扩缩,请参阅吞吐量和扩缩
    • MACHINE_TYPEf1-microe2-microe2-standard-4。如需了解连接器吞吐量,包括机器类型和扩缩,请参阅吞吐量和扩缩

    如需了解详情和可选的参数,请参阅 gcloud 参考文档

  4. 在使用之前,验证连接器处于 READY 状态:

    gcloud compute networks vpc-access connectors describe CONNECTOR_NAME \
    --region=REGION
    

    替换以下内容:

    • CONNECTOR_NAME:连接器的名称;这是您在上一步中指定的名称
    • REGION:您的连接器的区域;这是您在上一步中指定的区域

    输出应包含 state: READY 行。

Terraform

您可以使用 Terraform 资源启用 vpcaccess.googleapis.com API。

resource "google_project_service" "vpcaccess-api" {
  project = var.project_id # Replace this with your project ID in quotes
  service = "vpcaccess.googleapis.com"
}

您可以使用 Terraform 模块创建 VPC 网络和子网,然后创建连接器。

module "test-vpc-module" {
  source       = "terraform-google-modules/network/google"
  version      = "~> 3.3.0"
  project_id   = var.project_id # Replace this with your project ID in quotes
  network_name = "my-serverless-network"
  mtu          = 1460

  subnets = [
    {
      subnet_name   = "serverless-subnet"
      subnet_ip     = "10.10.10.0/28"
      subnet_region = "us-central1"
    }
  ]
}

module "serverless-connector" {
  source     = "terraform-google-modules/network/google//modules/vpc-serverless-connector-beta"
  project_id = var.project_id
  vpc_connectors = [{
    name        = "central-serverless"
    region      = "us-central1"
    subnet_name = module.test-vpc-module.subnets["us-central1/serverless-subnet"].name
    # host_project_id = var.host_project_id # Specify a host_project_id for shared VPC
    machine_type  = "e2-standard-4"
    min_instances = 2
    max_instances = 7
    }
    # Uncomment to specify an ip_cidr_range
    #   , {
    #     name          = "central-serverless2"
    #     region        = "us-central1"
    #     network       = module.test-vpc-module.network_name
    #     ip_cidr_range = "10.10.11.0/28"
    #     subnet_name   = null
    #     machine_type  = "e2-standard-4"
    #     min_instances = 2
    #   max_instances = 7 }
  ]
  depends_on = [
    google_project_service.vpcaccess-api
  ]
}

为服务项目启用 Cloud Run

为服务项目启用 Cloud Run API。这是在后续步骤中添加 IAM 角色以及在服务项目中使用 Cloud Run 所必需满足的前提条件。

控制台

  1. 打开 Cloud Run API 的页面。

    Cloud Run API

  2. 在信息中心顶部的菜单栏中,点击项目下拉菜单,然后选择服务项目。

  3. 点击启用

gcloud

在终端中运行以下命令:

gcloud services enable run.googleapis.com --project=SERVICE_PROJECT_ID

替换以下内容:

  • SERVICE_PROJECT_ID:服务项目的 ID

提供对连接器的访问权限

通过为服务项目的 Cloud Run Service Agent 授予对宿主项目的 Serverless VPC Access User IAM 角色来提供对连接器的访问权限。

控制台

  1. 打开 IAM 页面。

    转到 IAM

  2. 点击项目下拉菜单,然后选择宿主项目。

  3. 点击添加

  4. 新的主帐号字段中,输入 Cloud Run 服务的 Cloud Run Service Agent 的电子邮件地址:

    service-SERVICE_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com

    替换以下内容:

    • SERVICE_PROJECT_NUMBER:与服务项目关联的项目编号。该编号与项目 ID 不同。您可以在 Cloud Console 中,在服务项目的项目设置页面上找到项目编号。
  5. 角色字段中,选择

  6. 点击保存

gcloud

在终端中运行以下命令:

gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
--member=serviceAccount:service-SERVICE_PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com \
--role=roles/vpcaccess.user

替换以下内容:

  • HOST_PROJECT_ID:共享 VPC 宿主项目的 ID
  • SERVICE_PROJECT_NUMBER:与服务帐号关联的项目编号。该编号与项目 ID 不同。您可以通过运行以下命令找到项目编号:

    gcloud projects describe SERVICE_PROJECT_ID
    

将连接器设置为可被发现

如需查看连接器,主帐号需要同时具有宿主项目和服务项目的特定查看角色。当主帐号在 Cloud Console 或其终端中查看可用连接器时,如需显示您的连接器,请为部署 App Engine 服务的主帐号添加 IAM 角色。

在宿主项目上授予 IAM 角色

在宿主项目中,为部署 Cloud Run 服务的主帐号授予 Serverless VPC Access Viewer (vpcaccess.viewer) 角色。

控制台

  1. 打开 IAM 页面。

    转到 IAM

  2. 点击项目下拉菜单,然后选择宿主项目。

  3. 点击添加

  4. 新的主帐号字段中,输入应该能够从服务项目中查看连接器的主帐号的电子邮件地址。您可以在此字段中输入多个电子邮件地址。

  5. 角色字段中,选择 Serverless VPC Access Viewer

  6. 点击保存

gcloud

在终端中运行以下命令:

gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
--member=PRINCIPAL \
--role=roles/vpcaccess.viewer

替换以下内容:

  • HOST_PROJECT_ID:共享 VPC 宿主项目的 ID
  • PRINCIPAL:部署 Cloud Run 服务的主帐号。详细了解 --member 标志

在服务项目上授予 IAM 角色

在服务项目上,为部署 Cloud Run 服务的主帐号授予 Compute Network Viewer (compute.networkViewer) 角色。

控制台

  1. 打开 IAM 页面。

    转到 IAM

  2. 点击项目下拉菜单,然后选择服务项目。

  3. 点击添加

  4. 新的主帐号字段中,输入应该能够从服务项目中查看连接器的主帐号的电子邮件地址。您可以在此字段中输入多个电子邮件地址。

  5. 角色字段中,选择 Compute Network Viewer

  6. 点击保存

gcloud

在终端中运行以下命令:

gcloud projects add-iam-policy-binding SERVICE_PROJECT_ID \
--member=PRINCIPAL \
--role=roles/compute.networkViewer

替换以下内容:

  • SERVICE_PROJECT_ID:服务项目的 ID
  • PRINCIPAL:部署 Cloud Run 服务的主帐号。详细了解 --member 标志

配置服务以使用连接器

对于需要访问共享 VPC 的每个 Cloud Run 服务,您必须为该服务指定连接器。您可以在部署新服务或更新现有服务时使用 Cloud Console、Google Cloud CLI、YAML 文件或 Terraform 来指定连接器。

控制台

  1. 转到 Cloud Run

  2. 如果您是要配置一个新服务来作为部署目标,请点击创建服务。如果您要配置现有服务,请点击该服务,然后点击修改和部署新的修订版本

  3. 如果要配置新服务,请根据需要填写初始服务设置页面,然后点击下一步 > 容器、变量和 Secret、连接、安全性转到服务配置页面。

  4. 点击连接标签。

    图片

  5. VPC 连接器字段中,选择要使用的连接器或者选择以断开服务与 VPC 网络的连接。

  6. 点击创建部署

gcloud

  1. 设置 gcloud CLI 以使用包含 Cloud Run 资源的项目:

    gcloud config set project PROJECT_ID
    替换以下内容:

    • PROJECT_ID:包含需要访问共享 VPC 的 Cloud Run 资源的项目的 ID。如果 Cloud Run 资源位于宿主项目中,则这是宿主项目 ID。如果 Cloud Run 资源位于服务项目中,则这是服务项目 ID。
  2. 使用 --vpc-connector 标志。

  • 对于现有服务:
    gcloud run services update SERVICE --vpc-connector=CONNECTOR_NAME
  • 对于新服务:
    gcloud run deploy SERVICE --image=IMAGE_URL --vpc-connector=CONNECTOR_NAME
    请替换以下内容:
    • SERVICE:服务的名称
    • IMAGE_URL:对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest
    • CONNECTOR_NAME:连接器的名称。从共享 VPC 服务项目(而不是宿主项目)进行部署时,请使用完全限定名称,例如:
      projects/HOST_PROJECT_ID/locations/CONNECTOR_REGION/connectors/CONNECTOR_NAME
      其中 HOST_PROJECT_ID 是宿主项目的 ID,CONNECTOR_REGION 是连接器的区域,CONNECTOR_NAME 是您为连接器指定的名称。

YAML

设置 gcloud CLI 以使用包含 Cloud Run 资源的项目:

gcloud config set project PROJECT_ID

替换以下内容:

  • PROJECT_ID:包含需要访问共享 VPC 的 Cloud Run 资源的项目的 ID。如果 Cloud Run 资源位于宿主项目中,则这是宿主项目 ID。如果 Cloud Run 资源位于服务项目中,则这是服务项目 ID。

您可以使用 gcloud run services describe --format export 命令下载并查看现有服务配置,该命令会生成清理后的 YAML 格式的结果。然后,您可以使用 gcloud run services replace 命令修改下述字段并上传修改后的 YAML。请务必仅修改记录的字段。

  1. 如需查看和下载配置,请运行以下命令:

    gcloud run services describe SERVICE --format export > service.yaml
  2. 在顶级 spec 特性下的 annotations 特性下添加或更新 run.googleapis.com/vpc-access-connector 特性:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/vpc-access-connector: CONNECTOR_NAME
          name: REVISION

    替换以下内容:

    • SERVICE:Cloud Run 服务的名称。
    • CONNECTOR_NAME:连接器的名称。从共享 VPC 服务项目(而不是宿主项目)进行部署时,请使用完全限定名称,例如:
      projects/HOST_PROJECT_ID/locations/CONNECTOR_REGION/connectors/CONNECTOR_NAME
      其中 HOST_PROJECT_ID 是宿主项目的 ID,CONNECTOR_REGION 是连接器的区域,CONNECTOR_NAME 是您为连接器指定的名称。
    • REVISION 替换为新的修订版本名称或者将其删除(如果存在)。如果您提供新的修订版本名称,则该名称必须满足以下条件:
      • 开头为 SERVICE-
      • 仅包含小写字母、数字和 -
      • 不以 - 结尾
      • 不超过 63 个字符
  3. 使用以下命令将服务替换为其新配置:

    gcloud run services replace service.yaml

Terraform

您可以使用 Terraform 资源创建服务,并将其配置为使用您的连接器。

# Cloud Run service
resource "google_cloud_run_service" "gcr_service" {
  name     = "mygcrservice"
  provider = google-beta
  location = "us-west1"

  template {
    spec {
      containers {
        image = "us-docker.pkg.dev/cloudrun/container/hello"
        resources {
          limits = {
            cpu = "1000m"
            memory = "512M"
          }
        }
      }
      # the service uses this SA to call other Google Cloud APIs
      # service_account_name = myservice_runtime_sa
    }

    metadata {
      annotations = {
        # Limit scale up to prevent any cost blow outs!
        "autoscaling.knative.dev/maxScale" = "5"
        # Use the VPC Connector
        "run.googleapis.com/vpc-access-connector" = google_vpc_access_connector.connector.name
        # all egress from the service should go through the VPC Connector
        "run.googleapis.com/vpc-access-egress" = "all-traffic"
      }
    }
  }
  autogenerate_revision_name = true
}

后续步骤