预配共享 VPC

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

共享 VPC 支持导出仅 IPv4(单栈)以及 IPv4 和 IPv6(双栈)子网。

如需了解如何分离服务项目或完全移除共享 VPC 配置,请参阅取消配置共享 VPC

在 API 和命令行界面中,共享 VPC 也称为“XPN”。

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

在开始之前,请确保您已熟悉共享 VPCIAM,具体而言您需:

让您的组织做好准备

在准备组织时,请注意以下信息。

管理员和 IAM

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

组织政策限制条件

组织政策限制可以在项目、文件夹或组织级别保护共享 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 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 限制条件

防止意外关停宿主项目

取消关联共享 VPC 网络的结算可能会导致所有相关资源(包括服务项目)完全关停。为了防止因结算无效或被停用而导致共享 VPC 可能发生意外关停,请保护宿主项目与其结算账号之间的关联

指定共享 VPC 管理员

组织管理员可将 Shared VPC AdminProject IAM Admin 角色授予一个或多个 IAM 主账号。

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

控制台

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

  1. 以 Organization Admin 身份登录 Google Cloud 控制台,然后前往 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 控制台,然后前往 IAM 页面。

    进入 IAM 页面

  2. 从项目菜单中选择您的文件夹。

    如果您选择了某个项目或组织,则您看到的选项不正确。

  3. 点击添加

  4. 输入新主账号的电子邮件地址。

  5. 选择角色下,选择 Compute Engine > Compute Shared VPC Admin

  6. 点击添加其他角色

  7. 角色菜单中,选择 Resource Manager > Project IAM Admin

  8. 点击添加其他角色

  9. 角色菜单中,选择 Resource Manager > Compute Network Viewer

  10. 点击保存

gcloud

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

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

    gcloud organizations list
    
  3. 如需在组织级层分配 Shared VPC Admin 角色,请执行以下操作:

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

      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 resource-manager folders list --organization=ORG_ID
      
    2. 将 Shared VPC Admin 角色应用到现有 IAM 主账号。将 ORG_ID 替换为您在上一步确定的组织 ID 编号,并将 EMAIL_ADDRESS 替换为将被授予共享 VPC 管理员角色的用户的电子邮件地址。

      gcloud resource-manager folders add-iam-policy-binding FOLDER_ID \
         --member='user:EMAIL_ADDRESS' \
         --role="roles/compute.xpnAdmin"
      
      gcloud resource-manager folders add-iam-policy-binding FOLDER_ID \
         --member='user:EMAIL_ADDRESS' \
         --role="roles/resourcemanager.projectIamAdmin"
      
      gcloud resource-manager folders add-iam-policy-binding FOLDER_ID \
         --member='user:EMAIL_ADDRESS' \
         --role="roles/compute.networkViewer"
      
  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 existing policy details
      }
      

      请替换以下内容:

      • ORG_ID:组织 ID,该组织包含您要授予 Shared VPC Admin 角色的用户。
      • 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"
          },
          {
            "members": [
              "user:EMAIL_ADDRESS"
            ],
            "role": "roles/compute.networkViewer"
          }
        ],
        "etag": "ETAG",
        "version": 1,
        ...other existing policy details
      }
      

      请替换以下内容:

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

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

设置共享 VPC

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

启用宿主项目

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

启用宿主项目后,该项目的网络资源不会自动与服务项目共享。您需要将服务项目附加到宿主项目,以便与服务项目共享所选的网络和子网。

控制台

如果您还没有 Compute Shared VPC Admin 角色 (roles/compute.xpnAdmin),则无法在 Google Cloud 控制台中查看此页面。

  1. 在 Google Cloud 控制台中,进入共享 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. 以共享 VPC 管理员的身份登录 gcloud。将 SHARED_VPC_ADMIN 替换为 Shared VPC Admin 的名称:

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

    gcloud 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。

    POST https://compute.googleapis.com/compute/v1/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 方法。

