在 MIG 中添加和移除虚拟机


创建代管式实例组 (MIG) 后,您可能需要在实例组中添加或移除虚拟机,以满足您的工作负载的需求。如果已达到默认上限,限制您可以向 MIG 添加的虚拟机数量上限,并且当您需要更多虚拟机时,您可以提高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

如需了解详情,请参阅自动扩缩实例组

手动设置 MIG 的大小

如果代管实例组尚未设置为自动扩缩,则可以手动调整组的大小以更改实例数。如果增加大小,则代管实例组会使用当前实例模板添加新实例。如果您要减小代管实例组的大小,则该实例组将删除自身所含的某些虚拟机。实例组首先会删除 currentActionDELETINGCREATINGRECREATING 的实例,然后才会删除正在运行并且无任何计划内操作的实例。

如果该实例组属于已启用连接排空后端服务,则在连接排空结束后,最长可能需要再等待 60 秒才会移除或删除虚拟机实例。

控制台

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

    转到“实例组”

  2. 在列表的名称列下方,点击要更改组大小的实例组的名称。

  3. 点击修改组以修改此代管式实例组。

  4. 实例数下方,指定要包含在此代管实例组中的实例的数量。如果启用了自动扩缩,则该组会根据需要自动添加或移除实例。不过,您可以更改实例数下限实例数上限值,以通过自动调节程序间接调节组大小。

  5. 点击保存以应用新模板。

gcloud

使用 resize 命令

gcloud compute instance-groups managed resize INSTANCE_GROUP_NAME \
    --size NEW_SIZE \
    --zone ZONE

REST

可用区区域 MIG 资源调用 resize 方法。以参数形式指定新的实例组大小。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/INSTANCE_GROUP_NAME/resize?size=NEW_SIZE

如果是区域托管实例组,请将 zones/ZONE 替换为 regions/REGION

当您发出调整代管实例组大小的请求后,虚拟机会在系统可以对其进行预配或删除后立即启动或停止。此过程可能会耗费大量时间,具体取决于组内的实例数。请验证代管式实例组内实例的状态

在调整大小期间停用创建重试模式

默认情况下,如果虚拟机实例的初始创建失败,则代管式实例组会不断重试,直到成功创建虚拟机为止。但是,如果您不希望自动重试创建,可以在调整实例组大小时停用重试创建模式。在此模式下,代管式实例组仅尝试创建所有实例一次。如果在创建实例期间出现错误,则代管式实例组会放弃此实例,将其从实例组的代管式实例列表中移除,并减小代管式实例组的目标大小。

此模式仅在首次尝试创建虚拟机期间适用。如果在启用此模式时成功创建了虚拟机,则此虚拟机的行为方式将与使用常规大小调整请求创建的所有其他虚拟机相同。特别要指出的是,如果正在运行的虚拟机日后异常终止并且需要重新创建,则在这种情况下,此模式不会影响重新创建行为。

如果您将系统设置为自动创建虚拟机组并且不需要提供确切数量的虚拟机,则停用创建重试模式特别有用。您可能希望让代管实例组的大小快速稳定下来,并能够灵活调整组内的虚拟机数量,而不是无限期地等待系统完成请求的所有实例的创建,因为配额错误或其他不相干的问题可能会导致实例的创建暂时或永久延迟。

限制

  • 您无法为具有 EVEN 目标分布形状的区域级 MIG 停用重试创建功能。
  • 对于具有 BALANCEDANY_SINGLE_ZONE 目标分布形状的区域级 MIG,您必须先停用主动式实例重新分布功能,然后才能停用创建重试模式。
  • 您无法为自动扩缩的 MIG 停用重试创建功能。

如需在停用重试创建模式的情况下调整代管式实例组的大小,请使用 Google Cloud CLI 或 REST。

gcloud

使用带有 --no-creation-retries 标志的 Beta 版 resize 命令

gcloud beta compute instance-groups managed resize INSTANCE_GROUP_NAME \
    --size NEW_SIZE \
    --no-creation-retries \
    [--region REGION | --zone ZONE]

替换以下内容:

  • INSTANCE_GROUP_NAME:您要调整大小的 MIG 的名称。
  • NEW_SIZE:托管式实例组中正在运行的实例的目标数量。
  • ZONE:对于可用区级 MIG,这是 MIG 所在的可用区。
  • REGION:对于区域级 MIG,这是 MIG 所在的区域。

REST

