使用虚拟机实例放置政策


每个虚拟机 (VM) 实例在位于数据中心集群的机架中的物理服务器或主机上运行。您可以使用以下放置政策来控制虚拟机在可用区内相对于彼此的物理位置:

  • 分散放置政策。如果您希望虚拟机之间彼此远离,请使用分散政策。这有助于减少主机系统故障的影响或优化虚拟机实时迁移
  • 紧凑放置政策。如果您希望虚拟机之间彼此靠近以缩短虚拟机之间的网络延迟时间,请使用紧凑政策。

准备工作

限制

放置政策具有以下限制:

  • 分散放置政策:
    • 每个政策最多支持 8 个虚拟机。
    • 仅支持 C2、G2、N1、N2 和 N2D 机器类型
    • 不能与虚拟机放置拓扑 API 搭配使用。
    • 不能与虚拟机预留搭配使用。
  • 紧凑放置政策:

创建放置政策

如需控制虚拟机相对于彼此的位置,请按照以下过程操作:

  1. 使用虚拟机所需的放置配置创建分散或紧凑放置政策。
    • 分散放置政策会将虚拟机精确分散放置在数据中心底层基础架构上,以免虚拟机共享相同的主机或电源系统。这种方法可以减少主机或电源故障的影响。
    • 紧凑放置政策会将虚拟机放置在彼此靠近的位置,以缩短虚拟机之间的网络延迟时间。
  2. 将放置政策应用于一个或多个虚拟机。系统会根据您对政策的定义,将共享同一政策的虚拟机放置在相对于彼此合适的位置。您可以将该政策应用于新虚拟机和现有虚拟机,也可以在实例模板中指定该政策,而该实例模板可用于创建独立的虚拟机、代管式实例组 (MIG)虚拟机预留

创建分散放置政策

如需创建虚拟机位于多个不同可用性网域的分散放置政策,请指定此政策应该用来分隔虚拟机的可用性网域的数量。

gcloud

使用 gcloud CLI 创建政策。

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

替换以下内容:

  • POLICY_NAME:新政策的名称
  • DOMAIN_COUNT:此政策将用于分隔虚拟机的不同主机硬件和实体网络集的数量
  • REGION:您打算创建的使用此政策的虚拟机所在的区域
  • PROJECT_ID:您的项目 ID

API

通过使用 resourcePolicies.insert 方法在 Google Cloud 控制台 API 和服务中创建一种分散放置政策。

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:此政策将用于分隔虚拟机的不同主机硬件和实体网络集的数量

创建紧凑放置政策

如需创建虚拟机位于同一网络基础架构上并彼此靠近的紧凑放置政策,请指定 COLLOCATED 政策。

gcloud

使用 gcloud CLI 创建政策。

gcloud compute resource-policies create group-placement POLICY_NAME \
    --collocation COLLOCATED \
    --region REGION \
    --project PROJECT_ID

替换以下内容:

  • POLICY_NAME:新政策的名称
  • REGION:您打算创建的使用此政策的虚拟机所在的区域
  • PROJECT_ID:您的项目 ID

API

通过使用 resourcePolicies.insert 方法在 Google Cloud 控制台 API 和服务中创建一种紧凑放置政策。

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

在请求正文中,提供放置政策的详细信息:

{
  "name": "POLICY_NAME",
  "groupPlacementPolicy": {
    "collocation": "COLLOCATED"
  }
}

替换以下内容:

  • PROJECT_ID:您的项目 ID
  • REGION:您打算创建的使用此政策的虚拟机所在的区域
  • POLICY_NAME:新政策的名称

将放置政策应用于虚拟机

创建放置政策后,您可以将其应用于新的或现有虚拟机。是否支持相应放置政策取决于具体情况。

场景 是否支持紧凑放置 是否支持分散放置
将放置政策应用于新虚拟机
将放置政策应用于现有虚拟机
在可用于创建虚拟机的实例模板中指定放置政策
在可用于创建或更新 MIG 的实例模板中指定放置政策
在可用于创建虚拟机预留的实例模板中指定放置政策

