为区域级 MIG 中的虚拟机设置目标分布形状


如果您使用区域级代管式实例组 (MIG),则可以将该 MIG 的目标分布形状设置为以下选项之一:

  • 均匀(默认):实例组会适当地创建和删除虚拟机,以实现并维持所选可用区中的虚拟机数量相同。在 EVEN 分布中,任意两个可用区之间的虚拟机数量之差不超过 1 个。建议用于可用性高的服务工作负载。
  • 平衡:实例组会优先考虑在提供资源的可用区中创建虚拟机,同时尽可能在所选可用区中均匀分布虚拟机,以最大限度地减少可用区故障的影响。建议用于高可用性服务工作负载或批处理工作负载。
  • 不限:实例组会选择可用区来创建虚拟机实例,以满足当前资源限制条件中所请求的虚拟机数量,并最大程度提高未使用的可用区级预留的利用率。建议用于不需要高可用性的批处理工作负载。
  • 任意单个可用区:实例组会在单个可用区中创建所有虚拟机实例。系统会根据硬件支持、当前资源和配额可用性以及匹配的预留来选择可用区。建议与紧凑实例放置政策结合使用,用于需要在 VM 之间进行广泛通信的工作负载。

如需在区域级代管式实例组中使用预留的虚拟机,请在每个适用可用区中创建同名的相同预留。然后,在实例组的实例模板中按名称指定这些预留。

为帮助您选择形状,请参阅对照表使用场景分布形状的工作原理

创建区域级 MIG 时设置目标分布形状,或更新现有区域级 MIG 的目标形状。

准备工作

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

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

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

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

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

    Terraform

    如需从本地开发环境使用本页面上的 Terraform 示例,请安装并初始化 gcloud CLI,然后使用用户凭据设置应用默认凭据。

    1. 安装 Google Cloud CLI。
    2. 如需初始化 gcloud CLI,请运行以下命令:

      gcloud init
    3. 为您的 Google 账号创建本地身份验证凭据:

      gcloud auth application-default login

    如需了解详情,请参阅 为本地开发环境设置身份验证

    REST

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

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

      gcloud init