对于可用区级 MIG,请使用 Beta 版 instanceGroupManagers.resizeAdvanced 方法;对于区域级 MIG,请使用 Beta 版 regionInstanceGroupManagers.resizeAdvanced 方法。在请求正文中指定新的实例组大小和 noCreationRetries 字段。

例如,进行以下调用,以在停用重试创建模式的情况下调整可用区级 MIG 的大小。

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/INSTANCE_GROUP_NAME/resizeAdvanced

{
 "targetSize": NEW_SIZE,
 "noCreationRetries": true
}

替换以下内容:

  • PROJECT_ID:您的项目 ID。
  • ZONE:该 MIG 所在的可用区。对于区域级 MIG,将 zones/ZONE 替换为 regions/REGION 并指定区域。如需了解详情,请参阅区域级 MIG 简介
  • INSTANCE_GROUP_NAME:您要调整大小的 MIG 的名称。
  • NEW_SIZE:代管式实例组中正在运行的实例的目标数量。

    您可以使用 listManagedInstances 方法查看正在创建的实例及其所处的模式。停用重试创建模式后,创建的实例的 currentActionCREATING_WITHOUT_RETRIES

添加、移除或放弃特定实例

在 MIG 中创建具有特定名称的实例

如果您的系统依赖于特定名称,您可以将具有特定名称的虚拟机添加到现有 MIG。

如果 MIG 重新创建虚拟机,则您为这些托管实例分配的名称仍会保留。如需详细了解如何保留 MIG 实例状态,请参阅有状态 MIG

限制

如果您创建具有特定名称的实例:

  • 您必须在实例创建过程中停用自动扩缩功能。
  • 您必须将 MIG 的更新政策设置为寻机更新
  • 如果您要更新区域级 MIG:
  • 您不能在项目中使用重复的虚拟机实例名称。

您可以使用 gcloud CLIREST 将具有特定名称的虚拟机添加到现有 MIG。

gcloud

使用 instance-groups managed create-instance 命令

gcloud compute instance-groups managed create-instance INSTANCE_GROUP_NAME \
    --instance INSTANCE_NAME \
    [--region REGION | --zone ZONE]

替换以下内容:

  • INSTANCE_GROUP_NAME 是要添加新实例的区域级或可用区级 MIG 的名称。
  • INSTANCE_NAME 是您要分配给新实例的名称。

REST

regionInstanceGroupManagers.createInstances 方法发送 POST 请求。对于可用区代管式实例组,请使用 instanceGroupManagers.createInstances 方法。在请求正文中,添加包含一个或多个实例名称的 instances 字段。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME/createInstances
{
  "instances": [
    {
      "name": "INSTANCE_NAME_1"
    },
    {
      "name": "INSTANCE_NAME_2"
    }
  ]
}

删除实例组中的特定实例

您可以删除代管实例组内的个别虚拟机实例。删除实例会缩减实例组的指定 targetSize,并从虚拟机所属的任何目标池中移除该虚拟机。

从代管式实例组中删除特定实例不会更改任何指定的自动扩缩器设置。如果您从代管式实例组中删除实例,自动扩缩器可能会检测到实例组中其他实例的工作负载增加,并将实例组大小增加回其先前的水平。为了防止出现这种情况,请在尝试删除实例之前停止自动扩缩器

如果该实例组属于已启用连接排空后端服务,则在连接排空结束后,最长可能需要再等待 60 秒才会移除或删除虚拟机实例。

控制台

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

    转到“实例组”

  2. 在列表的名称列下方,点击要删除单个实例的实例组的名称。此时将打开一个页面,其中会显示实例组属性和组中包含的实例的列表。

  3. 成员部分中,从实例列表中选择要删除的一个或多个实例。

  4. 点击删除实例。选定的实例即会被删除。

gcloud

如需使用 gcloud CLI 删除实例,请使用 instance-groups managed delete-instances 命令

gcloud compute instance-groups managed delete-instances INSTANCE_GROUP_NAME \
    --instances INSTANCE_NAME_1,INSTANCE_NAME_2 \
    [--region REGION | --zone ZONE]

该命令返回每个实例的操作状态:

  • 如果 gcloud CLI 删除了实例,则返回 SUCCESS
  • 如果您在请求中指定的任何实例不是实例组的成员、任何成员已被删除或放弃,或者请求因任何其他原因失败,则会为所有实例返回 FAIL
  • 仅当您使用 --skip-instances-on-validation-error 标志且实例不是组成员或者实例已被删除或放弃时,才会返回 SKIPPED
  • 当 gcloud CLI 无法从实例名称解析可用区时,仅为区域组返回 MEMBER_NOT_FOUND

