创建和管理区域级 MIG

本文档介绍特定于创建和管理区域级代管式实例组 (MIG) 的过程。如需了解有关创建 MIG 的一般信息,请参阅创建代管式实例组

地区级 MIG 可将实例分布到某个地区中的多个区域,从而提高基于 MIG 的工作负载的弹性。使用多个区域可避免单个区域中的所有实例都发生故障这种极端情况。

如需详细了解地区级 MIG(包括选择它们的原因、它们的额外配置选项以及它们与区域级 MIG 的不同之处),请参阅地区级 MIG 概览

准备工作

限制

  • 使用地区级 MIG,您可以在一个地区中最多创建 2000 个虚拟机,其中每个区域的虚拟机数量上限为 1000 个。使用区域级 MIG,您最多可以创建 1000 个虚拟机。如果您需要更多信息,请与支持团队联系
  • 更新 MIG 时,您可以在单个请求中最多指定 1000 个虚拟机。
  • 如果您需要有状态 MIG,请查看有状态 MIG 限制

  • 在创建区域级 MIG 时,您必须选择与区域级 MIG 关联的可用区。如果您在创建实例组的过程中选择了特定可用区,日后将无法更改或更新这些可用区。但是,您可以设置 MIG 的目标分布形状,以指定实例组在所选可用区之间分布其代管实例的方式。

  • 如果将实例组的目标分布形状设置为 ANYBALANCED,请参阅限制

  • 如果您要将负载平衡功能与地区级 MIG 搭配使用,则会受到以下限制:

    • 您无法使用 maxRate 平衡模式。
    • 如果您将 HTTP(S) 负载平衡方案与区域级 MIG 搭配使用,则必须选择 maxRatePerInstancemaxUtilization 平衡模式。
  • 如果您要自动扩缩地区级 MIG,则会受到以下限制:

    • 必须将实例组的目标分布形状设置为 EVEN
    • 如需执行扩缩操作,您必须启用主动式实例重新分布功能。如果您将自动扩缩器的模式设置为仅横向扩容,则无需启用主动式实例分布功能。
    • 如果您要根据 Cloud Monitoring 指标自动扩缩地区级 MIG,则会受到以下限制:

      • 您无法使用实例组指标。
      • 您无法对实例指标应用过滤条件。

创建地区级 MIG

使用 Cloud Consolegcloud 工具Compute Engine API

如果每个区域中没有足够的容量来支持实例组中的虚拟机,则 Compute Engine 会创建尽可能多的虚拟机,并在后续获得额外容量时继续尝试创建其余虚拟机。

如果您未在请求中明确指定各个区域,则 Compute Engine 会自动选择三个区域来创建虚拟机。如果您需要在多于或少于三个区域中创建虚拟机,或者您希望选择使用哪些区域,可以在您的请求中提供区域列表。如需了解详情,请参阅区域选择

默认情况下,MIG 会在所选可用区中均匀分布虚拟机。由于您要创建区域 MIG,因此需要注意,某些资源是可用区级的,例如 GPU 和现有永久性磁盘。如果 MIG 的实例模板指定了可用区级资源,您必须确保所有选定可用区中都存在所有这些资源,这样这些资源才能够附加到区域 MIG 创建的虚拟机。或者,如果您希望实例组替您检查是否存在可用区级资源,则可以设置 MIG 的分布形状,以仅在包含这些资源的可用区中创建实例。

主动式实例重新分布功能默认启用。如果您需要手动管理每个可用区中的虚拟机数量或将 MIG 的目标分布形状设置为 BALANCED,则必须停用主动式实例重新分布功能。如果停用了主动式实例重新分布功能,并且想要使用自动扩缩,则还必须设置分布形状EVEN限制自动扩缩器为仅扩容。

