预配共享 VPC

您可以使用共享 VPC 将宿主项目 VPC 网络中的子网导出到同一组织中的其他服务项目。这些服务项目中的实例可以在该宿主项目的共享子网中进行网络连接。本页面介绍了如何设置和使用共享 VPC,包括为您的组织进行一些必要的管理准备。

配额、限制和符合条件的资源

在开始之前,请确保您已熟悉共享 VPC 概览IAM 概览。具体而言:

让您的组织做好准备

管理员和 IAM

让您的组织做好准备、设置共享 VPC 宿主项目并使用共享 VPC 网络,这至少涉及到 3 个不同的管理型身份和访问权限管理 (IAM) 角色。如需详细了解每个角色并了解可选角色,请参阅“共享 VPC 概览”的管理员和 IAM 部分。

共享 VPC 的组织政策

组织政策限制可以在项目、文件夹或组织级别保护共享 VPC 资源。各项政策详见下方。

防止意外删除宿主项目

意外删除某个宿主项目会导致关联到其中的所有服务项目中断。如果将某个项目配置为共享 VPC 宿主项目,则系统会为该项目设置一种名为“安全锁”的特殊锁。只要有安全锁,就可防止该项目被意外删除。不再为共享 VPC 配置该宿主项目时,系统会自动从该宿主项目中移除安全锁。

拥有 orgpolicy.policyAdmin 角色的用户可指定组织级政策限制条件 (constraints/compute.restrictXpnProjectLienRemoval),限制只有以下角色可移除安全锁:

  • 拥有组织级层的 roles/ownerroles/resourcemanager.lienModifier 权限的用户
  • 拥有组织级层的 resourcemanager.projects.get resourcemanager.projects.updateLiens 权限的自定义角色用户

这样可以有效地防止没有组织级层的 roles/owner 角色或 resourcemanager.lienModifier 角色的项目所有者意外删除共享 VPC 宿主项目。如需详细了解与 resourcemanager.lienModifier 角色相关的权限,请参阅 Resource Manager 文档中的为项目设置安全锁

由于组织政策适用于组织中的所有项目,因此您只需按以下步骤操作一次即可限制安全锁的移除操作。

  1. gcloud 证明您是 Organization Admin 或拥有 orgpolicy.policyAdmin 角色的 IAM 成员。将 ORG_ADMIN 替换为 Organization Admin 的名称:

    gcloud auth login ORG_ADMIN
    
  2. 通过查看此命令的输出结果来确定您的组织 ID 编号。

    gcloud organizations list
    
  3. 通过运行以下命令,针对您的组织强制执行 compute.restrictXpnProjectLienRemoval 政策。将 ORG_ID 替换为您在上一步确定的编号。

    gcloud beta resource-manager org-policies enable-enforce \
        --organization ORG_ID compute.restrictXpnProjectLienRemoval
    
  4. 如果您以 Organization Admin 的身份完成了任务,请退出 gcloud 以保护您的帐号。

    gcloud auth revoke ORG_ADMIN
    

限制宿主项目附加

默认情况下,Shared VPC Admin 可以将非宿主项目附加到同一组织中的任何宿主项目。组织政策管理员可以限制某个非宿主项目或者文件夹或组织中的多个非宿主项目可附加到的宿主项目集。如需了解详情,请参阅 constraints/compute.restrictSharedVpcHostProjects 限制条件。

限制宿主项目中可供服务项目使用的子网

默认情况下,配置共享 VPC 后,服务项目中的 IAM 成员如果具有相应 IAM 权限,则可以使用宿主项目中的任何子网。除了管理单个用户权限外,组织政策管理员还可以设置相关政策,来定义一组可供特定项目或供文件夹/组织中的项目访问的子网。如需了解详情,请参阅 constraints/compute.restrictSharedVpcSubnetworks 限制条件。

指定 Shared VPC Admin

Organization Admin 可将 Shared VPC AdminProject IAM Admin 角色授予一个或多个 IAM 成员。Project IAM Admin 角色授予 Shared VPC Admin 共享所有现有和未来子网(而不仅仅是单个子网)的权限。此授权将在组织或文件夹级别(而非项目级别)建立绑定关系。因此,必须在组织中定义 IAM 成员,而不仅仅是在项目中进行定义。

Console

如需在组织级别授予 Shared VPC Admin 角色,请执行以下操作:

  1. 以 Organization Admin 身份登录 Google Cloud Console,然后转到 IAM 页面。
    转到 IAM 页面
  2. 从项目菜单中选择您的组织。
    如果选择的是项目,则不会在角色菜单中看到正确的条目。
  3. 点击添加
  4. 输入成员的电子邮件地址。
  5. 角色下拉列表中,依次选择 Compute Engine > Compute Shared VPC Admin

  6. 点击添加其他角色

  7. 角色下拉列表中,依次选择 Resource Manager > Project IAM Admin

  8. 点击保存

如需在文件夹级别授予 Shared VPC Admin 角色,请执行以下操作:

  1. 以 Organization Admin 身份登录 Google Cloud Console,然后转到 IAM 页面。
    转到 IAM 页面
  2. 从项目菜单中选择您的文件夹。
    如果您选择了某个项目或组织,则无法看到正确的选项。
  3. 成员页面上,点击添加
  4. 输入新成员的电子邮件地址。
  5. 选择角色下,依次选择 Compute Engine > Compute Shared VPC Admin
  6. 点击添加其他角色
  7. 角色下拉列表中,依次选择 Resource Manager > Project IAM Admin
  8. 点击保存

gcloud

  1. 以 Organization Admin 的身份向 gcloud 进行验证。将 ORG_ADMIN 替换为 Organization Admin 的名称:

    gcloud auth login ORG_ADMIN
    
  2. 通过查看此命令的输出结果来确定您的组织 ID 编号。

    gcloud organizations list
    
  3. 如果要在组织级别分配共享 VPC 管理员角色,请执行以下操作:

    1. 将 Shared VPC Admin 角色应用到现有 IAM 成员。将 ORG_ID 替换为您在上一步确定的组织 ID 编号,并将 EMAIL_ADDRESS 替换为将被授予 Shared VPC Admin 角色的用户的电子邮件地址。

      gcloud organizations add-iam-policy-binding ORG_ID \
        --member='user:EMAIL_ADDRESS' \
        --role="roles/compute.xpnAdmin"
      
      gcloud organizations add-iam-policy-binding ORG_ID \
        --member='user:EMAIL_ADDRESS' \
        --role="roles/resourcemanager.projectIamAdmin"
      
  4. 如果要在文件夹级别分配 Shared VPC Admin 角色,请执行以下操作:

    1. 通过查看此命令的输出结果来确定您的文件夹 ID。

      gcloud beta resource-manager folders list --organization=ORG_ID
      
    2. 将 Shared VPC Admin 角色应用到现有 IAM 成员。将 ORG_ID 替换为您在上一步确定的组织 ID 编号,并将 EMAIL_ADDRESS 替换为将被授予 Shared VPC Admin 角色的用户的电子邮件地址。

      gcloud beta resource-manager folders add-iam-policy-binding FOLDER_ID \
         --member='user:EMAIL_ADDRESS' \
         --role="roles/compute.xpnAdmin"
      
      gcloud beta resource-manager folders add-iam-policy-binding FOLDER_ID \
         --member='user:EMAIL_ADDRESS' \
         --role="roles/resourcemanager.projectIamAdmin"
      
  5. 完成保护帐号的任务后,在 gcloud 命令行工具中撤消您的 Organization Admin 帐号令牌。

    gcloud auth revoke ORG_ADMIN
    