将放置政策应用于新虚拟机

创建放置政策后,请将其应用于一个或多个虚拟机。系统会根据您对政策的定义,将共享同一政策的虚拟机放置在相对于彼此合适的位置。

gcloud

单独批量创建虚拟机时,通过包含 --resource-policies 标志将放置政策应用至虚拟机。

对于紧凑放置政策,您必须添加 --maintenance-policy=TERMINATE--no-restart-on-failure 标志。

例如,如需创建使用紧凑放置政策的虚拟机,请使用以下命令:

gcloud compute instances create VM_NAME \
    --zone=ZONE \
    --resource-policies=POLICY_NAME \
    --image-family=IMAGE_FAMILY \
    --image-project=IMAGE_PROJECT \
    --project=PROJECT_ID \
    --maintenance-policy=TERMINATE \
    --no-restart-on-failure \
    --async

请替换以下内容:

  • VM_NAME:新虚拟机的名称。
  • ZONE:要在其中创建新虚拟机的可用区。

    此可用区必须位于放置政策所在的同一区域。

  • POLICY_NAME:要应用于此虚拟机的放置政策的名称。

    您可以将多个放置政策应用于一个虚拟机。

  • IMAGE_FAMILY可用映像系列中的一种。

  • IMAGE_PROJECT:该映像所属的映像项目

  • PROJECT_ID:您的项目 ID。

API

单独批量创建虚拟机时,通过包含 --resource-policies 标志将放置政策应用至虚拟机。

例如,如需创建单个虚拟机,请使用以下命令:

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

在请求正文中,提供资源政策。对于紧凑放置政策,您必须添加 "onHostMaintenance": "TERMINATE""automaticRestart": false 参数:

{
  "name": "VM_NAME",
  "machineType": "machineTypes/MACHINE_TYPE"
  "networkInterfaces": [{
    "accessConfigs": [{
      "type": "ONE_TO_ONE_NAT",
      "name": "External NAT"
    }],
    "network": "global/networks/default"
  }],
  "scheduling": {
    "onHostMaintenance": "TERMINATE",
    "automaticRestart": false
  },
  "disks": [{
     "autoDelete": "true",
     "boot": "true",
     "type": "PERSISTENT",
     "initializeParams": {
       "sourceImage": "projects/IMAGE_PROJECT/global/images/family/IMAGE_FAMILY"
     }
  }],
  "resourcePolicies": [
    "projects/PROJECT_ID/regions/REGION/resourcePolicies/POLICY_NAME"
  ]
}

请替换以下内容:

  • PROJECT_ID:您的项目 ID。
  • ZONE:要在其中创建新虚拟机的可用区。

    此可用区必须位于放置政策所在的同一区域。

  • VM_NAME:新虚拟机的名称。

  • MACHINE_TYPE:虚拟机的机器类型

  • IMAGE_PROJECT:该映像所属的映像项目

  • IMAGE_FAMILY可用映像系列中的一种。

  • REGION 是您创建放置政策的区域。

  • POLICY_NAME:要应用于此虚拟机的放置政策的名称。

    您可以将多个放置政策应用于一个虚拟机。

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

创建分散放置政策时,您可以将其应用于一个或多个现有虚拟机,而无需重启虚拟机。

gcloud

使用 add-resource-policies 命令将放置政策应用于现有实例。

gcloud compute instances add-resource-policies VM_NAME \
    --zone=ZONE \
    --resource-policies=SPREAD_PLACEMENT_POLICY_NAME \
    --project=PROJECT_ID

请替换以下内容:

  • VM_NAME:虚拟机的名称。
  • ZONE:虚拟机的可用区。

    此可用区必须与放置政策位于同一区域。

  • SPREAD_PLACEMENT_POLICY_NAME:要应用于此虚拟机的现有分散放置政策的名称。

  • PROJECT_ID:您的项目 ID。

API