控制台

  1. 在 Cloud Console 中,转到实例组页面。

    转到“实例组”页面

  2. 点击创建实例组以创建一个新的实例组。
  3. 选择新代管式实例组选项之一:无状态(默认)或有状态
  4. 位置下,选择多个地区
  5. 选择一个区域。
  6. 如果要选择特定地区,请点击配置地区以选择要使用的地区。
  7. 目标分布形状下,选择均匀。如果您想选择其他形状,请参阅设置在可用区之间分布实例的政策
  8. 如果要停用主动式实例重新分布功能,请执行以下操作
    1. 确保将自动扩缩模式设置为不自动调节
    2. 实例重新分布设置为关闭
  9. 为实例组选择一个实例模板或创建一个新实例模板。
  10. 指定此实例组内的虚拟机数量。请务必预配足够多的虚拟机,以便在一个区域发生故障时,您的应用可获得相应的支持。
  11. 继续完成 MIG 创建过程的剩余部分。

gcloud

所有 MIG 都需要实例模板。如果您没有实例模板,请创建一个。例如,以下命令会创建具有默认属性的基本实例模板:

gcloud compute instance-templates create example-template

接下来,使用带有 --region 标志的 instance-groups managed create 命令。例如,以下命令会在 us-east1 地区内的三个区域中创建一个地区级 MIG:

gcloud compute instance-groups managed create example-rmig \
    --template example-template  \
    --size 30 \
    --region us-east1

如果要选择实例组应使用的特定区域,请提供 --zones 标志:

gcloud compute instance-groups managed create example-rmig \
    --template example-template \
    --size 30 \
    --zones us-east1-b,us-east1-c

如果要停用主动式实例重新分布功能,请将 --instance-redistribution-type 标志设置为 NONE。如果启用了自动扩缩,则无法停用主动式实例重新分布功能。

gcloud compute instance-groups managed create example-rmig \
    --template example-template \
    --size 30 \
    --instance-redistribution-type NONE \
    --region us-east1

API

所有 MIG 都需要实例模板。如果您没有实例模板,请创建一个

接下来,构建对 regionInstanceGroupManagers.insert 方法POST 请求。在请求正文中,指定实例组名称、实例组大小和实例模板的网址。(可选)指定其他字段,例如实例组中实例的基本名称。

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

{
  "baseInstanceName": "BASE_INSTANCE_NAME",
  "instanceTemplate": "global/instanceTemplates/INSTANCE_TEMPLATE_NAME",
  "name": "INSTANCE_GROUP_NAME",
  "targetSize": "TARGET_SIZE"
}

替换以下内容:

  • PROJECT_ID:此请求的项目 ID。
  • REGION:该实例组所在的地区。
  • BASE_INSTANCE_NAME:实例组中创建的每个虚拟机实例的名称。例如,基本实例名称 example-instance 将创建名称类似于 example-instance-[RANDOM_STRING] 的实例,其中 [RANDOM_STRING] 由服务器生成。
  • INSTANCE_TEMPLATE_NAME:要使用的实例模板。
  • INSTANCE_GROUP_NAME:MIG 的名称。
  • TARGET_SIZE:实例组中的虚拟机的目标数量。

如果您要选择特定区域,或者要在包含的区域少于或多于三个的地区中创建虚拟机,请在您的请求中添加 distributionPolicy 属性并提供区域列表。将 ZONE 替换为要在其中创建虚拟机的区域的名称。

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

{
  "baseInstanceName": "BASE_INSTANCE_NAME",
  "instanceTemplate": "global/instanceTemplates/INSTANCE_TEMPLATE_NAME",
  "name": "INSTANCE_GROUP_NAME",
  "targetSize": "TARGET_SIZE",
  "distributionPolicy": {
     "zones": [
       {"zone": "zones/ZONE"},
       {"zone": "zones/ZONE"}
      ]
   }
}

例如,以下命令会创建一个名为 example-rmig 的地区级 MIG,其中的 10 个代管式实例分布在 us-east1-bus-east1-c 区域:

POST https://compute.googleapis.com/compute/v1/projects/myproject/regions/us-east1/instanceGroupManagers

{
  "instanceTemplate": "global/instanceTemplates/example-instance",
  "name": "example-rmig",
  "targetSize": 10,
  "distributionPolicy": {
      "zones": [
        {"zone": "zones/us-east1-b"},
        {"zone": "zones/us-east1-c"}
      ]
   }
}

