创建分散布置政策并应用于虚拟机


本文档介绍如何创建分散布置政策,并将其应用于一个或多个虚拟机 (VM) 实例,以提高可靠性。

分散布置政策通过将虚拟机布置在不同的可用性网域中,来指定虚拟机之间应物理隔离。可用度网域是指数据中心内具有独立电源、冷却和网络来源的独立硬件。使用分散布置政策有助于减少底层硬件故障或维护事件影响所有虚拟机。

准备工作

  • 设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    Select the tab for how you plan to use the samples on this page:

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. Set a default region and zone.
    3. REST

      如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

        安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

        gcloud init

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

所需的角色

如需获得创建分散布置政策并将其应用于虚拟机所需的权限,请让管理员向您授予针对项目的 Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) IAM 角色。 如需详细了解如何授予角色,请参阅管理访问权限

此预定义角色包含创建分散布置政策并将其应用于虚拟机所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

若要创建分散布置政策并将其应用于虚拟机,您需要以下权限:

  • 创建布置政策:针对项目的 compute.resourcePolicies.create 权限
  • 将布置政策应用于现有虚拟机:针对项目的 compute.instances.addResourcePolicies 权限
  • 创建虚拟机:
    • 针对项目的 compute.instances.create 权限
    • 使用自定义映像创建虚拟机:针对映像的 compute.images.useReadOnly 权限
    • 使用快照创建虚拟机:针对快照的 compute.snapshots.useReadOnly 权限
    • 使用实例模板创建虚拟机:针对实例模板的 compute.instanceTemplates.useReadOnly 权限
    • 为虚拟机分配旧版网络:针对项目的 compute.networks.use 权限
    • 为虚拟机指定静态 IP 地址:针对项目的 compute.addresses.use 权限
    • 使用旧版网络时为虚拟机分配外部 IP 地址:针对项目的 compute.networks.useExternalIp 权限
    • 为虚拟机指定子网:针对项目或所选子网的 compute.subnetworks.use 权限
    • 在使用 VPC 网络时为虚拟机分配外部 IP 地址:针对项目或所选子网的 compute.subnetworks.useExternalIp 权限
    • 为虚拟机设置虚拟机实例元数据:针对项目的 compute.instances.setMetadata 权限
    • 为虚拟机设置标记:针对虚拟机的 compute.instances.setTags 权限
    • 为虚拟机设置标签:针对虚拟机的 compute.instances.setLabels 权限
    • 为虚拟机设置要使用的服务账号:针对虚拟机的 compute.instances.setServiceAccount 权限
    • 为虚拟机创建新磁盘:针对项目的 compute.disks.create 权限
    • 以只读或读写模式挂接现有磁盘:针对磁盘的 compute.disks.use 权限
    • 以只读模式挂接现有磁盘:针对磁盘的 compute.disks.useReadOnly 权限
  • 如需创建实例模板:针对项目的 compute.instanceTemplates.create 权限
  • 创建区域级或可用区级托管式实例组 (MIG):针对项目的 compute.instanceGroupManagers.create 权限

您也可以使用自定义角色或其他预定义角色来获取这些权限。

创建分散布置政策

创建分散布置政策时,您最多可以指定 8 个可用性网域来放置虚拟机。除非您想测试将分散布置政策应用于虚拟机的效果,否则 Google Cloud 建议您指定两个或更多可用性网域。这样可以降低所有虚拟机都受到单个硬件故障或维护事件影响的风险。

如需创建分散布置政策,请选择以下选项之一:

gcloud

如需创建分散布置政策,请使用带有 --availability-domain-count 标志的 gcloud compute resource-policies create group-placement 命令

gcloud compute resource-policies create group-placement POLICY_NAME \
    --availability-domain-count=DOMAIN_COUNT \
    --region=REGION

替换以下内容:

  • POLICY_NAME:要创建的分散布置政策的名称。

  • DOMAIN_COUNT:要在其中布置虚拟机的不同可用性网域数。该值必须在 18 之间。

  • REGION:要用于创建政策的区域。

REST

如需创建分散布置政策,请向 resourcePolicies.insert 方法发出 POST 请求。在请求正文中,包含 availabilityDomainCount 字段。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/resourcePolicies

{
  "name": "POLICY_NAME",
  "groupPlacementPolicy": {
    "availabilityDomainCount": DOMAIN_COUNT
  }
}

替换以下内容:

  • PROJECT_ID:要在其中创建政策的项目的 ID。

  • REGION:要用于创建政策的区域。

  • POLICY_NAME:要创建的分散布置政策的名称。

  • DOMAIN_COUNT:要在其中布置虚拟机的不同可用性网域数。该值必须在 18 之间。