Terraform

您可以使用 Terraform 资源来启用宿主项目。

resource "google_compute_shared_vpc_host_project" "host" {
  project = var.project # Replace this with your host project ID in quotes
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

关联服务项目

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

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

控制台

  1. 以 Shared VPC Admin 的身份登录 Google Cloud 控制台。
  2. 在 Google Cloud 控制台中,进入共享 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。

    gcloud 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 宿主项目。

    POST https://compute.googleapis.com/compute/v1/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 方法。

Terraform

您可以使用 Terraform 资源来关联服务项目。

resource "google_compute_shared_vpc_service_project" "service1" {
  host_project    = google_compute_shared_vpc_host_project.host.project
  service_project = var.service_project # Replace this with your service project ID in quotes
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

有权访问所有子网的服务项目管理员

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

在宿主项目中具有 compute.networkUser 角色的用户可以查看关联的服务项目中的所有子网。

控制台

如需通过 Google Cloud 控制台将服务项目中的 IAM 主账号指定为服务项目管理员,并使其有权访问宿主项目中的所有子网,请参阅关联服务项目部分。

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 管理员用户的电子邮件地址。

    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. 针对您需要定义的其他各个服务项目管理员重复执行上一步。

  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": [
            PRINCIPAL,
            ...additional principals
          ],
          "role": "roles/compute.networkUser"
        },
      ],
      "etag": "ETAG",
      "version": 1,
      ...other existing policy details
    }
    

    请替换以下内容:

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

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

有权访问部分子网的服务项目管理员

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

在宿主项目中具有 compute.networkUser 角色的用户可以查看关联的服务项目中的所有子网。

控制台

如需通过 Google Cloud 控制台将服务项目中的 IAM 主账号指定为服务项目管理员,并使其有权访问宿主项目中的部分子网,请参阅关联服务项目部分。

gcloud

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

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

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

    gcloud 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 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": [
            PRINCIPAL,
            ...additional principals
          ],
          "role": "roles/compute.networkUser"
        },
      ],
      "etag": "ETAG",
      "version": 1,
      ...other existing policy details
    }
    

    请替换以下内容:

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

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

服务账号作为服务项目管理员

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

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

用户管理服务账号作为 Service Project Admin

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

控制台

  1. 以 Shared VPC Admin 的身份登录 Google Cloud 控制台。
  2. 在 Google Cloud 控制台中,转到设置页面。
    转到“设置”页面
  3. 将项目更改为需要定义为 Service Project Admin 的服务账号所在的服务项目。
  4. 复制服务项目的项目 ID。为简明起见,这些步骤将服务项目 ID 表示为 SERVICE_PROJECT_ID
  5. 将项目更改为共享 VPC 宿主项目。
  6. 在 Google Cloud 控制台中转到 IAM 页面。
    转到 IAM 页面
  7. 点击添加
  8. SERVICE_ACCOUNT_NAME@SERVICE_PROJECT_ID.iam.gserviceaccount.com 添加到主账号字段,需将 SERVICE_ACCOUNT_NAME 替换为服务账号的名称。
  9. 角色菜单中依次选择 Compute Engine > 计算网络用户
  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. 建立政策绑定关系,将服务账号指定为服务项目管理员。将 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 服务账号作为服务项目管理员

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

控制台

  1. 以 Shared VPC Admin 的身份登录 Google Cloud 控制台。
  2. 在 Google Cloud 控制台中,转到设置页面。
    转到“设置”页面
  3. 将项目更改为需要定义为 Service Project Admin 的服务账号所在的服务项目。
  4. 复制服务项目的项目编号。为简明起见,这些步骤将服务项目编号表示为 SERVICE_PROJECT_NUMBER
  5. 将项目更改为共享 VPC 宿主项目。
  6. 在 Google Cloud 控制台中转到 IAM 页面。
    转到 IAM 页面
  7. 点击添加
  8. SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.com 添加到成员字段。
  9. 角色菜单中依次选择 Compute Engine > 计算网络用户
  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. 建立政策绑定关系,将服务账号指定为服务项目管理员。将 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。