限制

  • 您只能在创建 MIG 时为 MIG 选择可用区。
  • 如果您在 MIG 的实例模板或有状态配置中指定的资源并非在所有选定的可用区都可用,则存在以下限制:

    • 必须将目标分布形状设置为 BALANCEDANYANY_SINGLE_ZONE
    • 您必须确保 MIG 所需的任何资源(例如,现有磁盘、机器类型或 GPU)至少在其中一个选定的可用区中可用。
    • 如果要将 MIG 的配置(例如实例模板)更新为无法在所有选定的可用区中实例化的配置,则必须在设置新配置之前从所有不受支持的可用区中移除代管式实例
  • 如需将目标分布形状设置为 BALANCEDANY_SINGLE_ZONE,您必须停用主动式实例重新分布功能

  • 如果您要自动扩缩区域级 MIG,则必须将实例组的目标分布形状设置为 BALANCED([预览版](/products/#product-launch-stages))或 EVEN
  • 如果将目标分布形状设置为 BALANCEDANYANY_SINGLE_ZONE,则存在以下限制:

    • 不支持包含两个版本Canary 更新。
    • 如果请求的资源在整个区域中都比较有限,实例组可能会在已经无法提供该资源的可用区中安排虚拟机实例创建。您可以尝试减小和增加实例组大小,以在其他可用区中获取所请求的资源。
    • 使用 SUBSTITUTE 替换方法的滚动更新将尝试在过期机器所在的可用区内创建新的更新实例,即使该可用区不具有满足新版本要求的资源也是如此。要应对此类行为,您可以从受限可用区中删除过期虚拟机,然后根据删除虚拟机的数量增加实例组大小。实例组会在有可用容量的可用区根据最新模板创建实例。
    • 如果要将实例组的实例模板更新为指定并非在所有选定可用区中可用的资源的模板,您必须先从不受支持的可用区中移除代管式实例,然后才能设置新模板。
  • 如果将目标分布形状设置为 ANY_SINGLE_ZONE,并且实例组在一个可用区中已有虚拟机,则您只能在该可用区中创建其他虚拟机。如果要使用其他可用区,则必须先将实例组横向缩容到零个虚拟机。

  • 如果您需要预配一组单租户虚拟机,则必须将 MIG 的目标分布形状设置为 EVEN。您可以在 MIG 可用区所在的可用区中创建您的节点组,并在 MIG 的实例模板中设置 MIG 的节点亲和性。

创建具有目标分布形状的实例组

如需创建实例组、选择其可用区并设置其目标分布形状,请使用 Google Cloud 控制台gcloud CLI、Terraform 或 REST

控制台

  1. 在 Google Cloud 控制台中,转到实例组页面。

    转到“实例组”页面

  2. 点击创建实例组以创建一个新的实例组。
  3. 选择新代管式实例组选项之一:无状态(默认)或有状态
  4. 为实例组指定名称和(可选)说明。
  5. 为实例组选择一个实例模板或创建一个新实例模板。
  6. 指定此实例组内的虚拟机数量。对于高可用性工作负载,请务必预配足够多的虚拟机,以便在一个可用区发生故障时,应用可获得相应的支持。
  7. 位置下,选择多个可用区
  8. 选择一个区域,然后选择要使用的可用区。

    • 如果您希望 MIG 能够使用区域中的所有可用区,请选择所有可用的可用区。
    • 请注意,您无法在创建区域级 MIG 后将其更新为使用不同的可用区。
  9. 选择目标分布形状。

    1. 如果您要选择不限任意单个可用区,请在自动扩缩部分中,点击自动扩缩模式,然后选择删除自动扩缩配置
    2. 如果您要选择任意单个可用区平衡,请在实例重新分布部分中不要选中 Allow instance redistribution(允许实例重新分布)。
  10. 继续完成 MIG 创建过程的剩余部分。

gcloud

使用 gcloud compute instance-groups managed create 命令并添加 --target-distribution-shape 标志。

gcloud compute instance-groups managed create INSTANCE_GROUP_NAME \
    --template TEMPLATE \
    --size SIZE \
    --region REGION \
    --zones ZONES \
    --target-distribution-shape SHAPE

请替换以下内容:

  • INSTANCE_GROUP_NAME:实例组的名称。
  • TEMPLATE:要用于组的实例模板的名称。
  • SIZE:实例组的目标大小。
  • REGION:希望实例组所处的区域。
  • ZONES(可选):要部署虚拟机实例的区域中的可用区列表。 默认情况下,Compute Engine 会为您选择三个可用区。

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

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

  • SHAPE:目标分布形状。可以是下列值之一:

    • even(默认):实例组会适当地创建和删除虚拟机,以实现并维持所选可用区中的虚拟机数量相同。在 EVEN 分布中,任意两个可用区之间的虚拟机数量之差不超过 1 个。建议用于可用性高的服务工作负载。
    • balanced:实例组会优先考虑在提供资源的可用区中创建虚拟机,同时尽可能在所选可用区中均匀分布虚拟机,以最大限度地减少可用区故障的影响。建议用于高可用性服务工作负载或批处理工作负载。
    • any:实例组会选择可用区来创建虚拟机实例,以满足当前资源限制条件中所请求的虚拟机数量,并最大程度提高未使用的可用区级预留的利用率。建议用于不需要高可用性的批处理工作负载。
    • any-single-zone:实例组会在单个可用区中创建所有虚拟机实例。系统会根据硬件支持、当前资源和配额可用性以及匹配的预留来选择可用区。 建议与紧凑实例放置政策结合使用,用于需要在 VM 之间进行广泛通信的工作负载。

例如,如需创建具有平衡目标分布形状的区域级 MIG,请将 --target-distribution-shape 标志设置为 balanced

gcloud compute instance-groups managed create example-rmig \
    --template example-template \
    --size 30 \
    --zones us-east1-b,us-east1-c \
    --target-distribution-shape balanced \
    --instance-redistribution-type none

Terraform

如果您尚未创建您希望为 MIG 中的每个虚拟机指定机器类型、启动磁盘映像、网络和其他虚拟机属性的实例模板,请创建实例模板

如需创建区域级 MIG,请使用 google_compute_region_instance_group_manager 资源

以下示例会创建一个具有 BALANCED 目标分布形状的区域级 MIG。

resource "google_compute_region_instance_group_manager" "default" {
  name                             = "example-rmig"
  region                           = "us-east1"
  distribution_policy_zones        = ["us-east1-b", "us-east1-c"]
  distribution_policy_target_shape = "BALANCED"
  update_policy {
    type                         = "PROACTIVE"
    minimal_action               = "REFRESH"
    instance_redistribution_type = "NONE"
    max_unavailable_fixed        = 3
  }
  target_size        = 30
  base_instance_name = "instance"
  version {
    instance_template = google_compute_instance_template.default.id
  }
}

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

REST

调用 regionInstanceGroupManagers.insert 方法。 在请求正文中,添加 distributionPolicy 属性并设置其 targetShape 字段。

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

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

替换以下内容:

  • PROJECT_ID:此请求的项目 ID。
  • REGION:实例组所在的区域。
  • INSTANCE_GROUP_NAME:实例组的名称。
  • TEMPLATE:要用于实例组的实例模板的名称。
  • SIZE:实例组的目标大小。
  • ZONE:要在其中部署虚拟机实例的区域中的可用区名称。
    • 如果您希望 MIG 能够使用区域中的所有可用区,请指定所有可用的可用区。您可以通过调用 regions.get 方法获取区域中的可用区列表。
    • 请注意,您无法在创建区域级 MIG 后将其更新为使用不同的可用区。
  • SHAPE:目标分布形状。可以是下列值之一:
    • EVEN(默认):实例组会适当地创建和删除虚拟机,以实现并维持所选可用区中的虚拟机数量相同。在 EVEN 分布中,任意两个可用区之间的虚拟机数量之差不超过 1 个。建议用于可用性高的服务工作负载。
    • BALANCED:实例组会优先考虑在提供资源的可用区中创建虚拟机,同时尽可能在所选可用区中均匀分布虚拟机,以最大限度地减少可用区故障的影响。建议用于高可用性服务工作负载或批处理工作负载。
    • ANY:实例组会选择可用区来创建虚拟机实例,以满足当前资源限制条件中所请求的虚拟机数量,并最大程度提高未使用的可用区级预留的利用率。建议用于不需要高可用性的批处理工作负载。
    • ANY_SINGLE_ZONE:实例组会在单个可用区中创建所有虚拟机实例。系统会根据硬件支持、当前资源和配额可用性以及匹配的预留来选择可用区。 建议与紧凑实例放置政策结合使用,用于需要在 VM 之间进行广泛通信的工作负载。

更改现有实例组的目标分布形状

您可以在现有区域 MIG 中更改目标分布形状,但存在以下限制:

  • 如果要将目标分布形状更改为 BALANCED,必须先停用主动式重新分布
  • 如果要将目标分布形状更改为 EVEN,并且实例当前分布不均匀,则必须先停用主动式重新分布。
  • 如果将形状更改为 EVEN 并且想要重新启用主动式重新分布,则必须先手动重新平衡实例组
  • 如果要将目标分布形状更改为 EVEN,但实例模板指定了并非在所有选定可用区都支持的资源,则必须先将实例组的实例模板更新为所有选定可用区都支持的模板。

控制台

  1. 在 Google Cloud 控制台中,转到实例组页面。

    转到“实例组”页面

  2. 在列表的名称列下方,点击要更改目标分布形状的实例组的名称。
  3. 点击修改以修改此代管实例组。
  4. 目标分布形状下,指定所需的形状。
  5. 点击保存以应用新模板。

gcloud

使用 gcloud compute instance-groups managed update 命令并添加 --target-distribution-shape 标志。

gcloud compute instance-groups managed update INSTANCE_GROUP_NAME \
    --target-distribution-shape SHAPE

请替换以下内容:

  • INSTANCE_GROUP_NAME:实例组的名称。
  • SHAPE:目标分布形状。可以是下列值之一:
    • even(默认):实例组会适当地创建和删除虚拟机,以实现并维持所选可用区中的虚拟机数量相同。在 EVEN 分布中,任意两个可用区之间的虚拟机数量之差不超过 1 个。建议用于可用性高的服务工作负载。
    • balanced:实例组会优先考虑在提供资源的可用区中创建虚拟机,同时尽可能在所选可用区中均匀分布虚拟机,以最大限度地减少可用区故障的影响。建议用于高可用性服务工作负载或批处理工作负载。
    • any:实例组会选择可用区来创建虚拟机实例,以满足当前资源限制条件中所请求的虚拟机数量,并最大程度提高未使用的可用区级预留的利用率。建议用于不需要高可用性的批处理工作负载。
    • any-single-zone:实例组会在单个可用区中创建所有虚拟机实例。系统会根据硬件支持、当前资源和配额可用性以及匹配的预留来选择可用区。 建议与紧凑实例放置政策结合使用,用于需要在 VM 之间进行广泛通信的工作负载。

REST

调用 regionInstanceGroupManagers.patch 方法。在请求正文中,添加 distributionPolicy 属性并设置其 targetShape 字段。

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

{
    "distributionPolicy": {
        "targetShape": "SHAPE"
    }
}

请替换以下内容:

  • PROJECT_ID:此请求的项目 ID。
  • REGION:实例组所在的区域。
  • INSTANCE_GROUP_NAME:实例组的名称。
  • SHAPE:目标分布形状。可以是下列值之一:
    • EVEN(默认):实例组会适当地创建和删除虚拟机,以实现并维持所选可用区中的虚拟机数量相同。在 EVEN 分布中,任意两个可用区之间的虚拟机数量之差不超过 1 个。建议用于可用性高的服务工作负载。
    • BALANCED:实例组会优先考虑在提供资源的可用区中创建虚拟机,同时尽可能在所选可用区中均匀分布虚拟机,以最大限度地减少可用区故障的影响。建议用于高可用性服务工作负载或批处理工作负载。
    • ANY:实例组会选择可用区来创建虚拟机实例,以满足当前资源限制条件中所请求的虚拟机数量,并最大程度提高未使用的可用区级预留的利用率。建议用于不需要高可用性的批处理工作负载。
    • ANY_SINGLE_ZONE:实例组会在单个可用区中创建所有虚拟机实例。系统会根据硬件支持、当前资源和配额可用性以及匹配的预留来选择可用区。 建议与紧凑实例放置政策结合使用,用于需要在 VM 之间进行广泛通信的工作负载。

查看已配置的实例分布政策

控制台

  1. 在 Google Cloud 控制台中,转到实例组页面。

    转到“实例组”页面

    如果您已有实例组,页面会列出这些组。
  2. 点击要检查的实例组的名称。随后打开的页面中会显示实例组属性以及该实例组中所含实例的列表。
  3. 点击详细信息
  4. 位置部分,查找目标分布形状

gcloud

运行 gcloud compute instance-groups managed describe 命令

gcloud compute instance-groups managed describe INSTANCE_GROUP_NAME \
    --region REGION

该命令会返回实例组的详细信息,包括 distributionPolicy.targetShape 字段:

...
distributionPolicy:
  targetShape: BALANCED
  zones:
  - zone: https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-f
  ...
name: my-group
region: https://www.googleapis.com/compute/v1/projects/my-project/regions/us-central1
...

REST

构建对 regionInstanceGroupManagers.get 方法的 GET 请求。

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

请替换以下内容:

  • PROJECT_ID:此请求的项目 ID
  • REGION:实例组所在的地区
  • INSTANCE_GROUP_NAME:实例组的名称

目标分布形状在 distributionPolicy.targetShape 字段中返回。例如:

{
  "name": "my-instance-group",
  "distributionPolicy": {
    "targetShape": "BALANCED",
  },
  "targetSize": 50,
  ...
}

后续步骤