应用分散布置政策

您可以将分散布置政策应用于现有虚拟机,也可以在创建虚拟机、实例模板或 MIG 时应用。

如需创建指定分散布置政策的 Compute Engine 资源,或将分散布置政策应用于现有虚拟机,请选择以下方法之一:

将分散布置政策应用于现有虚拟机

在将分散布置政策应用于现有虚拟机之前,请查看以下内容:

  • 如果分散布置政策具有两个或更多可用性网域,您可以在不停止虚拟机的情况下将其添加到虚拟机。否则,如果您的分散布置政策仅指定了一个网域,则您必须先停止虚拟机,然后才能将布置政策应用于该虚拟机。

  • 虚拟机和分散布置政策必须位于同一区域。例如,如果布置政策位于区域 us-central1,则虚拟机必须位于 us-central1 的可用区中。如果您需要将虚拟机迁移到其他区域,请参阅在可用区或区域之间移动虚拟机

否则,将分散布置政策应用于虚拟机将失败。如果虚拟机已指定布置政策,并且您想要替换该政策,请改为参阅替换虚拟机中的布置政策

如需将分散布置政策应用于现有虚拟机,请选择以下选项之一:

gcloud

如需将分散布置政策应用于现有虚拟机,请使用带有 --resource-policies 标志的 gcloud compute instances add-resource-policies 命令

gcloud compute instances add-resource-policies VM_NAME \
    --resource-policies=POLICY_NAME \
    --zone=ZONE

替换以下内容:

  • VM_NAME:现有虚拟机的名称。

  • POLICY_NAME:现有分散布置政策的名称。

  • ZONE:虚拟机所在的可用区,该可用区必须在分散布置政策的区域内。

REST

如需将分散布置政策应用于现有虚拟机,请向 instances.addResourcePolicies 方法发出 POST 请求。在请求正文中,包含 resourcePolicies 字段。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/addResourcePolicies

{
  "resourcePolicies": [
    "projects/PROJECT_ID/regions/REGION/resourcePolicies/POLICY_NAME"
  ]
}

替换以下内容:

  • PROJECT_ID:分散布置政策和虚拟机所在项目的 ID。

  • ZONE:虚拟机所在的可用区,该可用区必须在分散布置政策的区域内。

  • VM_NAME:现有虚拟机的名称。

  • REGION:分散布置政策所在的区域。

  • POLICY_NAME:现有分散布置政策的名称。

使用分散布置政策创建虚拟机

您只能在与布置政策位于同一区域的可用区中使用分散布置政策创建虚拟机。

如需创建指定分散布置政策的虚拟机,请选择以下选项之一:

gcloud

如需创建指定分散布置政策的虚拟机,请使用带有 --resource-policies 标志的 gcloud compute instances create 命令

gcloud compute instances create VM_NAME \
    --machine-type=MACHINE_TYPE \
    --resource-policies=POLICY_NAME \
    --zone=ZONE

请替换以下内容:

  • VM_NAME:要创建的虚拟机的名称。

  • MACHINE_TYPE:虚拟机的机器类型。

  • POLICY_NAME:现有分散布置政策的名称。

  • ZONE:要用于创建虚拟机的可用区。

REST

如需创建指定分散布置政策的虚拟机,请向 instances.insert 方法发出 POST 请求。在请求正文中,包含 resourcePolicies 字段。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  "name": "VM_NAME",
  "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE",
  "resourcePolicies": [
    "projects/PROJECT_ID/regions/REGION/resourcePolicies/POLICY_NAME"
  ]
}

请替换以下内容:

  • PROJECT_ID:分散布置政策所在项目的 ID。

  • ZONE:要用于创建虚拟机以及机器类型所在的可用区。您只能指定与分散布置政策位于同一区域的机器类型。

  • VM_NAME:要创建的虚拟机的名称。

  • MACHINE_TYPE:虚拟机的机器类型。

  • REGION:分散布置政策所在的区域。

  • POLICY_NAME:现有分散布置政策的名称。

如需详细了解用于创建虚拟机的配置选项,请参阅创建和启动虚拟机实例

使用分散布置政策批量创建虚拟机

您只能在与分散布置政策相同的区域中使用分散布置政策批量创建虚拟机。

如需批量创建指定分散布置政策的虚拟机,请选择以下选项之一:

gcloud

若要批量创建指定分散布置政策的虚拟机,请使用带有 --resource-policies 标志的 gcloud compute instances bulk create 命令

例如,如需在单个可用区中批量创建虚拟机并为虚拟机指定名称模式,请运行以下命令:

gcloud compute instances bulk create \
    --count=COUNT \
    --machine-type=MACHINE_TYPE \
    --name-pattern=NAME_PATTERN \
    --resource-policies=POLICY_NAME \
    --zone=ZONE

请替换以下内容:

  • COUNT:要创建的虚拟机数量。

  • MACHINE_TYPE:虚拟机的机器类型。

  • NAME_PATTERN:要创建的虚拟机的名称格式。使用井号 (#) 将其替换为数字序列。例如,如果指定 vm-#,就可以创建名为 vm-1vm-2 等的虚拟机,最多可创建 COUNT 中指定的虚拟机数量。

  • POLICY_NAME:现有分散布置政策的名称。

  • ZONE:要用于批量创建虚拟机的可用区。

REST

如需批量创建指定分散布置政策的虚拟机,请向 instances.bulkInsert 方法发出 POST。在请求正文中,包含 resourcePolicies 字段。

例如,如需在单个可用区中批量创建虚拟机并为虚拟机指定名称模式,请发出 POST 请求,如下所示:

POST https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/bulkInsert

{
  "count": "COUNT",
  "machineType": "MACHINE_TYPE",
  "namePattern": "NAME_PATTERN",
  "instanceProperties": {
    "resourcePolicies": [
      "projects/PROJECT_ID/regions/REGION/resourcePolicies/POLICY_NAME"
    ]
  }
}

替换以下内容:

  • PROJECT_ID:分散布置政策所在项目的 ID。

  • ZONE:要用于批量创建虚拟机的可用区。

  • COUNT:要创建的虚拟机数量。

  • MACHINE_TYPE:虚拟机的机器类型。

  • NAME_PATTERN:要创建的虚拟机的名称格式。使用井号 (#) 将其替换为数字序列。例如,指定 vm-# 将创建名称为 vm-1vm-2 等的虚拟机,最多为 COUNT 中指定的虚拟机数量。

  • REGION:分散布置政策所在的区域。

  • POLICY_NAME:现有分散布置政策的名称。

如需详细了解批量创建虚拟机的配置选项,请参阅批量创建虚拟机

使用分散布置政策创建实例模板

如果您要创建区域实例模板,则必须在与分散布置政策相同的区域内创建该模板。否则,创建实例模板的操作将失败。

创建实例模板后,您可以使用该模板执行以下操作:

如需创建用于指定分散布置政策的实例模板,请选择以下选项之一:

gcloud

如需创建指定紧凑布置政策的实例模板,请使用带有 --resource-policies 标志的 gcloud compute instance-templates create 命令

例如,如需创建指定分散布置政策的全局实例模板,请运行以下命令:

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --machine-type=MACHINE_TYPE \
    --resource-policies=POLICY_NAME

请替换以下内容:

  • INSTANCE_TEMPLATE_NAME:实例模板的名称。

  • MACHINE_TYPE:使用实例模板创建的虚拟机的机器类型。

  • POLICY_NAME:现有分散布置政策的名称。

REST

如需创建指定分散布置政策的实例模板,请向以下方法之一发出 POST 请求:

在请求正文中,指定 resourcePolicies 字段。

例如,如需创建指定分散布置政策的全球实例模板,请发出 POST 请求,如下所示:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates

{
  "name": "INSTANCE_TEMPLATE_NAME",
  "properties": {
    "disks": [
      {
        "boot": true,
        "initializeParams": {
          "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
        }
      }
    ],
    "machineType": "MACHINE_TYPE",
    "networkInterfaces": [
      {
        "network": "global/networks/default"
      }
    ],
    "resourcePolicies": [
      "POLICY_NAME"
    ]
  }
}

替换以下内容:

  • PROJECT_ID:分散布置政策所在项目的 ID。

  • INSTANCE_TEMPLATE_NAME:实例模板的名称。

  • IMAGEIMAGE_FAMILY:指定以下其中一项:

    • IMAGE:操作系统映像的特定版本;例如 debian-10-buster-v20200309

    • IMAGE_FAMILY映像系列。此项指定最新的未弃用操作系统映像。例如,如果您指定 family/debian-10,则系统会使用 Debian 10 映像系列中的最新版本。如需详细了解如何使用映像系列,请参阅映像系列最佳实践

  • MACHINE_TYPE:使用实例模板创建的虚拟机的机器类型。

  • POLICY_NAME:现有分散布置政策的名称。

如需详细了解用于创建实例模板的配置选项,请参阅创建实例模板

将分散布置政策应用于 MIG 中的虚拟机

创建指定分散布置政策的实例模板后,您便可以使用该模板执行以下操作:

如果要将分散布置政策应用于 MIG,请创建政策或将其应用于具有任何单个可用区分布形状的区域 MIG。这样,每当区域 MIG 需要通过创建虚拟机进行横向扩容时,它会根据您的配额和硬件要求选择要在其中创建虚拟机的可用区。

使用分散布置政策创建 MIG

仅当虚拟机与布置政策位于同一区域时,才能创建指定分散布置政策的虚拟机。

如需使用指定分散布置政策的实例模板创建 MIG,请选择以下选项之一:

gcloud

如需使用指定分散布置政策的实例模板创建 MIG,请使用 gcloud compute instance-groups managed create 命令

例如,如需创建具有默认虚拟机属性和任意单个可用区分布形状的区域 MIG,请运行以下命令:

gcloud compute instance-groups managed create MIG_NAME \
    --region=REGION \
    --size=SIZE \
    --target-distribution-shape=any-single-zone \
    --template=INSTANCE_TEMPLATE_NAME

替换以下内容:

  • MIG_NAME:要创建的 MIG 的名称。

  • REGION:要用于创建 MIG 的区域,该区域必须与分散布置政策所在的区域一致。

  • SIZE:MIG 的大小。

  • INSTANCE_TEMPLATE_NAME:指定分散布置政策的现有实例模板的名称。

REST

如需使用指定分散布置政策的实例模板创建 MIG,请向 instanceGroupManagers.insertregionInstanceGroupManagers.insert 方法发出 POST 请求。

例如,如需创建具有默认虚拟机属性和任意单个可用区分布形状的区域级 MIG,请发出 POST 请求,如下所示:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers

{
  "name": "MIG_NAME",
  "instanceTemplate": "global/instanceTemplates/INSTANCE_TEMPLATE_NAME",
  "targetSize": SIZE,
  "distributionPolicy": {
    "targetShape": "ANY_SINGLE_ZONE"
  }
}

替换以下内容:

  • PROJECT_ID:分散布置政策以及指定布置政策的实例模板所在项目的 ID。

  • REGION:要用于创建 MIG 的区域,该区域必须与分散布置政策所在的区域一致。

  • MIG_NAME:要创建的 MIG 的名称。

  • INSTANCE_TEMPLATE_NAME:指定分散布置政策的现有实例模板的名称。

  • SIZE:MIG 的大小。

如需详细了解用于创建 MIG 的配置选项,请参阅创建 MIG 的基本场景

将分散布置政策应用于现有 MIG

仅当现有 MIG 与布置政策位于同一区域或者位于布置政策所在区域中的某个可用区(对于可用区级 MIG)时,您才能将紧凑布置政策应用于该 MIG。

如需更新 MIG 以使用指定分散布置政策的实例模板,请选择以下选项之一:

gcloud

如需更新 MIG 以使用指定分散布置政策的实例模板,请使用 gcloud compute instance-groups managed rolling-action start-update 命令

例如,如需更新区域 MIG 以使用指定分散布置政策的实例模板,并将 MIG 中的现有虚拟机替换为指定模板属性的新虚拟机,请运行以下命令:

gcloud compute instance-groups managed rolling-action start-update MIG_NAME \
    --region=REGION \
    --type=proactive \
    --version=template=INSTANCE_TEMPLATE_NAME

替换以下内容:

  • MIG_NAME:现有 MIG 的名称。

  • REGION:MIG 所在的区域。您只能将分散布置政策应用于位于同一区域的 MIG。

  • INSTANCE_TEMPLATE_NAME:指定分散布置政策的现有实例模板的名称。

REST

如需更新 MIG 以使用指定分散布置政策的实例模板,并自动将模板和布置政策的属性应用于 MIG 中的现有虚拟机,请向 instanceGroupManagers.insertregionInstanceGroupManagers.insert 方法发出 PATCH 请求。

例如,如需更新区域 MIG 以使用指定分散布置政策的实例模板,并将 MIG 中的现有虚拟机替换为指定模板属性的新虚拟机,请发出以下 PATCH 请求:

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/MIG_NAME

{
  "instanceTemplate": "global/instanceTemplates/INSTANCE_TEMPLATE_NAME",
  "updatePolicy": {
    "type": "PROACTIVE"
  }
}

替换以下内容:

  • PROJECT_ID:您用于创建现有 MIG、分散布置政策以及指定分散布置政策的实例模板的项目的 ID。

  • REGION:MIG 所在的区域。您只能将分散布置政策应用于位于同一区域的 MIG。

  • MIG_NAME:现有 MIG 的名称。

  • INSTANCE_TEMPLATE_NAME:指定分散布置政策的现有实例模板的名称。

如需详细了解用于更新 MIG 中虚拟机的配置选项,请参阅更新 MIG 中的虚拟机配置并将新配置应用于虚拟机

后续步骤