处理地区级 MIG 中的代管式实例

如果您需要对 MIG 中的特定代管式实例执行操作(例如创建或删除具有特定名称的实例),则相应的过程对于地区级 MIG 和区域级 MIG 是相同的。请参阅处理代管式实例

获取有关地区级 MIG 和代管式实例的信息

如果您想获取 MIG 的相关信息(例如查看其配置或检查其状态),或者想获取 MIG 中代管式实例的相关信息,则相应的过程对于地区级 MIG 和区域级 MIG 是相同的。请参阅获取有关 MIG 和代管式实例的信息

更新区域托管实例组

您可以使用 Updater 功能将新实例模板应用于地区级 MIG。如需了解详情,请参阅更新地区级 MIG

如果您要在 MIG 中添加实例或者从中移除实例,请参阅处理代管式实例

如果您要使用或更新 MIG 功能,请参阅自动修复负载平衡自动扩缩自动更新有状态工作负载的相关文档。

创建 MIG 后,您便无法为 MIG 选择其他可用区。但是,您可以更新 MIG 的目标形状,以更改实例组在所选可用区之间分布其代管实例的方式。

设置在可用区之间分布实例的政策

您可以将区域 MIG 的目标分布形状设置为以下选项之一:

  • 均匀(默认):实例组会适当创建和删除虚拟机实例,以实现并维持各个选定可用区中的代管式实例数量均匀分布。如果任意两个可用区之间的代管式实例数量之差不超过 1 个,则分布就是均匀的。建议用于可用性高的服务工作负载。

  • 平衡:实例组会确定系统获取资源的优先级,在有资源可用的可用区中调度虚拟机,并在各个选定的可用区中尽可能均匀地分布虚拟机,以最大限度地减少可用区故障的影响。建议用于无需自动扩缩的高可用性服务工作负载或批处理工作负载。

  • 不限:实例组会选择可用区来创建虚拟机实例,以满足当前资源限制条件中所请求的虚拟机数量,并最大程度提高未使用的可用区级预留的利用率。建议用于不需要高可用性的批处理工作负载。

您可以参阅对照表使用场景以及分布形状的工作原理,了解如何进行选择。

创建实例组或更新现有实例组的目标形状时设置目标分布形状。

限制

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

    • 必须将目标分布形状设置为 ANYBALANCED
    • 必须确保至少一个所选可用区中有所需资源。如需了解特定可用区中有哪些 Compute Engine 资源可用,请参阅可用区域和可用区
    • 如果要将实例组的实例模板更新为无法在所有选定可用区中实例化的模板,您必须先从所有不受支持的可用区中移除代管式实例,然后才能设置新模板。
  • 如果将目标分布形状设置为 BALANCED,则必须停用主动式重新分布

  • 如果将目标分布形状设置为 BALANCEDANY,则存在以下限制:

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

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

如需创建实例组、选择可用区并设置目标分布形状,请使用 Cloud Consolegcloud 工具Compute Engine API

控制台

  1. 在 Cloud Console 中,转到实例组页面。

    转到“实例组”页面

  2. 点击创建实例组以创建一个新的实例组。
  3. 选择新代管式实例组选项之一:无状态(默认)或有状态
  4. 位置下,选择多个地区
  5. 选择一个区域。
  6. 如果要选择特定可用区或选择所有可用区,请点击配置可用区以选择要使用的可用区。
  7. 选择目标分布形状。
    1. 如果您要选择不限平衡,请在自动扩缩部分中点击删除自动扩缩配置
    2. 如果您要选择平衡,在实例重新分布部分请勿选择启用实例重新分布
    3. 目标分布形状部分中,选择一个形状。
  8. 为实例组选择一个实例模板或创建一个新实例模板。
  9. 指定此实例组内的虚拟机数量。对于高可用性工作负载,请务必预配足够多的虚拟机,以便在一个可用区发生故障时,应用可获得相应的支持。
  10. 继续完成 MIG 创建过程的剩余部分。

gcloud

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