API

  • 如需在组织级别分配 Shared VPC Admin 角色,请按以下步骤操作:

    1. 确定您的组织 ID 编号。

      POST https://cloudresourcemanager.googleapis.com/v1/organizations
      
    2. 描述并记录您的现有组织政策的详细信息。

      POST https://cloudresourcemanager.googleapis.com/v1/organizations/ORG_ID:getIamPolicy
      

      ORG_ID 替换为您的组织的 ID。

    3. 分配 Shared VPC Admin 角色。

      POST https://cloudresourcemanager.googleapis.com/v1/organizations/ORG_ID:setIamPolicy
      {
        "bindings": [
          ...copy existing bindings
          {
            "members": [
              "user:EMAIL_ADDRESS"
            ],
            "role": "roles/compute.xpnAdmin"
          },
          {
            "members": [
              "user:EMAIL_ADDRESS"
            ],
            "role": "roles/resourcemanager.projectIamAdmin"
          }
        ],
        "etag": "ETAG",
        "version": 1,
        ...other exisitng policy details
      }
      

      请将占位符替换为有效值:

      • ORG_ID 是您要授予 Shared VPC Admin 角色的用户所在组织的 ID。
      • EMAIL_ADDRESS 是用户的电子邮件地址。
      • ETAG 是您在描述现有政策时获得的唯一标识符。如果同时发送多个更新请求,它可以防止发生冲突。

      如需了解详情,请参阅 organizations.setIamPolicy 方法。

  • 如需在文件夹级别分配 Shared VPC Admin 角色,请使用以下请求:

    1. 确定您的组织 ID 编号。

      POST https://cloudresourcemanager.googleapis.com/v1/organizations
      
    2. 找到您的文件夹 ID。

      GET https://cloudresourcemanager.googleapis.com/v2/folders?parent=organizations/ORG_ID
      

      ORG_ID 替换为您的组织的 ID。

    3. 描述并记录您的现有文件夹政策的详细信息。

      POST https://cloudresourcemanager.googleapis.com/v2/folders/FOLDER_ID:getIamPolicy
      

      FOLDER_ID 替换为您的文件夹 ID。

    4. 分配 Shared VPC Admin 角色。

      POST https://cloudresourcemanager.googleapis.com/v1/organizations/FOLDER_ID:setIamPolicy
      {
        "bindings": [
          ...copy existing bindings
          {
            "members": [
              "user:EMAIL_ADDRESS"
            ],
            "role": "roles/compute.xpnAdmin"
          },
          {
            "members": [
              "user:EMAIL_ADDRESS"
            ],
            "role": "roles/resourcemanager.projectIamAdmin"
          }
        ],
        "etag": "ETAG",
        "version": 1,
        ...other existing policy details
      }
      

      请将占位符替换为有效值:

      • FOLDER_ID 是您要授予 Shared VPC Admin 角色的用户所在组织的 ID。
      • EMAIL_ADDRESS 是用户的电子邮件地址。
      • ETAG 是您在描述现有政策时获得的唯一标识符。如果同时发送多个更新请求,它可以防止发生冲突。

      如需了解详情,请参阅 folders.setIamPolicy 方法。

设置共享 VPC

本部分中的所有任务都必须由共享 VPC 管理员执行。

启用宿主项目

在组织内,Shared VPC Admin 可以按照下文所述的步骤,将项目指定为共享 VPC 宿主项目(受配额和限制的约束)。此外,如果 Shared VPC Admin 具有组织的 resourcemanager.projectCreatorresourcemanager.projectDeleter 角色,那么他们还可以创建和删除项目。

Console

  1. 转到 Google Cloud Console 中的“共享 VPC”页面。
    转到“共享 VPC”页面
  2. 以 Shared VPC Admin 的身份登录。
  3. 从项目选择器中选择要作为共享 VPC 宿主项目启用的项目。
  4. 点击设置共享 VPC
  5. 在下一页上,点击启用宿主项目下的保存并继续
  6. 选择子网下,执行以下任一操作:
    1. 如果您需要与后续步骤中指定的服务项目和 Service Project Admin 共享宿主项目 VPC 网络中当前和未来的所有子网,请点击共享所有子网(项目级权限)
    2. 如果您需要与服务项目和服务项目管理员有选择性地共享宿主项目 VPC 网络中的子网,请点击个别子网(子网级权限),然后选择要共享的子网
  7. 点击继续
    系统会显示下一页。
  8. 项目名称中,指定要关联到宿主项目的服务项目。请注意,关联服务项目时不会定义任何 Service Project Admin;这项操作将在下一步中完成。
  9. 按角色选择用户部分,添加 Service Project Admin。系统会为这些用户授予共享子网的 IAM 角色 compute.networkUser。只有 Service Project Admin 可以在共享 VPC 宿主项目的子网中创建资源。
  10. 点击保存

gcloud

  1. 以 Shared VPC Admin 的身份向 gcloud 进行验证。将 SHARED_VPC_ADMIN 替换为 Shared VPC Admin 的名称:

    gcloud auth login SHARED_VPC_ADMIN
    
  2. 为需要成为宿主项目的项目启用共享 VPC。将 HOST_PROJECT_ID 替换为相应项目的 ID。

    如您有组织级别的 Shared VPC Admin 角色,请运行以下命令:

    gcloud compute shared-vpc enable HOST_PROJECT_ID
    

    如您有文件夹级别的 Shared VPC Admin 角色,请运行以下命令:

    gcloud beta compute shared-vpc enable HOST_PROJECT_ID
    
  3. 确认该项目已作为组织的宿主项目列出。将 ORG_ID 替换为您的组织 ID(由 gcloud organizations list 确定)。

    gcloud compute shared-vpc organizations list-host-projects ORG_ID
    
  4. 如果您只需要启用宿主项目,则可退出 gcloud 来保护您的 Shared VPC Admin 帐号凭据。否则,请跳过此步骤,继续执行关联服务项目的步骤。

    gcloud auth revoke SHARED_VPC_ADMIN
    