如果您预计删除请求可能与并发操作冲突,请使用 --skip-instances-on-validation-error 标志。此标志指定,即使请求包含不是实例组成员或者已经删除或放弃的实例(例如,被自动扩缩器删除的实例),请求是否应继续。默认情况下,如果您省略此标志并在请求中指定此类实例,则操作将失败。如果请求包含格式错误的实例名称或者引用了不在实例组的可用区或区域内的实例,则操作始终会失败。

例如,以下命令请求删除 4 个实例,但其中 3 个实例不再属于该组:

gcloud compute instance-groups managed delete-instances example-mig \
    --instances=example-instance-1,example-instance-2,example-instance-3,example-instance-4 \
    --region=us-central1 \
    --skip-instances-on-validation-error

在此示例中,3 个实例未通过验证,因此它们已被跳过,而 example-instance-3 被删除:

Updated [https://www.googleapis.com/compute/v1/projects/example-project/regions/us-central1/instanceGroupManagers/example-mig].
PROJECT          ZONE           INSTANCE               STATUS   VALIDATION_ERROR
example-project  us-central1-a  example-instance-1     SKIPPED  Cannot delete instance https://www.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/instances/example-instance-1 that was already deleted.
example-project  us-central1-a  example-instance-2     SKIPPED  Cannot delete instance https://www.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/instances/example-instance-2 that was already abandoned.
example-project  us-central1-a  example-instance-3     SUCCESS
example-project  us-central1-a  example-instance-4     SKIPPED  Cannot find instance https://www.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/instances/example-instance-4.

如果您省略 --skip-instances-on-validation-error 标志,并且任何实例未通过验证,则不会删除任何实例:

gcloud compute instance-groups managed delete-instances example-mig \
    --instances=example-instance-1,example-instance-2,example-instance-3,example-instance-4 \
    --region=us-central1

Updated [https://www.googleapis.com/compute/v1/projects/example-project/regions/us-central1/instanceGroupManagers/example-mig].
PROJECT          ZONE             INSTANCE              STATUS
example-project  us-central1-a    example-instance-1    FAIL
example-project  us-central1-a    example-instance-2    FAIL
example-project  us-central1-a    example-instance-3    FAIL
example-project  us-central1-a    example-instance-4    FAIL

REST

regionInstanceGroupManagers.deleteInstances 方法发送 POST 请求。对于可用区代管式实例组,请使用 instanceGroupManagers.deleteInstances 方法。

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

{
  "instances": [
    "zones/ZONE/instances/INSTANCE_NAME_1",
    "zones/ZONE/instances/INSTANCE_NAME_2"
   ]
}

如果您预计删除请求可能与并发操作冲突,请使用 skipInstancesOnValidationError 字段。此字段指定,即使请求包含不是实例组成员或者已经删除或放弃的实例(例如,被自动扩缩器删除的实例),请求是否应继续。默认情况下,如果您省略此标志并在请求中指定此类实例,则操作将失败。如果请求包含格式错误的实例名称或者引用了不在实例组的可用区或区域内的实例,则操作始终会失败。

例如,以下删除 2 个实例的请求将成功,即使其中一个实例已被删除或正在删除:

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

{
 "instances": [
  "zones/ZONE/instances/INSTANCE_NAME_1",
  "zones/ZONE/instances/INSTANCE_NAME_2"
 ],
 "skipInstancesOnValidationError": true
}

您可以通过查看操作来查看在操作中跳过的实例。对于区域级 MIG,请使用 regionOperations.get 方法。对于可用区级 MIG,请使用 zoneOperations.get 方法。警告列在操作的警告字段中。

当您发出删除代管实例组中的实例的请求后,只要系统可以删除这些实例,这些实例就会停止。此过程可能会耗费大量时间,具体取决于您从组中删除的实例数。验证组的状态验证托管实例的状态

放弃 MIG 中的实例

您可以将虚拟机实例从托管实例组中分离出来,以便更轻松地调试个别实例的问题,而不会影响整个实例组。放弃组中的某个实例时,也会从分配给托管实例组的负载均衡器中移除该实例。请注意,手动分配给特定单个实例的目标池不会被移除。

您无法将已放弃的虚拟机实例添加回该组。放弃实例会缩减实例组的指定 targetSize,但不会更改任何指定的自动扩缩程序设置。包含自动扩缩程序的托管实例组会根据需要继续自动添加或移除实例。对于自动扩缩设置为 ONLY_SCALE_OUT 模式的区域级 MIG,如果您放弃虚拟机实例以将 MIG 目标大小减小到自动扩缩器的建议大小,则自动扩缩器可能会在放弃的虚拟机的同一可用区中创建新的虚拟机实例。在这种情况下,为避免创建新的虚拟机实例,请尝试放弃其他可用区中的虚拟机实例。

如果该实例组属于已启用连接排空后端服务,则在连接排空结束后,最长可能需要再等待 60 秒才会移除或删除虚拟机实例。

控制台

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

    转到“实例组”

  2. 在列表的名称列下方,点击要从中移除实例的实例组的名称。此时将打开一个页面,其中会显示实例组属性和组中包含的实例的列表。

  3. 成员部分中,从实例列表中选择一个或多个要从组中移除的实例。

  4. 点击从组中移除。选定的实例即会从组中移除,但会继续在组外运行。

gcloud

如需从实例组中移除实例而不删除虚拟机,请使用 instance-groups managed abandon-instances 子命令。

gcloud compute instance-groups managed abandon-instances INSTANCE_GROUP_NAME \
    --instances INSTANCE_NAME_1,INSTANCE_NAME_2 \
    [--region REGION | --zone ZONE]

REST

regionInstanceGroupManagers.abandonInstances 方法发送 POST 请求。对于可用区代管式实例组,请使用 instanceGroupManagers.abandonInstances 方法。

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

{
 "instances": [
  "zones/ZONE/instances/INSTANCE_NAME_1",
  "zones/ZONE/instances/INSTANCE_NAME_2"
 ]
}

在您发出从代管实例组中放弃实例的请求后,该组会尽快移除相应实例。验证组的状态验证托管实例的状态

提高实例组的大小限制

默认情况下,可用区级 MIG 的大小限制为 1000 个虚拟机,区域级 MIG 的大小限制为 2000 个虚拟机。您可以进一步将这些限制提高到 2000 个(对于可用区级 MIG)和 4000 个虚拟机(对于区域级 MIG)。

如需提高限制,请将实例组的 listManagedInstancesResults 字段设置为 PAGINATED。如果群组中还需要更多虚拟机,请创建多个 MIG 或与支持团队联系

控制台

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

    转到“实例组”

  2. 在列表的名称列下方,点击要提高大小限制的实例组的名称。

  3. 点击修改以修改此实例组。

  4. 点击显示高级配置,展开高级设置部分。

  5. 代管式实例列表 API 调用结果下,选择分页选项。

  6. 点击保存以应用更改。

gcloud

对于现有 MIG,请使用 update 命令

gcloud compute instance-groups managed update INSTANCE_GROUP_NAME \
    --list-managed-instances-results=PAGINATED

对于新的 MIG,请使用 create 命令

gcloud compute instance-groups managed create INSTANCE_GROUP_NAME \
    --template INSTANCE_TEMPLATE \
    --size SIZE \
    --list-managed-instances-results=PAGINATED

Terraform

如需提高 MIG 的大小限制,请将 list_managed_instances_results 参数设置为 PAGINATED

以下示例提高了可用区级 MIG 的大小限制。如需详细了解示例中使用的资源,请参阅 google_compute_instance_group_manager 资源。对于区域级 MIG,请使用 google_compute_region_instance_group_manager 资源

resource "google_compute_instance_group_manager" "default" {
  name                           = "my-igm"
  base_instance_name             = "test"
  target_size                    = 7
  zone                           = "us-central1-f"
  list_managed_instances_results = "PAGINATED"
  version {
    instance_template = google_compute_instance_template.default.id
    name              = "primary"
  }
}

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

REST

对于现有的可用区级 MIG,请使用 instanceGroupManagers.patch 方法;对于区域级 MIG,请使用 regionInstanceGroupManagers.patch 方法 - 例如:

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/region/REGION/regionInstanceGroupManagers/INSTANCE_GROUP_NAME

{
  "listManagedInstancesResults": "PAGINATED",
}

对于新的可用区级 MIG,请使用 instanceGroupManagers.insert 方法;对于区域级 MIG,请使用 regionInstanceGroupManagers.insert 方法

如果要切换回无页面列表结果,您还必须还原为该组的默认大小限制。如需切换回,请先确保该组没有超出其默认大小限制,然后将 listManagedInstancesResults 字段设置为 PAGELESS

后续步骤