gcloud beta compute instance-groups managed create INSTANCE_GROUP_NAME \
    --template TEMPLATE \
    --size SIZE \
    [--zones ZONES \]
    --target-distribution-shape SHAPE

请替换以下内容:

  • INSTANCE_GROUP_NAME:实例组的名称。
  • TEMPLATE:要用于实例组的实例模板的名称。
  • SIZE:实例组的目标大小。
  • ZONES(可选):要部署虚拟机实例的区域中的可用区列表。
  • SHAPE:目标分布形状。可以是下列值之一:
    • EVEN(默认):实例组会适当创建和删除虚拟机实例,以实现并维持各个选定可用区中的代管实例数量均匀分布。如果任意两个可用区之间的代管实例数量之差不超过 1 个,则分布就是均匀的。建议用于可用性高的服务工作负载。
    • BALANCED:实例组会确定系统获取资源的优先级,在有资源可用的可用区中调度虚拟机,并在各个选定的可用区之间尽可能均匀地分布虚拟机,以最大限度地减少可用区故障的影响。建议用于无需自动扩缩的高可用性服务工作负载或批处理工作负载。
    • ANY:实例组会选择可用区来创建虚拟机实例,以在当前容量限制条件内满足所请求的虚拟机数量,并最大程度提高未使用的可用区级预留的利用率。建议用于不需要高可用性的批处理工作负载。

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

gcloud beta 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

API

调用 regionInstanceGroupManagers.insert 方法。在请求正文中,添加 distributionPolicy 属性并设置其 targetShape 字段。. In the request body, include theproperty, and set its

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

{
    "instanceTemplate": "global/instanceTemplates/TEMPLATE",
    "targetSize": SIZE,
    "distributionPolicy": {
        "zones": [
            {"zone": "zones/ZONE"},
            {"zone": "zones/ZONE"}
        ],
        "targetShape": SHAPE
    }
}

请替换以下内容:

  • PROJECT_ID:此请求的项目 ID。
  • REGION:实例组所在的区域。
  • INSTANCE_GROUP_NAME:实例组的名称。
  • TEMPLATE:要用于实例组的实例模板的名称。
  • SIZE:实例组的目标大小。
  • ZONE:要在其中部署虚拟机实例的区域中的可用区名称。
  • SHAPE:目标分布形状。可以是下列值之一:
    • EVEN(默认):实例组会适当创建和删除虚拟机实例,以实现并维持各个选定可用区中的代管实例数量均匀分布。如果任意两个可用区之间的代管实例数量之差不超过 1 个,则分布就是均匀的。建议用于可用性高的服务工作负载。
    • BALANCED:实例组会确定系统获取资源的优先级,在有资源可用的可用区中调度虚拟机,并在各个选定的可用区之间尽可能均匀地分布虚拟机,以最大限度地减少可用区故障的影响。建议用于无需自动扩缩的高可用性服务工作负载或批处理工作负载。
    • ANY:实例组会选择可用区来创建虚拟机实例,以在当前容量限制条件内满足所请求的虚拟机数量,并最大程度提高未使用的可用区级预留的利用率。建议用于不需要高可用性的批处理工作负载。

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

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

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

控制台

  1. 在 Cloud Console 中,转到实例组页面。

    转到“实例组”页面

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

gcloud

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

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

请替换以下内容:

  • INSTANCE_GROUP_NAME:实例组的名称。
  • SHAPE:目标分布形状。可以是下列值之一:
    • EVEN(默认):实例组会适当创建和删除虚拟机实例,以实现并维持各个选定可用区中的代管实例数量均匀分布。如果任意两个可用区之间的代管实例数量之差不超过 1 个,则分布就是均匀的。建议用于可用性高的服务工作负载。
    • BALANCED:实例组会确定系统获取资源的优先级,在有资源可用的可用区中调度虚拟机,并在各个选定的可用区之间尽可能均匀地分布虚拟机,以最大限度地减少可用区故障的影响。建议用于无需自动扩缩的高可用性服务工作负载或批处理工作负载。
    • ANY:实例组会选择可用区来创建虚拟机实例,以在当前容量限制条件内满足所请求的虚拟机数量,并最大程度提高未使用的可用区级预留的利用率。建议用于不需要高可用性的批处理工作负载。