API

  1. 使用具有 Shared VPC Admin 权限的凭据为项目启用共享 VPC。

    • 如果您在组织级层拥有 Shared VPC Admin 角色,请使用 v1 API:

      POST https://compute.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/enableXpnHost
      
    • 如果您在文件夹级层拥有 Shared VPC Admin 角色,请使用 Beta 版 API:

      POST https://compute.googleapis.com/compute/beta/projects/HOST_PROJECT_ID/enableXpnHost
      

    HOST_PROJECT_ID 替换为项目 ID,此项目将成为共享 VPC 宿主项目。

    如需了解详情,请参阅 projects.enableXpnHost 方法。

  2. 确认该项目已作为宿主项目列出。

    POST https://compute.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/listXpnHosts
    

    HOST_PROJECT_ID 替换为共享 VPC 宿主项目的 ID。

    如需了解详情,请参阅 projects.listXpnHosts 方法。

关联服务项目

服务项目必须先关联到宿主项目,其服务项目管理员才可以使用共享 VPC。要完成这种关联,共享 VPC 管理员必须执行以下步骤。

一个服务项目只能关联到一个宿主项目,但一个宿主项目可以关联多个服务项目。如需了解详情,请参阅 VPC 配额页面上特定于共享 VPC 的限制

Console

  1. 以 Shared VPC Admin 的身份登录 Google Cloud Console。
  2. 转到 Google Cloud Console 中的“共享 VPC”页面。
    转到“共享 VPC”页面
  3. 点击关联的项目标签。
  4. 关联的项目标签下,点击关联项目按钮。
  5. 项目名称部分中,选中要关联的服务项目所对应的复选框。请注意,关联服务项目时不会定义任何 Service Project Admin;这项操作将在下一步中完成。
  6. VPC 网络权限部分,选择其成员将获得 compute.networkUser 角色的角色。根据 VPC 网络共享模式,IAM 成员被授予整个宿主项目或宿主项目中的特定子网的 Network User 角色。这些成员在各自的服务项目中被称为 Service Project Admin。
  7. VPC 网络共享模式部分中,选择以下任一选项:
    1. 点击共享所有子网(项目级权限),与所有服务项目和 Service Project Admin 共享宿主项目 VPC 网络中当前和未来的所有子网。
    2. 如果您需要与服务项目和服务项目管理员有选择性地共享宿主项目 VPC 网络中的子网,请点击个别子网(子网级权限),然后选择要共享的子网
  8. 点击保存

gcloud

  1. 以 Shared VPC Admin 的身份向 gcloud 进行验证(如果尚未验证)。将 SHARED_VPC_ADMIN 替换为 Shared VPC Admin 的名称:

    gcloud auth login SHARED_VPC_ADMIN
    
  2. 将服务项目关联到之前启用的宿主项目。将 SERVICE_PROJECT_ID 替换为服务项目的项目 ID,并将 HOST_PROJECT_ID 替换为宿主项目的项目 ID。

    如您有组织级别的 Shared VPC Admin 角色,请运行以下命令:

    gcloud compute shared-vpc associated-projects add SERVICE_PROJECT_ID \
        --host-project HOST_PROJECT_ID
    

    如您有文件夹级别的 Shared VPC Admin 角色,请运行以下命令:

    gcloud beta compute shared-vpc associated-projects add SERVICE_PROJECT_ID \
        --host-project HOST_PROJECT_ID
    
  3. 确认服务项目已关联。

    gcloud compute shared-vpc get-host-project SERVICE_PROJECT_ID
    
  4. (可选)您可以列出已关联到宿主项目的服务项目:

    gcloud compute shared-vpc list-associated-resources HOST_PROJECT_ID
    
  5. 如果您只需要关联服务项目,可退出 gcloud 来保护您的 Shared VPC Admin 帐号凭据。否则,您可以跳过此步骤,然后针对所有子网仅针对部分子网指定 Service Project Admin。

    gcloud auth revoke SHARED_VPC_ADMIN
    

API

  1. 将服务项目关联到共享 VPC 宿主项目。

    • 如果您在组织级层拥有 Shared VPC Admin 角色,请使用 v1 API:

      POST https://compute.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/enableXpnResource
      {
      "xpnResource": {
        "id": "SERVICE_PROJECT"
      }
      }
      
    • 如果您在文件夹级层拥有 Shared VPC Admin 角色,请使用 Beta 版 API:

      POST https://compute.googleapis.com/compute/beta/projects/HOST_PROJECT_ID/enableXpnResource
      {
      "xpnResource": {
        "id": "SERVICE_PROJECT"
      }
      }
      

    请将占位符替换为有效值:

    • HOST_PROJECT_ID 是共享 VPC 宿主项目的 ID。
    • SERVICE_PROJECT 是要连接的服务项目的 ID。

    如需了解详情,请参阅 projects.enableXpnResource 方法。

  2. 确认服务项目已关联到宿主项目。

    GET https://compute.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/getXpnResources
    

    请将占位符替换为有效值:

    • HOST_PROJECT_ID 是共享 VPC 宿主项目的 ID。

    如需了解详情,请参阅 projects.getXpnResources 方法。

有权访问所有子网的 Service Project Admin

Shared VPC Admin 可以将服务项目中的 IAM 成员指定为 Service Project Admin,授予其访问宿主项目中所有子网的权限。系统会向此类 Service Project Admin 授予整个宿主项目的 compute.networkUser 角色。这意味着,他们有权访问宿主项目中当前指定的子网和未来的所有子网。

Console

如需通过 Cloud Console 将服务项目中的 IAM 成员指定为 Service Project Admin,并使其有权访问宿主项目中的所有子网,请参阅关联服务项目部分。

gcloud

下面的步骤介绍了如何将服务项目中的 IAM 成员指定为 Service Project Admin,并使其有权访问宿主项目中的所有子网。在执行这些步骤之前,您必须先启用宿主项目,并将服务项目关联到该宿主项目

  1. 以 Shared VPC Admin 的身份向 gcloud 进行验证(如果尚未验证)。将 SHARED_VPC_ADMIN 替换为 Shared VPC Admin 的名称:

    gcloud auth login SHARED_VPC_ADMIN
    
  2. 建立政策绑定关系,将服务项目中的 IAM 成员指定为 Service Project Admin。将 HOST_PROJECT_ID 替换为宿主项目的 ID,将 SERVICE_PROJECT_ADMIN 替换为 Service Project Admin 用户的电子邮件地址。

    gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
    --member "user:SERVICE_PROJECT_ADMIN" \
    --role "roles/compute.networkUser"
    

    通过更改 --member 参数的格式,您可以指定不同类型的成员:

    • 使用 group: 可将 Google 群组(按电子邮件地址)指定为成员。
    • 使用 domain: 可将 Google 网域指定为成员。
    • 使用 serviceAccount: 指定服务帐号。如需详细了解这种使用情形,请参阅服务帐号作为 Service Project Admin
  3. 针对您需要定义的其他各个 Service Project Admin 重复执行上一步。

  4. 如果 Service Project Admin 已定义完毕,您可退出 gcloud 以保护您的 Shared VPC Admin 帐号凭据。

    gcloud auth revoke SHARED_VPC_ADMIN
    