使用 addResourcePolicies 方法将放置政策应用于现有实例。

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

在请求正文中,提供分散放置政策。

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

请替换以下内容:

  • PROJECT_ID:您的项目 ID。
  • ZONE:要在其中创建新虚拟机的可用区。

    此可用区必须位于放置政策所在的同一区域。

  • VM_NAME:新虚拟机的名称。

  • REGION:您打算在其中创建使用此政策的虚拟机实例的区域。

  • SPREAD_PLACEMENT_POLICY_NAME:要应用于此虚拟机的现有分散放置政策的名称。

创建用于指定放置政策的实例模板

您可以在创建实例模板时指定放置政策。具体而言:

  • 如果您在实例模板中指定紧凑放置政策,则可以使用该模板来创建 MIG、虚拟机和虚拟机预留。

  • 如果您在实例模板中指定分散放置政策,则只能使用该模板来创建 MIG 和虚拟机。

gcloud

如需创建指定资源政策的实例模板,请使用带有 --resource-policies 标志的 gcloud compute instance-templates create 命令。如需指定紧凑放置政策,您还必须指定 --maintenance-policy=TERMINATE--no-restart-on-failure 标志。

例如,如需创建具有默认虚拟机属性并包含紧凑放置政策的实例模板,请使用以下命令:

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --resource-policies=COMPACT_PLACEMENT_POLICY_NAME \
    --maintenance-policy=TERMINATE \
    --no-restart-on-failure

请替换以下内容:

  • INSTANCE_TEMPLATE_NAME:实例模板的名称。

  • COMPACT_PLACEMENT_POLICY_NAME:现有紧凑放置政策的名称。

API

如需创建指定资源政策的实例模板,请向 instanceTemplates.insert 方法发出 POST 请求。在请求正文中,在 resourcePolicies 字段中指定放置政策。如需指定紧凑放置政策,您还必须指定 "onHostMaintenance": "TERMINATE""automaticRestart": false 字段。

例如,如需创建具有默认虚拟机属性并包含紧凑放置政策的实例模板,请使用以下命令:

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

{
  "name": "INSTANCE_TEMPLATE_NAME",
  "properties": {
    "resourcePolicies": {
      "COMPACT_PLACEMENT_POLICY_NAME"
    },
    "scheduling": {
      "onHostMaintenance": "TERMINATE",
      "automaticRestart": false
    },
    ...
  }
}

请替换以下内容:

  • PROJECT_ID:当前项目的 ID。

  • INSTANCE_TEMPLATE_NAME:实例模板的名称。

  • COMPACT_PLACEMENT_POLICY_NAME:现有紧凑放置政策的名称。

如果要使用模板创建 MIG、虚拟机或虚拟机预留,请参阅以下文档:

将放置政策应用于代管式实例组中的虚拟机

创建放置政策后,创建一个指定该政策的实例模板。然后使用该实例模板创建 MIG 或更新现有 MIG。放置政策将应用于使用该实例模板的实例组中的虚拟机。

如果您的工作负载需要虚拟机之间进行广泛通信,则建议创建紧凑放置政策,并使用具有任何单可用区分布形状的区域 MIG。对于任何单可用区形状,每当区域 MIG 没有虚拟机并且需要横向扩容时,实例组都会根据您的预留、配额和硬件要求选择最佳可用区。

将放置政策应用于新 MIG

您可以使用 gcloud CLI 或 Compute Engine API。

gcloud

若要创建 MIG,使之包含的虚拟机基于先前创建的模板,请使用 instance-groups managed create 命令。 例如,如需创建具有任何单可用区分布形状的区域 MIG,请使用以下命令:

gcloud compute instance-groups managed create INSTANCE_GROUP_NAME \
    --template TEMPLATE_NAME \
    --size SIZE \
    --region REGION \
    --zones ZONES \
    --target-distribution-shape=any-single-zone