API

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

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

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

请替换以下内容:

  • PROJECT_ID:此请求的项目 ID。
  • REGION:实例组所在的区域。
  • INSTANCE_GROUP_NAME:实例组的名称。
  • SHAPE:目标分布形状。可以是下列值之一:
    • EVEN(默认):实例组会适当创建和删除虚拟机实例,以实现并维持各个选定可用区中的代管实例数量均匀分布。如果任意两个可用区之间的代管实例数量之差不超过 1 个,则分布就是均匀的。建议用于可用性高的服务工作负载。
    • BALANCED:实例组会确定系统获取资源的优先级,在有资源可用的可用区中调度虚拟机,并在各个选定的可用区之间尽可能均匀地分布虚拟机,以最大限度地减少可用区故障的影响。建议用于无需自动扩缩的高可用性服务工作负载或批处理工作负载。
    • ANY:实例组会选择可用区来创建虚拟机实例,以在当前容量限制条件内满足所请求的虚拟机数量,并最大程度提高未使用的可用区级预留的利用率。建议用于不需要高可用性的批处理工作负载。

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

控制台

  1. 在 Google Cloud Console 中,转到实例组页面。

    转到“实例组”页面

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

gcloud

运行 gcloud beta compute instance-groups managed describe 命令

gcloud beta 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
...

API

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

GET https://www.googleapis.com/compute/beta/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,
  ...
}

停用和重新启用主动式实例重新分布功能

主动式实例重新分布功能可平衡地区内选定区域中的虚拟机数。此配置可在出现区域范围故障时最大限度地提高应用的可用性。

对于地区级 MIG,主动式实例重新分布功能默认启用,但您可以为非自动扩缩的 MIG 停用该功能。主动式实例重新分布功能停用时,实例组不会尝试主动跨地区重新分布虚拟机。在以下情况下,此机制很有用:

  • 从实例组中删除放弃虚拟机而不影响其他正在运行的虚拟机。例如,您可以在作业完成后删除批处理工作器虚拟机,而不影响其他工作器。
  • 避免系统由于执行主动式重新分布操作而意外自动删除具有有状态工作负载的虚拟机。
  • 将 MIG 的目标分布形状设置为 BALANCED

使用 Cloud Consolegcloud 工具Compute Engine API 创建停用了主动式实例重新分布功能的区域 MIG,或者为现有实例组关闭或启用主动式实例重新分布功能。

创建停用了主动式实例重新分布功能的实例组

控制台

  1. 在 Cloud Console 中,转到实例组页面。

    转到“实例组”页面

  2. 点击创建实例组以创建一个新的实例组。
  3. 位置下,选择多个地区
  4. 选择一个区域。
  5. 如果要选择特定地区,请点击配置地区以选择要使用的地区。
  6. 如需停用主动式实例重新分布功能,请执行以下操作:
    1. 确保将自动扩缩模式设置为不自动调节
    2. 实例重新分布设置为关闭
  7. 为实例组选择一个实例模板或创建一个新实例模板。
  8. 指定此实例组内的虚拟机数量。请务必预配足够多的虚拟机,以便在一个区域发生故障时,您的应用可获得相应的支持。
  9. 继续完成 MIG 创建过程的剩余部分。

gcloud

如需创建不具备主动式实例重新分布功能的新地区级 MIG,请使用 gcloud compute instance-groups managed create 命令,并将 --instance-redistribution-type 标志设置为 NONE

gcloud compute instance-groups managed create INSTANCE_GROUP_NAME \
    --template INSTANCE_TEMPLATE_NAME \
    --size TARGET_SIZE \
    --zones ZONES \
    --instance-redistribution-type NONE

替换以下内容:

  • INSTANCE_GROUP_NAME:MIG 的名称
  • INSTANCE_TEMPLATE_NAME:要用于实例组的实例模板的名称
  • TARGET_SIZE:实例组的目标大小
  • ZONES:要在其中部署虚拟机的单个区域中的可用区列表