API

  1. 描述并记录您的现有项目政策的详细信息。您需要现有政策和 etag 值。

    POST https://cloudresourcemanager.googleapis.com/v2/projects/HOST_PROJECT_ID:getIamPolicy
    

    HOST_PROJECT_ID 替换为共享 VPC 网络所在宿主项目的 ID。

  2. 创建政策绑定,将服务项目中的 IAM 成员指定为 Service Project Admin。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/HOST_PROJECT_ID:setIamPolicy
    {
      "bindings": [
        ...copy existing bindings
        {
          "members": [
            MEMBER,
            ...additional members
          ],
          "role": "roles/compute.networkUser"
        },
      ],
      "etag": "ETAG",
      "version": 1,
      ...other existing policy details
    }
    

    请将占位符替换为有效值:

    • HOST_PROJECT_ID 是共享 VPC 网络所在宿主项目的 ID。
    • MEMBER 是与角色关联的身份,例如用户、群组、网域或服务帐号。如需了解详情,请参阅 Resource Manager 文档中的 members 字段。
    • ETAG 是您在描述现有政策时获得的唯一标识符。如果同时发送多个更新请求,它可以防止发生冲突。

    如需了解详情,请参阅 projects.setIamPolicy 方法。

有权访问部分子网的 Service Project Admin

Shared VPC Admin 可以将服务项目中的 IAM 成员指定为 Service Project Admin,并使其有权访问宿主项目中的部分子网。通过此选项,Shared VPC Admin 能以更精细的方式指定 Service Project Admin,即仅向他们授予宿主项目中部分子网的 compute.networkUser 角色。

Console

如需通过 Cloud Console 将服务项目中的 IAM 成员指定为 Service Project Admin,并使其有权访问宿主项目中的部分子网,请参阅关联服务项目部分。

gcloud

下面的步骤介绍了如何将服务项目中的 IAM 成员指定为 Service Project Admin,并使其有权访问宿主项目中的部分子网。在定义此类管理员之前,您必须先启用宿主项目,并将服务项目关联到该宿主项目

  1. 以 Shared VPC Admin 的身份向 gcloud 进行验证(如果尚未验证)。将 SHARED_VPC_ADMIN 替换为 Shared VPC Admin 的名称:

    gcloud auth login SHARED_VPC_ADMIN
    
  2. 在宿主项目中选择 Service Project Admin 应有权访问的子网。获取该子网当前的 IAM 政策(采用 JSON 格式)。将 SUBNET_NAME 替换为宿主项目中相应子网的名称,并将 HOST_PROJECT_ID 替换为宿主项目的项目 ID。

    gcloud beta compute networks subnets get-iam-policy SUBNET_NAME \
        --region SUBNET_REGION \
        --project HOST_PROJECT_ID \
        --format json
    
  3. 复制上一步的 JSON 输出内容并将其保存到文件中。为简明起见,这些步骤将其保存到名为 subnet-policy.json 的文件中。

  4. 修改 subnet-policy.json 文件,添加将成为 Service Project Admin 且有权访问该子网的 IAM 成员。将每个 SERVICE_PROJECT_ADMIN 替换为服务项目中 IAM 用户的电子邮件地址。

    {
      "bindings": [
      {
         "members": [
               "user:[SERVICE_PROJECT_ADMIN]",
               "user:[SERVICE_PROJECT_ADMIN]"
            ],
            "role": "roles/compute.networkUser"
      }
      ],
      "etag": "[ETAG_STRING]"
    }
    

    请注意,您可以在该政策中指定不同类型的 IAM 成员(用户之外):

    • user: 切换为 group:,以将 Google 群组(按电子邮件地址)指定为成员。
    • user: 切换为 domain:,以将 Google 网域指定为成员。
    • 使用 serviceAccount: 指定服务帐号。如需详细了解这种使用情形,请参阅服务帐号作为 Service Project Admin
  5. 使用 subnet-policy.json 文件的内容更新子网的政策绑定关系。

    gcloud beta compute networks subnets set-iam-policy SUBNET_NAME subnet-policy.json \
        --region SUBNET_REGION \
        --project HOST_PROJECT_ID
    
  6. 如果 Service Project Admin 已定义完毕,您可退出 gcloud 以保护您的 Shared VPC Admin 帐号凭据。

    gcloud auth revoke SHARED_VPC_ADMIN
    

API

  1. 描述并记录您的现有子网政策的详细信息。您需要现有政策和 etag 值。

    GET https://compute.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/regions/SUBNET_REGION/subnetworks/SUBNET_NAME/getIamPolicy
    

    请将占位符替换为有效值:

    • HOST_PROJECT_ID 是共享 VPC 网络所在宿主项目的 ID。
    • SUBNET_NAME 是要共享的子网的名称。
    • SUBNET_REGION 是子网所在的区域。
  2. 通过更新子网政策,向 Service Project Admin 授予访问宿主项目中的子网的权限。

    POST https://compute.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/regions/SUBNET_REGION/subnetworks/SUBNET_NAME/setIamPolicy
    {
      "bindings": [
        ...copy existing bindings
        {
          "members": [
            MEMBER,
            ...additional members
          ],
          "role": "roles/compute.networkUser"
        },
      ],
      "etag": "ETAG",
      "version": 1,
      ...other existing policy details
    }
    

    请将占位符替换为有效值:

    • ETAG 是您在描述现有政策时获得的唯一标识符。如果同时发送多个更新请求,它可以防止发生冲突。
    • HOST_PROJECT_ID 是共享 VPC 网络所在宿主项目的 ID。
    • MEMBER 是与角色关联的身份,例如用户、群组、网域或服务帐号。如需了解详情,请参阅 Resource Manager 文档中的 members 字段。
    • SUBNET_NAME 是要共享的子网的名称。
    • SUBNET_REGION 是子网所在的区域。

    如需了解详情,请参阅 subnetworks.setIamPolicy 方法。

服务帐号作为 Service Project Admin

共享 VPC 管理员还可以将服务项目中的服务帐号指定为服务项目管理员。本部分介绍了如何将两种不同类型的服务帐号定义为 Service Project Admin:

与其他 IAM 成员一样,可以针对宿主项目的所有子网或者仅部分子网授予 Service Project Admin 角色 (compute.networkUser)。不过为了简单起见,本部分仅介绍如何将这两种类型的服务帐号指定为 Service Project Admin,并使其有权访问宿主项目的所有子网

用户管理服务帐号作为服务项目管理员

下面的内容说明了如何将用户管理服务帐号指定为 Service Project Admin,并使其有权访问共享 VPC 宿主项目的所有子网。

Console

  1. 以 Shared VPC Admin 的身份登录 Google Cloud Console。
  2. 转到 Google Cloud Console 中的“设置”页面。
    转到“设置”页面
  3. 将项目更改为需要定义为 Service Project Admin 的服务帐号所在的服务项目。
  4. 复制服务项目的项目 ID。为简明起见,这些步骤将服务项目 ID 表示为 SERVICE_PROJECT_ID
  5. 将项目更改为共享 VPC 宿主项目。
  6. 在 Google Cloud Console 中转到 IAM 页面:
    转到 IAM 页面
  7. 点击添加
  8. SERVICE_ACCOUNT_NAME@SERVICE_PROJECT_ID.iam.gserviceaccount.com 添加到成员字段,需将 SERVICE_ACCOUNT_NAME 替换为服务帐号的名称。
  9. 角色菜单中依次选择 Compute Engine > Compute Network User
  10. 点击添加

gcloud

  1. 以 Shared VPC Admin 的身份向 gcloud 进行验证(如果尚未验证)。将 SHARED_VPC_ADMIN 替换为 Shared VPC Admin 的名称:

    gcloud auth login SHARED_VPC_ADMIN
    
  2. 如果您不知道该服务项目的项目 ID,则可以列出您组织中的所有项目。此列表会显示每个项目的项目 ID。

    gcloud projects list
    
  3. 建立政策绑定关系,将服务帐号指定为 Service Project Admin。将 HOST_PROJECT_ID 替换为宿主项目的项目 ID,将 SERVICE_ACCOUNT_NAME 替换为服务帐号的名称,并将 SERVICE_PROJECT_ID 替换为服务项目 ID。

    gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
        --member "serviceAccount:SERVICE_ACCOUNT_NAME@SERVICE_PROJECT_ID.iam.gserviceaccount.com" \
        --role "roles/compute.networkUser"
    

API

  1. 描述并记录您的现有项目政策的详细信息。您需要现有政策和 etag 值。

    POST https://cloudresourcemanager.googleapis.com/v2/projects/HOST_PROJECT_ID:getIamPolicy
    

    HOST_PROJECT_ID 替换为共享 VPC 网络所在宿主项目的 ID。

  2. 创建政策绑定,将服务帐号指定为 Service Project Admin。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/HOST_PROJECT_ID:setIamPolicy
    {
      "bindings": [
        ...copy existing bindings
        {
          "members": [
            "serviceAccount:SERVICE_ACCOUNT_NAME@SERVICE_PROJECT_ID.iam.gserviceaccount.com",
            ...include additional service accounts
          ],
          "role": "roles/compute.networkUser"
        },
      ],
      "etag": "ETAG",
      "version": 1,
      ...other existing policy details
    }
    

    请将占位符替换为有效值:

    • HOST_PROJECT_ID 是共享 VPC 网络所在宿主项目的 ID。
    • SERVICE_ACCOUNT_NAME 是服务帐号的名称。
    • SERVICE_PROJECT_ID 是服务帐号所在服务项目的 ID。
    • ETAG 是您在描述现有政策时获得的唯一标识符。如果同时发送多个更新请求,它可以防止发生冲突。

    如需了解详情,请参阅 projects.setIamPolicy 方法。

Google API 服务帐号作为 Service Project Admin

下面的内容说明了如何将 Google API 服务帐号指定为 Service Project Admin,并使其有权访问共享 VPC 宿主项目的所有子网。如需将托管实例组与共享 VPC 结合使用,需要将 Google API 服务帐号设为 Service Project Admin,因为创建实例等任务是由此类服务帐号执行的。如需详细了解这种关系,请参阅代管实例组和 IAM

Console

  1. 以 Shared VPC Admin 的身份登录 Google Cloud Console。
  2. 转到 Google Cloud Console 中的“设置”页面。
    转到“设置”页面
  3. 将项目更改为需要定义为 Service Project Admin 的服务帐号所在的服务项目。
  4. 复制服务项目的项目编号。为简明起见,这些步骤将服务项目编号表示为 SERVICE_PROJECT_NUMBER
  5. 将项目更改为共享 VPC 宿主项目。
  6. 在 Google Cloud Console 中转到 IAM 页面:
    转到 IAM 页面
  7. 点击添加
  8. SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.com 添加到成员字段。
  9. 角色菜单中依次选择 Compute Engine > Compute Network User
  10. 点击添加

gcloud

  1. 以 Shared VPC Admin 的身份向 gcloud 进行验证(如果尚未验证)。将 SHARED_VPC_ADMIN 替换为 Shared VPC Admin 的名称:

    gcloud auth login SHARED_VPC_ADMIN
    
  2. 确定相应服务项目的项目编号。为简明起见,这些步骤将服务项目编号表示为 SERVICE_PROJECT_NUMBER。将 SERVICE_PROJECT_ID 替换为相应服务项目的项目 ID。

    gcloud projects describe SERVICE_PROJECT_ID --format='get(projectNumber)'
    
    • 如果您不知道该服务项目的项目 ID,则可以列出您组织中的所有项目。此列表会显示每个项目的项目编号。

      gcloud projects list
      
  3. 建立政策绑定关系,将服务帐号指定为 Service Project Admin。将 HOST_PROJECT_ID 替换为宿主项目的项目 ID,并将 SERVICE_PROJECT_NUMBER 替换为服务项目编号。

    gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
        --member "serviceAccount:SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.com" \
        --role "roles/compute.networkUser"
    

API

  1. 描述并记录您的现有项目政策的详细信息。您需要现有政策和 etag 值。

    POST https://cloudresourcemanager.googleapis.com/v2/projects/HOST_PROJECT_ID:getIamPolicy
    

    HOST_PROJECT_ID 替换为共享 VPC 网络所在宿主项目的 ID。

  2. 列出您的项目以查找其项目编号。

    GET https://cloudresourcemanager.googleapis.com/v1/projects?filter=projectId="SERVICE_PROJECT_ID"
    

    SERVICE_PROJECT_ID 替换为服务帐号所在服务项目的 ID。

  3. 创建政策绑定,将服务帐号指定为 Service Project Admin。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/HOST_PROJECT_ID:setIamPolicy
    {
      "bindings": [
        ...copy existing bindings
        {
          "members": [
            "serviceAccount:SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.com"
          ],
          "role": "roles/compute.networkUser"
        },
      ],
      "etag": "ETAG",
      "version": 1,
      ...other existing policy details
    }
    

    请将占位符替换为有效值:

    • HOST_PROJECT_ID 是共享 VPC 网络所在宿主项目的 ID。
    • SERVICE_PROJECT_NUMBER 是服务帐号所在服务项目的编号。
    • ETAG 是您在描述现有政策时获得的唯一标识符。如果同时发送多个更新请求,它可以防止发生冲突。

    如需了解详情,请参阅 projects.setIamPolicy 方法。

