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


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

分散布置政策通过将虚拟机布置在不同的可用性网域中,来指定虚拟机之间应物理隔离。使用分散布置政策确保将虚拟机放置在不同的硬件上,从而减少底层硬件故障的影响或优化实时迁移。

您可以在执行以下操作时应用分散布置政策:

  • 创建或更新虚拟机。
  • 批量创建虚拟机。
  • 创建实例模板。然后,当您使用实例模板执行以下操作时,实例模板会应用分散布置政策:
    • 创建一个虚拟机。
    • 创建或更新托管式实例组 (MIG)。

准备工作

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

    选择标签页以了解您打算如何使用本页面上的示例:

    gcloud

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

      gcloud init
    2. 设置默认区域和可用区

    REST

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

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

      gcloud init

所需的角色

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

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

所需权限

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

  • 创建布置政策:针对项目的 compute.resourcePolicies.create 权限
  • 将布置政策应用于现有虚拟机:针对项目的 compute.instances.addResourcePolicies 权限

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

限制

除了布置政策的一般限制之外,分散布置政策还具有以下限制:

  • 您最多只能将分散布置政策应用于 8 个虚拟机。

  • 您无法将分散布置政策应用于虚拟机预留。

  • 您无法验证虚拟机的物理位置。

创建分散布置政策

您可以使用 gcloud CLI 和 REST 创建分散布置政策。

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:要在其中布置虚拟机的不同可用性网域数。每个网域都有自己的独立电源、冷却和网络来源。该值必须在 28(这是您可以应用分散布置政策的虚拟机数上限)之间。

  • 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:要在其中布置虚拟机的不同可用性网域数。每个网域都有自己的独立电源、冷却和网络来源。该值必须在 28(这是您可以应用分散布置政策的虚拟机数上限)之间。

应用分散布置政策

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

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

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

您可以使用 gcloud CLI 和 REST 将分散布置政策应用于现有虚拟机。

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 CLI 和 REST 创建指定现有分散布置政策的虚拟机。

gcloud

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

例如,如需创建具有默认属性并指定分散布置政策的虚拟机,请运行以下命令:

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

替换以下内容:

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

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

  • ZONE:要用于创建虚拟机的可用区。您只能在您指定的分散布置政策所在区域内的可用区中创建虚拟机。

REST

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

例如,如需创建具有默认属性并指定分散布置政策的虚拟机,请发出以下 POST 请求:

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

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

替换以下内容:

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

  • ZONE:要用于创建虚拟机的可用区。您只能在您指定的分散布置政策所在区域内的可用区中创建虚拟机。

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

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

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

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

批量创建指定分散布置政策的虚拟机

您可以使用 gcloud CLI 和 REST 批量创建指定现有分散布置政策的虚拟机。

gcloud

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

例如,如需批量创建全都具有默认属性并指定相同分散布置政策的虚拟机,请运行以下命令:

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

替换以下内容:

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

  • 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",
  "namePattern": "NAME_PATTERN",
  "instanceProperties": {
    "resourcePolicies": [
      "projects/PROJECT_ID/regions/REGION/resourcePolicies/POLICY_NAME"
    ]
  }
}

替换以下内容:

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

  • ZONE:要用于批量创建虚拟机的可用区。您只能在指定的分散布置政策所在区域的可用区中创建虚拟机。

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

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

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

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

如需详细了解用于批量创建虚拟机的配置选项或 IAM 角色,请参阅批量创建虚拟机

创建用于指定分散布置政策的实例模板

您可以使用 gcloud CLI 和 REST 创建指定现有分散布置政策的实例模板。

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

gcloud

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

例如,如需创建具有默认虚拟机属性并包含分散布置政策的全局实例模板,请运行以下命令:

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

替换以下内容:

  • INSTANCE_TEMPLATE_NAME:实例模板的名称。

  • PROJECT_ID:要应用于实例模板的分散布置政策所在项目的 ID。

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

REST

如需创建指定分散布置政策的实例模板,请向 instanceTemplates.insert 方法发出 POST 请求。在请求正文中,包含 resourcePolicies 字段。

例如,如需创建具有默认虚拟机属性并指定分散布置政策的全局实例模板,请发出以下 POST 请求:

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

{
  "name": "INSTANCE_TEMPLATE_NAME",
  "properties": {
    "resourcePolicies": {
      "POLICY_NAME"
    }
  }
}

替换以下内容:

  • PROJECT_ID:要应用分散布置政策的实例模板所在项目的 ID。

  • INSTANCE_TEMPLATE_NAME:实例模板的名称。

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

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

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

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

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

创建指定分散布置政策的 MIG

您可以使用 gcloud CLI 和 REST 通过指定分散布置政策的实例模板创建 MIG。

gcloud

如需使用指定分散布置政策的实例模板创建 MIG,请使用 gcloud compute instance-groups managed create 命令,并将 --template 标志设置为现有模板的名称。

例如,如需创建具有默认虚拟机属性和任意单个可用区分布形状的区域 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 请求。在请求正文中,添加 instanceTemplate 字段并将其设置为现有模板的名称。

例如,如需创建具有默认虚拟机属性和任意单个可用区分布形状的区域级 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 的配置选项和 IAM 角色,请参阅创建 MIG 的基本场景

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

您可以使用 gcloud CLI 和 REST 通过指定相同布置政策的实例模板将分散布置政策应用于现有 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 中的虚拟机的配置选项和 IAM 角色,请参阅更新新配置并将其应用于 MIG 中的虚拟机

后续步骤