本部分中的所有任务都必须由服务项目管理员执行。

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

列出可用的子网

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

控制台

在 Google Cloud 控制台中,进入共享 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 方法。

预留静态内部 IPv4 或 IPv6 地址

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

如需在服务项目中预留独立内部 IP 地址,请完成以下步骤。

控制台

  1. 设置共享 VPC
  2. 在 Google Cloud 控制台中,进入共享 VPC 页面。

    转到共享 VPC

  3. 以 Shared VPC Admin 的身份登录。

  4. 从项目选择器中选择服务项目。

  5. 选择 VPC 网络 > IP 地址,前往 IP 地址页面。

  6. 点击预留内部静态 IP 地址

  7. 名称字段中,输入 IP 地址名称。

  8. IP 版本列表中,选择所需的 IP 版本:

    • 如需预留静态内部 IPv4 地址,请选择 IPv4
    • 如需预留静态内部 IPv6 地址,请选择 IPv6
  9. 点击与我共享的网络按钮。

  10. 网络子网列表中,分别选择 VPC 网络和子网。

  11. 指定您要预留 IP 地址的方式:

    • 对于 IPv4 地址,如需指定要预留的静态内部 IPv4 地址,在静态 IP 地址字段中,选择让我选择,然后输入自定义 IP 地址。否则,系统会自动为您分配子网中的静态内部 IPv4 地址。
    • 对于 IPv6 地址,系统会自动从子网的内部 IPv6 地址范围中分配一个静态内部 IPv6 地址。
  12. 可选:如果要在不同前端中共享静态内部 IPv4 地址,在用途字段中,请选择共享。默认选择非共享

  13. 点击预留

gcloud

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

    gcloud auth login SERVICE_PROJECT_ADMIN
    
  2. 使用 compute addresses create 命令

    • 预留 IPv4 地址:

      gcloud compute addresses create IP_ADDR_NAME \
          --project SERVICE_PROJECT_ID \
          --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET \
          --region=REGION
          --ip-version=IPV4
      
    • 预留 IPv6 地址:

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

    请替换以下内容:

    • IP_ADDR_NAME:IPv4 地址对象的名称。
    • SERVICE_PROJECT_ID:服务项目的 ID。
    • HOST_PROJECT_ID:共享 VPC 宿主项目的 ID。
    • REGION:共享子网所在的区域。
    • SUBNET:共享子网的名称。

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

API

使用 addresses.insert 方法

  • 以 Service Project Admin 身份预留静态内部 IPv4 地址:

    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:预留 IPv4 地址和共享子网所在的区域。
  • SERVICE_PROJECT_ID:服务项目的 ID,您将在该项目中预留 IPv4 地址。
  • SUBNET_NAME:共享子网的名称。

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

Terraform

您可以使用 Terraform 数据块来指定宿主子网信息。 然后使用 Terraform 资源来预留静态内部 IPv4 地址。如果省略可选的 address 参数,则系统会选择并预留可用的 IPv4 地址。

指定宿主子网:

data "google_compute_subnetwork" "subnet" {
  name    = "my-subnet-123"
  project = var.project
  region  = "us-central1"
}

在宿主项目的子网中预留 IPv4 地址,以在服务项目中使用:

resource "google_compute_address" "internal" {
  project      = var.service_project
  region       = "us-central1"
  name         = "int-ip"
  address_type = "INTERNAL"
  address      = "10.0.0.8"
  subnetwork   = data.google_compute_subnetwork.subnet.self_link
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

预留静态外部 IPv4 地址

服务项目中的资源可以使用在服务项目或宿主项目中定义的区域静态外部 IPv4 地址。因此,关联服务项目中的资源可以使用宿主项目中的预留区域静态外部 IPv4 地址

预留静态外部 IPv6 地址

Service Project Admin 可以在服务项目中预留静态外部 IPv6 地址。IPv6 地址配置对象是在服务项目中创建的,而其值在所选共享子网中的可用 IPv6 地址范围内。

控制台

您可以使用 Google Cloud 控制台在服务项目中预留独立的外部 IPv6 地址:

  1. 设置共享 VPC
  2. 在 Google Cloud 控制台中,进入“共享 VPC”页面。
    进入“共享 VPC”页面
  3. 以 Shared VPC Admin 的身份登录。
  4. 从项目选择器中选择服务项目。
  5. 如需前往 IP 地址页面,请选择 VPC 网络 > IP 地址
  6. 点击预留外部静态 IP 地址
  7. 为新地址选择一个名称。
  8. 指定网络服务层级是优质还是标准。只有优质层级支持 IPv6 静态地址预留。
  9. IP 版本下,选择 IPv6
  10. 指定此 IP 地址是区域还是全球
    • 如果您要为全球负载均衡器预留静态 IP 地址,请选择全球
    • 如果您要为实例或区域负载均衡器预留静态 IP 地址,请选择区域,然后选择要创建地址的区域。
  11. 选择以下选项:
    • 此项目中的网络:如果要在预留 IPv6 地址的同一虚拟私有云 (VPC) 网络的子网中预留外部 IPv6 地址,请选择此选项。
    • 与我共享的网络:如果要在共享 VPC 网络的子网中预留外部 IPv6 地址,请选择此选项。
  12. 根据您的选择,选择以下选项:

    • 网络:VPC 网络
    • 子网:要从中分配静态区域级 IPv6 地址的子网
    • 端点类型:选择虚拟机实例网络负载均衡器
  13. 可选:如果您选择虚拟机实例作为端点类型,请选择要将 IPv6 地址附加到的虚拟机实例。

  14. 点击预留

gcloud

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

    gcloud auth login SERVICE_PROJECT_ADMIN
    
  2. 使用 gcloud compute addresses create 命令

    gcloud compute addresses create IP_ADDR_NAME \
        --project SERVICE_PROJECT_ID \
        --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET \
        --region=REGION \
        --ip-version=IPV6 \
        --endpoint-type=[VM | NETLB]
    

    请替换以下内容:

    • IP_ADDR_NAME:IPv6 地址对象的名称。
    • SERVICE_PROJECT_ID:服务项目的 ID。
    • HOST_PROJECT_ID:共享 VPC 宿主项目的 ID。
    • SUBNET:共享子网的名称。
    • REGION:共享子网所在的区域。

API

如需以 Service Project Admin 身份预留静态内部 IPv6 地址,请使用 addresses.insert 方法

POST https://compute.googleapis.com/compute/v1/projects/SERVICE_PROJECT_ID/regions/REGION/addresses
{
  "name": "ADDRESS_NAME",
  "ipVersion": "IPV6",
  "ipv6EndpointType": "VM|LB",
  "networkTier": "PREMIUM",
  "subnetwork": "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME",
  "addressType": "EXTERNAL"
}

请替换以下内容:

  • SERVICE_PROJECT_ID:服务项目的 ID,您将在该项目中预留 IPv6 地址。
  • REGION:预留的 IPv6 地址和共享子网所在的区域。
  • ADDRESS_NAME:预留的静态外部 IPv6 地址的名称。
  • HOST_PROJECT_ID:共享 VPC 网络所在项目的 ID。
  • SUBNET_NAME:共享子网的名称。

创建实例

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

  • 创建实例的标准流程涉及选择可用区、网络和子网。所选子网和可用区必须位于同一区域。如果 Service Project Admin 使用共享 VPC 网络中的子网创建实例,那么为该实例选择的可用区必须与所选子网位于同一区域。

    在创建具有预留静态内部 IPv4 地址的实例时,子网和区域在创建静态 IPv4 地址时就已选定。本部分提供的 gcloud 示例介绍了如何创建具有静态内部 IPv4 地址的实例。

  • Service Project Admin 只能使用其有权使用的子网创建实例。如需确定哪些子网可用,请参阅列出可用子网

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

  • 如果您在双栈子网中创建实例,则可以创建双栈实例。只有自定义模式 VPC 网络支持双栈子网。子网的 IPv6 访问权限类型决定了分配给虚拟机的 IPv6 地址是内部 IPv6 地址还是外部 IPv6 地址。

控制台

  1. 设置共享 VPC
  2. 在 Google Cloud 控制台中,进入共享 VPC 页面。

    转到共享 VPC

  3. 以 Shared VPC Admin 的身份登录。

  4. 从项目选择器中选择服务项目。

  5. 如需前往创建实例页面,请选择 Compute Engine > 虚拟机实例 > 创建实例

  6. 为该实例指定名称

  7. 对于区域,选择包含共享子网的区域。

  8. 点击高级选项下的网络

  9. 网络接口下,点击与我共享的网络单选按钮。

  10. 共享子网列表中,选择要创建实例的所需子网:

    • 对于 IPv4 地址,请选择任何单栈子网。
    • 对于 IPv6 地址,请选择具有所需 IPv6 访问权限类型的双栈子网。
  11. 选择 IP 栈类型

    • 对于 IPv4 地址,请选择 IPv4(单栈)
    • 对于 IPv6 地址,请选择 IPv4 和 IPv6(双栈)
  12. 为该实例指定任何其他必要参数。

  13. 点击创建

gcloud

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

    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 网络中创建具有预留静态内部 IPv4 地址的实例,请执行以下操作:

    1. 在服务项目中预留静态内部 IPv4 地址,该地址来自宿主项目的可用地址范围。
    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。
      • IP_ADDR_NAME:静态 IP 地址的名称。
      • ZONEIP_ADDR_NAME 所在区域中的可用区。
      • HOST_PROJECT_ID:共享 VPC 宿主项目的 ID。
      • REGION:共享子网所在的区域。
      • SUBNET:与静态内部 IPv4 地址关联的共享子网的名称。
  • 如需创建具有临时内部 IPv4 地址和临时 IPv6 地址的实例,请运行以下命令:

    gcloud compute instances create INSTANCE_NAME \
        --project SERVICE_PROJECT_ID \
        --stack-type IPV4_IPV6 \
        --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:指定区域中的可用区。
  • 创建具有预留的静态外部 IPv6 地址的实例:

    gcloud compute instances create INSTANCE_NAME \
        --project SERVICE_PROJECT_ID \
        --stack-type IPV4_IPV6 \
        --subnet projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET \
        --ipv6-address IPV6_ADDRESS \
        --ipv6-prefix-length=96 \
        --ipv6-network-tier PREMIUM \
        --zone ZONE
    

    请替换以下内容:

    • INSTANCE_NAME:实例的名称。
    • SERVICE_PROJECT_ID:服务项目的 ID。
    • HOST_PROJECT_ID:共享 VPC 宿主项目的 ID。
    • REGION:共享子网所在的区域。
    • SUBNET:共享子网的名称。
    • IPV6_ADDRESS:要分配给虚拟机的 IPv6 地址。
    • ZONE:指定区域中的可用区。

API

  • 如需创建具有临时内部 IPv4 地址的实例,请仅指定子网:

    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 方法。

  • 如需创建具有预留内部 IPv4 地址的实例,请指定子网以及预留 IPv4 地址的名称:

    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:预留的内部 IPv4 地址的名称。
    • INSTANCE_NAME:实例的名称。
    • HOST_PROJECT_ID:共享 VPC 网络所在项目的 ID。
    • MACHINE_TYPE:实例的机器类型。
    • REGION:共享子网所在的区域。
    • SERVICE_PROJECT_ID:服务项目的 ID。
    • SOURCE_IMAGE:实例的映像。
    • SUBNET:共享子网的名称。
    • ZONE:指定区域中的可用区。

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

  • 如需创建具有临时内部 IPv4 地址和临时 IPv6 地址的实例,请指定子网以及堆栈类型:

    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",
          "stackType": "IPv4_IPv6"
        }
      ],
      "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 方法。