例如:

gcloud compute instance-groups managed create example-rmig \
    --template example-template \
    --size 30 \
    --zones us-east1-b,us-east1-c \
    --instance-redistribution-type NONE

API

如需创建不具备主动式实例重新分布功能的非自动扩缩地区级 MIG,请向 regionInstanceGroupManagers.insert 方法发出 POST 请求。在请求正文中,添加 updatePolicy 属性并将其 instanceRedistributionType 字段设置为 NONE

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

{
    "name": "INSTANCE_GROUP_NAME",
    "instanceTemplate": "global/instanceTemplates/INSTANCE_TEMPLATE_NAME",
    "targetSize": "TARGET_SIZE",
    "distributionPolicy": {
        "zones": [
            {"zone": "zones/ZONE"},
            {"zone": "zones/ZONE"}
        ]
    },
    "updatePolicy": {
        "instanceRedistributionType": "NONE"
    }
}

请替换以下内容:

  • PROJECT_ID:此请求的项目 ID
  • REGION:实例组所在的地区
  • INSTANCE_GROUP_NAME:MIG 的名称
  • INSTANCE_TEMPLATE_NAME:要用于实例组的实例模板的名称
  • TARGET_SIZE:实例组的目标大小
  • ZONE:要在其中部署虚拟机的单个区域中的可用区名称

关闭主动式实例重新分布功能

您必须先设置自动扩缩器的模式以关闭自动扩缩功能或者将其限制为仅扩容,然后才能关闭主动式实例重新分布功能。

控制台

  1. 在 Cloud Console 中,转到实例组页面。

    转到“实例组”页面

  2. 在列表的名称列下方,点击您要修改的实例组的名称。
  3. 点击修改以修改此代管实例组。
  4. 如果存在任何自动扩缩配置,请确保将自动扩缩模式设置为不自动调节
  5. 实例重新分布设置为关闭以停用自动重新分布功能。
  6. 点击保存

gcloud

如需为非自动扩缩的地区级 MIG 关闭主动式实例重新分布功能,请使用 compute instance-groups managed update 命令,并将 --instance-redistribution-type 标志设置为 NONE

gcloud compute instance-groups managed update INSTANCE_GROUP_NAME \
    --instance-redistribution-type NONE \
    --region REGION

替换以下内容:

  • INSTANCE_GROUP_NAME:MIG 的名称
  • REGION:实例组所在的地区

API

如需为非自动扩缩的地区级 MIG 关闭主动式实例重新分布功能,请向 regionInstanceGroupManagers.patch 方法发出 PATCH 请求。在请求正文中,添加 updatePolicy 属性并将其 instanceRedistributionType 字段设置为 NONE

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

{
    "updatePolicy": {
         "instanceRedistributionType": "NONE"
    }
}

请替换以下内容:

  • PROJECT_ID:此请求的项目 ID
  • REGION:实例组所在的地区
  • INSTANCE_GROUP_NAME:非自动扩缩 MIG 的名称

启用主动式实例分布功能

如需启用主动式实例分布功能,请使用与停用主动式实例重新分布功能类似的命令,但将实例重新分布类型设置为 PROACTIVE

如果您手动删除或移除某些代管实例,导致地区内虚拟机分布不均匀,则必须先手动重新平衡实例组,然后才能重新启用主动式实例重新分布功能。任意两个区域的虚拟机数量差不应超过 1 个虚拟机。

当各个区域中的虚拟机分布不均匀(两个区域的虚拟机数量差为 2 个或以上虚拟机)时,地区级 MIG 不允许启用主动式实例重新分布功能。这是为了防止意外自动删除具有较多虚拟机的区域中的虚拟机,该操作会为了实现均匀分布而触发。

手动重新平衡地区级 MIG

如果两个区域的虚拟机数量差为 2 个或以上虚拟机,则系统不会平衡 MIG。如果您停用主动式实例重新分布功能,然后删除或放弃实例以使区域之间的实例分布不均匀,则 MIG 可能会失去平衡。

