每个虚拟机 (VM) 实例在位于数据中心集群的机架中的物理服务器或主机上运行。您可以使用以下放置政策来控制虚拟机在可用区内相对于彼此的物理位置:
- 分散放置政策。如果您希望虚拟机之间彼此远离,请使用分散政策。这有助于减少主机系统故障的影响或优化虚拟机实时迁移。
- 紧凑放置政策。如果您希望虚拟机之间彼此靠近以缩短虚拟机之间的网络延迟时间,请使用紧凑政策。
准备工作
- 如果您要使用本指南中的命令行示例,请执行以下操作:
- 安装或更新到 Google Cloud CLI 的最新版本。
- 设置默认区域和可用区。
- 如果您要使用本指南中的 API 示例,请设置 API 访问权限。
限制
放置政策具有以下限制:
- 分散放置政策:
- 每个政策最多支持 8 个虚拟机。
- 仅支持 C2、G2、N1、N2 和 N2D 机器类型。
- 不能与虚拟机放置拓扑 API 搭配使用。
- 不能与虚拟机预留搭配使用。
- 紧凑放置政策:
- 每个政策最多支持 150 个虚拟机。
- 仅支持 A2、C2、G2、C2D、N2 和 N2D 机器类型。
- 不支持实时迁移。
- 对于主机维护事件,只能与配置为
TERMINATE
的虚拟机搭配使用。 - 只能用于单个项目的虚拟机预留。不支持在项目之间共享的预留或关联到承诺使用折扣的预留。
- 不能与单租户节点搭配使用。
- 无法应用于现有虚拟机。
创建放置政策
如需控制虚拟机相对于彼此的位置,请按照以下过程操作:
- 使用虚拟机所需的放置配置创建分散或紧凑放置政策。
- 将放置政策应用于一个或多个虚拟机。系统会根据您对政策的定义,将共享同一政策的虚拟机放置在相对于彼此合适的位置。您可以将该政策应用于新虚拟机和现有虚拟机,也可以在实例模板中指定该政策,而该实例模板可用于创建独立的虚拟机、代管式实例组 (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
:您的项目 IDREGION
:您打算创建的使用此政策的虚拟机所在的区域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
:您的项目 IDREGION
:您打算创建的使用此政策的虚拟机所在的区域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
请替换以下内容:
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" ] }
请替换以下内容:
将分散放置政策应用于现有虚拟机
创建分散放置政策时,您可以将其应用于一个或多个现有虚拟机,而无需重启虚拟机。
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.insert
或 regionInstanceGroupManagers.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
:此请求的项目 IDREGION
:该实例组所在的区域INSTANCE_GROUP_NAME
:MIG 的名称TEMPLATE_NAME
:要使用的实例模板SIZE
:实例组中的虚拟机的目标数量ZONES
:可供 MIG 部署虚拟机实例的区域中的可用区名称。- 如果您希望 MIG 能够使用区域中的所有可用区,请指定所有可用的可用区。您可以通过调用
regions.get
方法获取区域中的可用区列表。 - 请注意,您无法在创建区域级 MIG 后将其更新为使用不同的可用区。
- 如果您希望 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
:您的项目 IDZONE
:包含虚拟机的可用区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
:您的项目 IDREGION
:包含虚拟机的区域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
:您的项目 IDREGION
:您计划创建的使用此政策的虚拟机实例的区域POLICY_NAME
:新政策的名称DOMAIN_COUNT
:此政策将用于分隔实例的不同主机硬件和实体网络集的数量
后续步骤
- 查看实例的状态以了解其何时可用。
- 连接到您的实例。
- 请阅读有关设计可处理服务中断情况的可靠系统的提示。