Terraform

您可以使用 Terraform 数据块来指定宿主子网信息。然后使用 Terraform 资源在服务项目中创建虚拟机实例。

指定宿主子网:

data "google_compute_subnetwork" "subnet" {
  name    = "my-subnet-123"
  project = var.project
  region  = "us-central1"
}

在具有宿主项目的共享子网中的临时 IPv4 地址的服务项目中创建虚拟机实例:

resource "google_compute_instance" "ephemeral_ip" {
  project      = var.service_project
  zone         = "us-central1-a"
  name         = "my-vm"
  machine_type = "e2-medium"
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }
  network_interface {
    subnetwork = data.google_compute_subnetwork.subnet.self_link
  }
}

在具有宿主项目的共享子网中的预留静态 IPv4 地址的服务项目中创建虚拟机实例:

resource "google_compute_instance" "reserved_ip" {
  project      = var.service_project
  zone         = "us-central1-a"
  name         = "reserved-ip-instance"
  machine_type = "e2-medium"
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }
  network_interface {
    subnetwork = data.google_compute_subnetwork.subnet.self_link
    network_ip = google_compute_address.internal.address
  }
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

创建实例模板

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

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

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

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

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

  • 如果您在双栈子网中创建模板,则可以创建双栈实例模板。只有自定义模式 VPC 网络支持双栈子网。子网的 IPv6 访问权限类型决定了分配给虚拟机的 IPv6 地址是内部 IPv6 地址还是外部 IPv6 地址。