请替换以下内容:

  • INSTANCE_GROUP_NAME:此实例组的名称。
  • TEMPLATE_NAME:此实例组将使用的实例模板的名称
  • SIZE:此实例组的大小
  • REGION:此实例组所在的区域

  • ZONES(可选):可供 MIG 部署虚拟机实例的区域中的可用区列表。默认情况下,Compute Engine 会为您选择三个可用区。

    • 如果您希望 MIG 能够使用区域中的所有可用区,请指定所有可用的可用区。您可以使用以下命令获取区域中的可用区列表:

      gcloud compute zones list --filter=region:REGION --format='list(NAME)'
    • 请注意,您无法在创建区域级 MIG 后将其更新为使用不同的可用区。

API

若要创建 MIG,使之包含的虚拟机基于先前创建的模板,请调用 instanceGroupManagers.insertregionInstanceGroupManagers.insert 方法并指定该模板。例如,如需创建具有任何单可用区分布形状的区域 MIG,请使用以下方法:

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

{
  "name": "INSTANCE_GROUP_NAME",
  "instanceTemplate": "global/instanceTemplates/TEMPLATE_NAME",
  "targetSize": SIZE,
  "distributionPolicy": {
      "zones": [
          {"zone": "zones/ZONE1"},
          {"zone": "zones/ZONE2"},
          {"zone": "zones/ZONE3"},
      ],
      "targetShape": "ANY_SINGLE_ZONE"
  }
}

请替换以下内容:

  • PROJECT_ID:此请求的项目 ID
  • REGION:该实例组所在的区域
  • INSTANCE_GROUP_NAME:MIG 的名称
  • TEMPLATE_NAME:要使用的实例模板
  • SIZE:实例组中的虚拟机的目标数量
  • ZONES:可供 MIG 部署虚拟机实例的区域中的可用区名称。
    • 如果您希望 MIG 能够使用区域中的所有可用区,请指定所有可用的可用区。您可以通过调用 regions.get 方法获取区域中的可用区列表。
    • 请注意,您无法在创建区域级 MIG 后将其更新为使用不同的可用区。

如需详细了解如何创建 MIG,请参阅创建代管式实例组 (MIG) 的基本场景

将放置政策应用于现有 MIG

创建放置政策后,创建一个指定该政策的实例模板。然后将该模板应用于现有 MIG。您可以使用 gcloud CLI 或 Compute Engine API。

gcloud

如需更新 MIG 以使用新模板,并自动将新模板发布到 MIG 中的现有虚拟机,您可以使用 instance-groups managed rolling-action start-update 命令。例如:

gcloud compute instance-groups managed rolling-action start-update INSTANCE_GROUP_NAME \
    --template TEMPLATE_NAME \
    --type=proactive

API

如需更新 MIG 以使用新模板,请对区域可用区 MIG 调用 patch 方法。

例如,对于区域 MIG,以下请求显示将所有实例自动更新到新实例模板所需的最低配置。

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

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

如需了解更新 MIG 中虚拟机的其他方法,请参阅更新 MIG 中的虚拟机并为其应用新配置

查看放置政策

您可以使用 gcloud CLI 和 Compute Engine API 查看应用于虚拟机的放置政策以及特定放置政策的详细信息。

查看虚拟机的放置政策

gcloud

如需查看虚拟机的资源放置政策,请使用 gcloud compute instances describe 命令

gcloud compute instances describe VM_NAME

VM_NAME 替换为虚拟机名称。

如果放置政策可用,输出会包含 resourcePolicies 字段:

resourcePolicies:
https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGIONS/resourcePolicies/POLICY_NAME

API

如需查看虚拟机的资源放置政策,请使用 instances.get 方法

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

替换以下内容:

  • PROJECT_ID:您的项目 ID
  • ZONE:包含虚拟机的可用区
  • VM_NAME:您的虚拟机的名称

如果放置政策可用,resourcePolicies 字段会返回虚拟机的资源政策。

"resourcePolicies": [
"https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/resourcePolicies/VM_NAME"
],

查看放置政策的详细信息