使用共享 VPC

在 Shared VPC Admin 完成以下任务后,Service Project Admin 可以使用宿主项目的子网在服务项目中创建实例、模板和内部负载平衡器:启用宿主项目将必要的服务项目关联到宿主项目,以及针对宿主项目的全部部分子网定义 Service Project Admin。

本部分中的所有任务都必须由服 Service Project Admin 执行。

请务必注意,Shared VPC Admin 仅向 Service Project Admin 授予 compute.networkUser 角色,使其能够访问整个宿主项目或该项目的部分子网。Service Project Admin 还应拥有管理其各自服务项目所必需的其他角色。例如,Service Project Admin 还可同时是项目所有者,或者至少应具有项目的 compute.instanceAdmin 角色

列出可用的子网

Service Project Admin 可以按以下步骤列出其获得权限的子网。

Console

转到 Google Cloud Console 中的“共享 VPC”页面。
转到“共享 VPC”页面

gcloud

  1. 以 Service Project Admin 的身份向 gcloud 进行验证(如果尚未验证)。将 SERVICE_PROJECT_ADMIN 替换为 Service Project Admin 的名称:

    gcloud auth login SERVICE_PROJECT_ADMIN
    
  2. 运行以下命令,将 HOST_PROJECT_ID 替换为共享 VPC 宿主项目的项目 ID:

    gcloud compute networks subnets list-usable --project HOST_PROJECT_ID
    

    以下示例列出了 project-1 宿主项目中的可用子网:

    $ gcloud compute networks subnets list-usable --project project-1
    
    PROJECT    REGION       NETWORK  SUBNET    RANGE          SECONDARY_RANGES
    project-1  us-west1     net-1    subnet-1  10.138.0.0/20
    project-1  us-central1  net-1    subnet-2  10.128.0.0/20  r-1 192.168.2.0/24
                                                              r-2 192.168.3.0/24
    project-1  us-east1     net-1    subnet-3  10.142.0.0/20
    

要了解详情,请参阅 SDK 文档中的 list-usable 命令。

API

列出宿主项目中的可用子网。以 Service Project Admin 身份发出请求。

GET https://compute.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/aggregated/subnetworks/listUsable

HOST_PROJECT_ID 替换为共享 VPC 网络所在宿主项目的 ID。

如需了解详情,请参阅 subnetworks.listUsable 方法。

预留静态内部 IP

服务项目管理员可以在共享 VPC 网络的子网中保留内部 IP 地址。请注意,IP 地址配置对象是在服务项目中创建的,而其值在所选共享子网中的可用地址范围内。

gcloud

  1. 以 Service Project Admin 的身份向 gcloud 进行验证(如果尚未验证)。将 SERVICE_PROJECT_ADMIN 替换为 Service Project Admin 的名称:

    gcloud auth login SERVICE_PROJECT_ADMIN
    
  2. 运行以下命令,将 HOST_PROJECT_ID 替换为共享 VPC 宿主项目的项目 ID:

    gcloud compute addresses create IP_ADDR_NAME \
    --project SERVICE_PROJECT_ID \
    --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET \
    --region=REGION
    

其中,您需要替换以下项:

  • IP_ADDR_NAME 替换为 IP 地址对象的名称
  • SERVICE_PROJECT_ID 替换为服务项目的 ID
  • HOST_PROJECT_ID 替换为共享 VPC 宿主项目的 ID
  • REGION 替换为包含共享子网的地区
  • SUBNET 替换为共享子网的名称

有关创建 IP 地址的其他详情,可参阅 SDK 文档

API

将静态内部 IP 地址预留为服务项目管理员。

POST https://compute.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/regions/REGION/addresses
{
  "name": "ADDRESS_NAME",
  "subnetwork": "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME",
  "addressType": "INTERNAL"
}

请将占位符替换为有效值:

  • ADDRESS_NAME 是预留内部 IP 地址的名称。
  • HOST_PROJECT_ID 是共享 VPC 网络所在项目的 ID。
  • REGION 是预留 IP 地址和共享子网所在的地区。
  • SERVICE_PROJECT_ID 是要在其中预留 IP 地址的服务项目的 ID。
  • SUBNET_NAME 是共享子网的名称。

如需了解详情,请参阅 addresses.insert 方法。

创建实例

使用共享 VPC 创建实例时,请注意以下事项:

  • 创建实例的标准流程涉及选择地区、网络和子网。所选子网和地区必须位于同一区域。如果服务项目管理员使用共享 VPC 网络中的子网创建实例,那么为该实例选择的地区必须与所选子网位于同一区域。

    • 在创建具有预留静态内部 IP 地址的实例时,子网(及区域)在创建静态 IP 地址时就已选定。本部分提供的 gcloud 示例介绍了如何创建具有静态内部 IP 地址的实例。
  • Service Project Admin 只能使用其有权使用的子网创建实例。如需确定可以使用哪些子网,请参阅列出可用的子网

  • Google Cloud 收到在共享 VPC 网络的子网中创建实例的请求时,会检查发出该请求的 IAM 成员是否有权使用该共享子网。如果检查结果为否,则不会创建实例,并且 Google Cloud 会返回权限错误。请联系 Shared VPC Admin 以获取帮助。

Console

  1. 转到 Google Cloud Console 中的“虚拟机实例”页面。
    转到“虚拟机实例”页面
  2. 点击创建
  3. 为该实例指定名称
  4. 点击管理、安全、磁盘、网络、单独租用
  5. 点击网络
  6. 网络接口下,点击 default 网络。
  7. 点击与我共享的网络单选按钮。
  8. 选择您想要在其中创建实例的共享子网
  9. 为该实例指定任何其他必要参数。
  10. 点击创建