控制台

  1. 设置共享 VPC
  2. 在 Google Cloud 控制台中,进入“共享 VPC”页面。
    转到“共享 VPC”页面
  3. 以 Shared VPC Admin 的身份登录。
  4. 从项目选择器中选择服务项目。
  5. 如需前往创建实例模板页面,请选择 Compute Engine > 实例模板 > 创建实例模板
  6. 为该实例模板指定名称
  7. 高级选项部分中,点击网络
  8. 网络接口部分中,点击与我共享的网络单选按钮。
  9. 共享子网列表中,选择要创建实例模板的所需子网:
    • 对于 IPv4 地址,请选择任何单栈子网。
    • 对于 IPv6 地址,请选择具有所需 IPv6 访问权限类型的双栈子网。
  10. 选择 IP 栈类型
    • 对于 IPv4 地址,请选择 IPv4(单栈)
    • 对于 IPv6 地址,请选择 IPv4 和 IPv6(双栈)
  11. 为该实例模板指定任何其他必要参数。
  12. 点击创建

gcloud

  • 创建只有 IPv4 的实例模板用于自动模式的共享 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 网络(自动模式或自定义模式)中手动创建的子网创建仅 IPv4 的实例模板,请运行以下命令:

    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:共享子网的名称。
  • 创建使用自定义模式共享 VPC 网络中的子网的双栈实例模板:

    gcloud compute instance-templates create TEMPLATE_NAME \
        --project SERVICE_PROJECT_ID \
        --stack-type IPV4_IPV6 \
        --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

  • 如需创建只有 IPv4 的实例模板来使用自动模式的共享 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 方法。

  • 如需创建只有 IPv4 的实例模板来使用自动模式或自定义模式的共享 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 网络中的子网的双栈实例模板,请指定子网和栈类型:

    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",
          "stackType": "IPV4_IPV6"
        }
      ]
    ...
    }
    

    请替换以下内容:

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

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

Terraform

您可以使用 Terraform 数据块来指定宿主子网信息。然后使用 Terraform 资源来创建虚拟机实例模板。虚拟机的 IPv4 地址来自宿主项目的共享子网。