gcloud

如需查看放置政策的详细信息,请使用 gcloud compute resource-policies describe 命令

gcloud compute resource-policies describe POLICY_NAME

POLICY_NAME 替换为放置政策的名称。

如果放置政策可用,输出会包含放置政策的详细信息:

...
groupPlacementPolicy:
  availabilityDomainCount: 2
kind: compute#resourcePolicy
name: POLICY_NAME
region: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION
...

API

如需查看放置政策的详细信息,请使用 resourcePolicies.get 方法

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

替换以下内容:

  • PROJECT_ID:您的项目 ID
  • REGION:包含虚拟机的区域
  • POLICY_NAME:放置政策的名称

如果放置政策可用,响应正文会包含放置政策的详细信息:

...
"region": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION",
"name": "POLICY_NAME",
"groupPlacementPolicy": {
  "availabilityDomainCount": 2
},
"kind": "compute#resourcePolicy"
...

查看虚拟机放置拓扑

您可以查看有关虚拟机相对于另一个虚拟机的位置的信息。此信息可帮助您为虚拟机构建拓扑,帮助您确定哪些虚拟机最接近,以及哪些虚拟机共享最少的硬件。

您只能比较使用同一放置政策的虚拟机的虚拟机放置拓扑信息。

gcloud

查看创建时使用了布置政策的虚拟机的 resource 属性:

gcloud compute instances describe VM_NAME \
    --format="table[box,title=VM-Topology](resourcePolicies.scope():sort=1,resourceStatus.physicalHost:label=location)"

VM_NAME 替换为使用布置政策的虚拟机实例的名称。

输出应类似如下所示:

VM-Topology

RESOURCE_POLICIES: us-central1/resourcePolicies/policy_name']
PHYSICAL_HOST: /xxxxxxxx/xxxxxx/xxxxx

PHYSICAL_HOST 的值由三个字段组成;这些字段包含表示虚拟机所在的集群、服务器机架和宿主机的哈希值。将此值与其他虚拟机的相应值进行比较时,具有相同字符串的字段越多,虚拟机彼此间的位置就越接近。例如,属于同一项目、集群和在同一机架上运行的两个虚拟机在 PHYSICAL_HOST 字段的前两个部分具有相同的值。

API

查看使用紧凑放置政策创建的虚拟机的详细信息。向 instances.get 方法发出 GET 请求:

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

请替换以下内容:

  • PROJECT_ID:此查询的项目 ID。
  • ZONE:您要查询的实例所在的地区。
  • VM_NAME:使用放置政策的虚拟机的名称。

您的响应正文包含一个类似于以下内容的代码段:

{
  ...
  resourcePolicies:
  - https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/ZONE/resourcePolicies/POLICY_NAME
  resourceStatus:
      physical_host: /xxxxxxxx/xxxxxx/xxxxx
  ...
}

physical_host 的值由三个字段组成,其中包含表示虚拟机所在的集群、服务器机架和宿主机的哈希值。将此值与其他虚拟机的相应值进行比较时,具有相同字符串的字段越多,虚拟机彼此间的位置就越接近。例如,属于同一项目、集群和在同一机架上运行的两个虚拟机在 physicalHost 字段的前两个部分具有相同的值。

如果虚拟机不使用紧凑布置政策,则该属性值在输出中显示为:

resourceStatus: {}

删除放置政策

您可以删除不需要的放置政策。

gcloud

使用 gcloud CLI 删除政策。

gcloud compute resource-policies delete POLICY_NAME \
    --region REGION \
    --project PROJECT_ID

请替换以下内容:

  • POLICY_NAME:要移除的新政策的名称
  • REGION:您创建使用此政策的虚拟机实例的区域
  • PROJECT_ID:您的项目 ID

API

如需创建分散放置政策,请使用 Google Cloud 控制台 API 和服务中的 resourcePolicies.insert 方法

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:此政策将用于分隔实例的不同主机硬件和实体网络集的数量

后续步骤