gcloud

  • 如需在共享 VPC 网络的共享子网中创建具有临时内部 IP 地址的实例,请运行以下命令:

    gcloud compute instances create INSTANCE_NAME \
    --project SERVICE_PROJECT_ID \
    --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET \
    --zone ZONE
    

    其中,您需要替换以下项:

    • INSTANCE_NAME 替换为实例名称
    • SERVICE_PROJECT_ID 替换为服务项目的 ID
    • HOST_PROJECT_ID 替换为共享 VPC 宿主项目的 ID
    • REGION 替换为包含共享子网的地区
    • SUBNET 替换为共享子网的名称
    • ZONE 替换为指定地区中的区域
  • 如需在共享 VPC 网络中创建具有预留静态内部 IP 地址的实例,请执行以下操作:

    1. 在宿主项目中保留静态内部 IP 地址
    2. 创建实例:

      gcloud compute instances create INSTANCE_NAME \
      --project SERVICE_PROJECT_ID \
      --private-network-ip IP_ADDR_NAME \
      --zone ZONE
      --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET
      

      其中,您需要替换以下项:

      • INSTANCE_NAME 替换为实例名称
      • SERVICE_PROJECT_ID 替换为服务项目的 ID
      • HOST_PROJECT_ID 替换为共享 VPC 宿主项目的 ID
      • IP_ADDR_NAME 替换为静态 IP 地址的名称
      • ZONE 替换为 IP_ADDR_NAME 所在地区中的区域
      • SUBNET 替换为与静态内部 IP 地址关联的共享子网的名称。

API

  • 如需创建具有临时内部 IP 地址的实例作为 Service Project Admin,只需指定子网即可。

    POST https://compute.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/zones/ZONE/instances
    {
      "machineType": "MACHINE_TYPE",
      "name": "INSTANCE_NAME",
      "networkInterfaces": [
        {
          "subnetwork": "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME"
        }
      ],
      "disks": [
        {
          "boot": true,
          "initializeParams": {
            "sourceImage": "SOURCE_IMAGE"
          }
        }
      ]
    }
    

    请将占位符替换为有效值:

    • INSTANCE_NAME 是实例的名称。
    • HOST_PROJECT_ID 是共享 VPC 网络所在项目的 ID。
    • MACHINE_TYPE 是实例的机器类型。
    • REGION 是共享子网所在的地区。
    • SERVICE_PROJECT_ID 是服务项目的 ID。
    • SOURCE_IMAGE 是实例的映像。
    • SUBNET 是共享子网的名称。
    • ZONE 是指定区域中的可用区。

    如需了解详情,请参阅 instances.insert 方法。

  • 如需创建具有预留内部 IP 地址的实例作为 Service Project Admin,请指定子网和预留 IP 地址的名称。

    POST https://compute.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/zones/ZONE/instances
    {
      "machineType": "MACHINE_TYPE",
      "name": "INSTANCE_NAME",
      "networkInterfaces": [
        {
          "subnetwork": "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME",
          "networkIP": "projects/SERVICE_PROJECT_ID/regions/REGION/addresses/ADDRESS_NAME"
        }
      ],
      "disks": [
        {
          "boot": true,
          "initializeParams": {
            "sourceImage": "SOURCE_IMAGE"
          }
        }
      ]
    }
    

    请将占位符替换为有效值:

    • ADDRESS_NAME 是预留内部 IP 地址的名称。
    • INSTANCE_NAME 是实例的名称。
    • HOST_PROJECT_ID 是共享 VPC 网络所在项目的 ID。
    • MACHINE_TYPE 是实例的机器类型。
    • REGION 是共享子网所在的地区。
    • SERVICE_PROJECT_ID 是服务项目的 ID。
    • SOURCE_IMAGE 是实例的映像。
    • SUBNET 是共享子网的名称。
    • ZONE 是指定区域中的可用区。

    如需了解详情,请参阅 instances.insert 方法。

创建实例模板

使用共享 VPC 创建实例模板时,请注意以下事项:

  • 创建实例模板的流程涉及选择网络和子网。

    • 如果要创建在自定义模式共享 VPC 网络中使用的模板,必须同时指定网络和子网。

    • 如果要创建在自动模式共享 VPC 网络中使用的模板,可以选择性地推迟选择子网。在此类情况下,系统会自动在使用该模板的托管实例组所在的区域中选择子网。(根据定义,自动模式网络在每个区域都有一个子网。)

  • 当 IAM 成员创建实例模板时,Google Cloud 不会检查权限,即不检查该成员是否可使用指定的子网。此权限检查会一直推迟,直到请求了使用该模板的托管实例组为止。

Console

  1. 转到 Google Cloud Console 中的“实例模板”页面。
    转到“实例模板”页面
  2. 点击创建实例模板
  3. 为该实例模板指定名称
  4. 点击管理、安全、磁盘、网络、单独租用
  5. 点击网络
  6. 网络接口下,点击 default 网络。
  7. 点击与我共享的网络单选按钮。
  8. 选择您想要在其中创建实例模板的共享子网
  9. 为该实例模板指定任何其他必要参数。
  10. 点击创建

gcloud

  • 如需创建实例模板用于自动模式的共享 VPC 网络中自动创建的任何子网,请运行以下命令:

    gcloud compute instance-templates create TEMPLATE_NAME \
    --project SERVICE_PROJECT_ID \
    --network projects/HOST_PROJECT_ID/global/networks/NETWORK
    

    其中,您需要替换以下项:

    • TEMPLATE_NAME 替换为模板名称
    • SERVICE_PROJECT_ID 替换为服务项目的 ID
    • HOST_PROJECT_ID 替换为共享 VPC 宿主项目的 ID
    • NETWORK 替换为共享 VPC 网络的名称
  • 如需在自动模式或自定义模式共享 VPC 网络中为手动创建的子网创建实例模板,请运行以下命令:

    gcloud compute instance-templates create TEMPLATE_NAME \
    --project SERVICE_PROJECT_ID \
    --region REGION \
    --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET
    

    其中,您需要替换以下项:

    • TEMPLATE_NAME 替换为模板名称
    • SERVICE_PROJECT_ID 替换为服务项目的 ID
    • HOST_PROJECT_ID 替换为共享 VPC 宿主项目的 ID
    • REGION 替换为包含共享子网的地区
    • SUBNET 替换为共享子网的名称