子网必须位于将在其中创建虚拟机实例的区域。

指定宿主子网:

data "google_compute_subnetwork" "subnet" {
  name    = "my-subnet-123"
  project = var.project
  region  = "us-central1"
}

在服务项目中创建虚拟机实例模板:

resource "google_compute_instance_template" "default" {
  project      = var.service_project
  name         = "appserver-template"
  description  = "This template is used to create app server instances."
  machine_type = "n1-standard-1"
  disk {
    source_image = "debian-cloud/debian-9"
  }
  network_interface {
    subnetwork = data.google_compute_subnetwork.subnet.self_link
  }
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

创建托管式实例组

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

  • 与共享 VPC 搭配使用的托管式实例组需要将 Google API 服务账号设为 Service Project Admin,因为通过自动扩缩来自动创建实例等任务是由该服务账号执行的。

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

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

  • Google Cloud 收到创建代管式实例组的请求时,会检查发出该请求的 IAM 主账号是否有权使用实例模板中指定的子网(与实例组位于同一区域)。如果检查结果为否,则不会创建代管式实例组,并且 Google Cloud 会返回错误:Required 'compute.subnetworks.use' permission for 'projects/SUBNET_NAME

    列出可用的子网以确定可以使用哪些子网,如果服务账号需要其他访问权限,请联系共享 VPC 管理员。如需了解详情,请参阅服务账号作为服务项目管理员

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

创建 HTTP(S) 负载均衡器

在共享 VPC 网络中配置外部应用负载均衡器有多种方式。无论部署类型如何,负载均衡器的所有组件都必须位于同一组织和同一共享 VPC 网络中。

如需详细了解支持的共享 VPC 架构,请参阅以下内容:

创建内部直通网络负载均衡器

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

在共享 VPC 环境中创建内部直通网络负载均衡器之前,请参阅共享 VPC 架构

控制台

  1. 转到 Google Cloud 控制台中的“负载均衡”页面。
    转到“负载均衡”页面

  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_PROTOCOLTCPUDP,与负载均衡器的后端服务的协议匹配。
  • PORT:负载均衡器的数字端口或端口列表。
  • BACKEND_SERVICE_NAME:后端服务的名称,该服务已在创建内部直通网络负载均衡器的一般流程中创建。
  • 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:后端服务的名称,该服务已在创建内部直通网络负载均衡器的一般流程中创建。
  • FR_NAME:转发规则的名称。
  • HOST_PROJECT_ID:共享 VPC 宿主项目的 ID。
  • IP_ADDRESS:共享子网中的内部 IP 地址。
  • IP_PROTOCOLTCPUDP,与负载均衡器的后端服务的协议匹配。
  • PORT:负载均衡器的数字端口或端口列表。
  • REGION:共享子网所在的区域。
  • SERVICE_PROJECT_ID:服务项目的 ID。
  • SUBNET:共享子网的名称。

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

Terraform

您可以使用 Terraform 数据块来指定主机子网主机网络。然后使用 Terraform 资源来创建转发规则。

指定主机网络:

data "google_compute_network" "network" {
  name    = "my-network-123"
  project = var.project
}

指定宿主子网:

data "google_compute_subnetwork" "subnet" {
  name    = "my-subnet-123"
  project = var.project
  region  = "us-central1"
}

在服务项目中,创建宿主项目的网络和子网中的转发规则:

resource "google_compute_forwarding_rule" "default" {
  project               = var.service_project
  name                  = "l4-ilb-forwarding-rule"
  backend_service       = google_compute_region_backend_service.default.id
  region                = "europe-west1"
  ip_protocol           = "TCP"
  load_balancing_scheme = "INTERNAL"
  all_ports             = true
  allow_global_access   = true
  network               = data.google_compute_network.network.self_link
  subnetwork            = data.google_compute_subnetwork.subnet.self_link
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

后续步骤