您可以删除具有较多实例的区域中的虚拟机,或者调整实例组大小以向具有较少虚拟机的区域添加实例,从而通过手动方式使各个区域的实例均匀分布。

当您调整已关闭主动式实例重新分布功能的 MIG 的大小时,该实例组仍然会根据具体时机尽力实现平衡,通过每个调整大小操作来平衡实例组:

  • 扩大规模时,实例组总是会尝试为包含最少虚拟机的区域添加虚拟机。
  • 缩减规模时,实例组总是会从包含最多虚拟机的区域中移除虚拟机。
手动调整实例组大小以实现均匀重新分布的示例

模拟地区级 MIG 在一个区域发生服务中断的情况

如需测试您的地区级 MIG 的超额预配是否足够,能否在发生区域服务中断后继续运行,您可以使用以下示例来模拟一个区域发生的故障。

默认情况下,此脚本会停止并启动 Apache。如果这不适用于您的应用,请将停止和启动 Apache 的命令替换为您遇到的故障和恢复情况下的命令。

  1. 在实例组中的每个虚拟机中连续部署并运行此脚本。您可以通过以下方式完成此操作:将此脚本添加到实例模板,或将此脚本添加到自定义映像中,并在实例模板中使用该映像。

    #!/usr/bin/env bash
    
    # Copyright 2016 Google Inc. All Rights Reserved.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    set -o nounset
    set -o errexit
    set -o pipefail
    
    function GetMetadata() {
      curl -s "$1" -H "Metadata-Flavor: Google"
    }
    
    PROJECT_METADATA_URL="http://metadata.google.internal/computeMetadata/v1/project/attributes"
    INSTANCE_METADATA_URL="http://metadata.google.internal/computeMetadata/v1/instance"
    ZONE=$(GetMetadata "$INSTANCE_METADATA_URL/zone" | cut -d '/' -f 4)
    INSTANCE_NAME=$(hostname)
    
    # We keep track of the state to make sure failure and recovery is triggered only once.
    STATE="healthy"
    while true; do
      if [[ "$ZONE" = "$(GetMetadata $PROJECT_METADATA_URL/failed_zone)" ]] && \
         [[ "$INSTANCE_NAME" = *"$(GetMetadata $PROJECT_METADATA_URL/failed_instance_names)"* ]]; then
        if [[ "$STATE" = "healthy" ]]; then
          STATE="failure"
          # Do something to simulate failure here.
          echo "STARTING A FAILURE"
          /etc/init.d/apache2 stop
        fi
      else
        if [[ "$STATE" = "failure" ]] ; then
          STATE="healthy"
          # Do something to recover here.
          echo "RECOVERING FROM FAILURE"
          /etc/init.d/apache2 start
        fi
      fi
      sleep 5
    done
    
    
  2. 通过设置以下两个项目元数据字段来模拟在一个区域发生的故障:

    • failed_zone:设置您要在其中模拟服务中断情况的区域(假定只有一个区域发生了故障)。
    • failed_instance_names:按名称选择要离线的虚拟机(假定只有名称包含此字符串的虚拟机发生了故障)。

    您可以使用 gcloud 工具设置此元数据。例如,以下命令设置 europe-west1-b 区域发生服务中断的情况,并影响名称以 base-instance-name 开头的虚拟机:

    gcloud compute project-info add-metadata --metadata failed_zone='europe-west1-b',failed_instance_names='base-instance-name-'
  3. 模拟完服务中断情况后,通过移除元数据键来进行故障恢复:

    gcloud compute project-info remove-metadata --keys failed_zone,failed_instance_names

以下是一些可使用此脚本运行的故障场景:

  • 完全停止应用以查看 MIG 的响应方式。
  • 在进行负载平衡运行状况检查时,使您的虚拟机返回“运行状况不佳”。
  • 修改 iptables 以阻止一部分流量进出虚拟机。
  • 关停虚拟机。默认情况下,地区级 MIG 很快就会重新创建虚拟机,但只要设置了元数据值,新的虚拟机将在脚本运行后立即自行关停。这会导致崩溃循环。

后续步骤