API

  • 如需创建实例模板来使用自动模式的共享 VPC 网络中自动创建的任何子网,请指定 VPC 网络。

    POST https://compute.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/global/instanceTemplates
    {
    "properties": {
      "networkInterfaces": [
        {
          "network": "projects/HOST_PROJECT_ID/global/networks/NETWORK"
        }
      ]
    ...
    }
    

    请将占位符替换为有效值:

    • HOST_PROJECT_ID 是共享 VPC 网络所在项目的 ID。
    • SERVICE_PROJECT_ID 是服务项目的 ID。
    • NETWORK 是共享 VPC 网络的名称。

    如需了解详情,请参阅 instanceTemplates.insert 方法。

  • 如需创建实例模板来使用自动模式或自定义模式的共享 VPC 网络中手动创建的子网,请指定子网。

    POST https://compute.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/global/instanceTemplates
    {
    "properties": {
      "networkInterfaces": [
        {
          "subnetwork": "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME"
        }
      ]
    ...
    }
    

    请将占位符替换为有效值:

    • HOST_PROJECT_ID 是共享 VPC 网络所在项目的 ID。
    • REGION 是共享子网所在的地区。
    • SERVICE_PROJECT_ID 是服务项目的 ID。
    • SUBNET_NAME 是共享子网的名称。

    如需了解详情,请参阅 instanceTemplates.insert 方法。

创建托管实例组

使用共享 VPC 创建托管实例组时,请注意以下事项:

  • 要将托管实例组与共享 VPC 结合使用,需要将 Google API 服务帐号设为服务项目管理员,因为通过自动调节来自动创建实例等任务是由该服务帐号执行的。

  • 创建托管实例组的标准流程涉及选择地区或区域(具体取决于组类型)以及实例模板。(网络和子网详情取决于实例模板。)符合条件的实例模板仅限于那些引用的子网与托管实例组位于同一区域的模板。

  • 对于服务项目管理员创建的托管实例组,实例组的成员实例只能使用服务项目管理员有权使用的子网。由于网络和子网详情取决于实例模板,因此 Service Project Admin 只能使用引用了其有权使用的子网的模板。

  • Google Cloud 收到创建托管实例组的请求时,会检查发出该请求的 IAM 成员是否有权使用实例模板中指定的子网(与实例组位于同一区域)。如果检查结果为否,则不会创建托管实例组,并且 Google Cloud 会返回权限错误。请列出可用的子网以确定可以使用哪些子网,然后联系 Shared VPC Admin 以获取帮助。

如需了解详情,请参阅 Compute Engine 文档中的创建代管实例组

创建内部 HTTP(S) 负载平衡器

在共享 VPC 网络中配置内部 HTTP(S) 负载平衡有两种方法。您可以在服务项目或宿主项目中创建负载平衡器及其后端实例。我们建议在服务项目中创建负载平衡器,因为这样可明确区分网络管理员和服务开发者之间的职责。网络管理员可以安全高效地分配内部 IP 空间,而服务开发者可以根据服务项目的需要部署和更新负载平衡资源。

在服务项目管理员可以在服务项目中创建内部 HTTP(S) 负载平衡器之前,宿主项目管理员必须在宿主项目中执行以下操作:

  1. 创建为内部 HTTP(S) 负载平衡器预留的代理专用子网。您必须在服务项目管理员计划在其中创建内部 HTTP(S) 负载平衡器的共享 VPC 网络的每个地区创建一个代理专用子网。
  2. 为负载平衡器的前端和后端创建子网。每次授权新服务项目参与共享 VPC 网络时,都可能需要重复此步骤。例如,如果您希望每个服务项目都有自己的子网,则需要为每个服务项目分配一个单独的子网。这样,在自己的服务项目中操作的不同团队就可彼此独立操作。
  3. 授予服务项目管理员或开发者访问这些子网的权限。服务项目成员应该能够部署和更新这些子网中的负载平衡资源和后端,而无需宿主项目管理员参与其中。
  4. 创建内部 HTTP(S) 负载平衡器所需的全局防火墙规则。

如需了解如何配置内部 HTTP(S) 负载平衡器所需的网络资源,请参阅使用共享 VPC 设置内部 HTTP(S) 负载平衡

创建内部 TCP/UDP 负载平衡器

以下示例说明了在共享 VPC 网络中创建内部 TCP/UDP 负载平衡器时必须考虑的事项。Shared VPC Admin 可以创建使用其有权访问的子网(在宿主项目中)的内部 TCP/UDP 负载平衡器。负载平衡器的内部转发规则在服务项目中定义,但其子网引用则指向宿主项目的共享 VPC 网络中的子网。

在共享 VPC 环境中创建内部 TCP/UDP 负载平衡器之前,请查看以下文档:

Console

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面

  2. 创建内部 TCP/UDP 负载平衡器,并进行如下调整:在配置前端服务部分,从子网菜单的由其他项目共享的网络部分选择您需要的共享 VPC 子网。

  3. 完成负载平衡器的创建。

gcloud

创建内部转发规则时,请使用 --subnet 标志在宿主项目中指定子网:

gcloud compute forwarding-rules create FR_NAME \
    --project SERVICE_PROJECT_ID \
    --load-balancing-scheme internal \
    --region REGION \
    --ip-protocol IP_PROTOCOL \
    --ports PORT,PORT,... \
    --backend-service BACKEND_SERVICE_NAME \
    --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET \
    --address INTERNAL_IP

其中,您需要替换以下项:

  • FR_NAME 替换为转发规则的名称
  • SERVICE_PROJECT_ID 替换为服务项目的 ID
  • REGION 替换为包含共享子网的地区
  • IP_PROTOCOL 替换为 TCPUDP,与负载平衡器的后端服务的协议匹配
  • PORT 替换为负载平衡器的数字端口或端口列表
  • BACKEND_SERVICE_NAME 替换为后端服务的名称,其中该服务已在创建内部 TCP/UDP 负载平衡器的一般流程中创建
  • HOST_PROJECT_ID 替换为共享 VPC 宿主项目的 ID
  • SUBNET 替换为共享子网的名称
  • INTERNAL_IP 替换为共享子网中的内部 IP 地址(如果未指定,系统会选择可用的地址)

如需了解可与 gcloud compute forwarding-rules create 搭配使用的更多选项,请参阅此页面

API

创建内部转发规则并在宿主项目中指定子网。

POST https://compute.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/regions/REGION/forwardingRules
{
  "name": "FR_NAME",
  "IPAddress": "IP_ADDRESS",
  "IPProtocol": "PROTOCOL",
  "ports": [ "PORT", ... ],
  "loadBalancingScheme": "INTERNAL",
  "subnetwork": "https://www.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET",
  "network": "https://www.googleapis.com/compute/v1/projects/HOST_PROJECT_ID/global/networks/NETWORK_NAME",
  "backendService": "https://www.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/regions/us-west1/backendServices/BE_NAME",
  "networkTier": "PREMIUM"
}

请将占位符替换为有效值:

  • BE_NAME 是后端服务的名称,其中该服务已在创建内部 TCP/UDP 负载平衡器的一般流程中创建。
  • FR_NAME 是转发规则的名称。
  • HOST_PROJECT_ID 是共享 VPC 宿主项目的 ID。
  • IP_ADDRESS 是共享子网中的内部 IP 地址。
  • IP_PROTOCOLTCPUDP,与负载平衡器的后端服务的协议匹配
  • PORT 是负载平衡器的数字端口或端口列表。
  • REGION 是共享子网所在的地区。
  • SERVICE_PROJECT_ID 是服务项目的 ID。
  • SUBNET 是共享子网的名称

如需了解详情,请参阅 forwardingRules.insert 方法。

后续步骤