创建托管式实例组 (MIG) 后,您可能需要在实例组中添加或移除虚拟机,以满足您的工作负载的需求。如果已达到默认上限,限制您可以向 MIG 添加的虚拟机数量上限,并且当您需要更多虚拟机时,您可以提高MIG 的大小限制。
如需在 MIG 中添加或移除虚拟机,您可以执行以下操作:
- 通过设置 MIG 的目标大小来自动添加或移除虚拟机:
- 对无状态应用使用自动扩缩功能
- 手动设置 MIG 的大小
- 手动添加、移除或放弃特定实例:
准备工作
-
如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以选择以下任一选项向 Compute Engine 进行身份验证:
Select the tab for how you plan to use the samples on this page:
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Set a default region and zone.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
Terraform
如需在本地开发环境中使用本页面上的 Terraform 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。
如需了解详情,请参阅 Set up authentication for a local development environment。
REST
如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证。
-
设置实例组的目标大小
您可以使用自动扩缩器自动设置 MIG 的目标大小,也可以手动设置大小。
在 MIG 中自动添加和移除虚拟机
您可以将代管实例组配置为根据其工作负载自动添加或移除虚拟机。您的应用将可以顺利应对流量增加的情况,同时您也可以在计算资源需求量降低时缩减费用。如需开始扩缩代管式实例组,请参阅创建具有自动扩缩功能的 MIG。
如需了解详情,请参阅自动扩缩实例组。
手动设置 MIG 的大小
如果托管式实例组尚未设置为自动扩缩,则可以手动调整组的大小以更改实例数。如果增加大小,则托管式实例组会使用当前实例模板添加新实例。如果您要减小托管式实例组的大小,则该实例组将删除自身所含的某些虚拟机。实例组首先会删除 currentAction
为 DELETING
、CREATING
和 RECREATING
的实例,然后才会删除正在运行并且无任何计划内操作的实例。
如果该实例组属于已启用连接排空的后端服务,则在连接排空结束后,最长可能需要再等待 60 秒才会移除或删除虚拟机实例。
执行此任务所需的权限
您必须拥有以下权限才能执行此任务:
- 针对托管式实例组的
compute.instanceGroupManagers.update
权限
在 Google Cloud 控制台中,前往实例组页面。
在列表的名称列下方,点击要更改组大小的实例组的名称。
点击编辑以修改此托管式实例组。
在实例数下方,指定要包含在此托管式实例组中的实例的数量。如果启用了自动扩缩,则该组会根据需要自动添加或移除实例。不过,您可以更改实例数下限和实例数上限值,以通过自动调节程序间接调节组大小。
点击保存以应用新模板。
使用 resize
命令。
gcloud compute instance-groups managed resizeINSTANCE_GROUP_NAME \ --sizeNEW_SIZE \ --zoneZONE
为可用区或区域 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 停用重试创建功能。 - 对于具有
BALANCED
或ANY_SINGLE_ZONE
目标分布形状的区域级 MIG,您必须先停用主动式实例重新分布功能,然后才能停用创建重试模式。 - 您无法为自动扩缩的 MIG 停用重试创建功能。
如需在停用重试创建模式的情况下调整托管式实例组的大小,请使用 Google Cloud CLI 或 REST。
执行此任务所需的权限
您必须拥有以下权限才能执行此任务:
- 针对托管式实例组的
compute.instanceGroupManagers.update
权限
使用带有 --no-creation-retries
标志的 Beta 版 resize
命令。
gcloud beta compute instance-groups managed resizeINSTANCE_GROUP_NAME \ --sizeNEW_SIZE \ --no-creation-retries \ [--regionREGION | --zoneZONE ]
替换以下内容:
INSTANCE_GROUP_NAME
:您要调整大小的 MIG 的名称。NEW_SIZE
:托管式实例组中正在运行的实例的目标数量。ZONE
:对于可用区级 MIG,这是 MIG 所在的可用区。REGION
:对于区域级 MIG,这是 MIG 所在的区域。
对于可用区级 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
方法查看正在创建的实例及其所处的模式。停用重试创建模式后,创建的实例的currentAction
为CREATING_WITHOUT_RETRIES
。
添加、移除或放弃特定实例
在 MIG 中创建具有特定名称的实例
如果您的系统依赖于特定名称,您可以将具有特定名称的虚拟机添加到现有 MIG。
如果 MIG 重新创建虚拟机,则您为这些托管实例分配的名称仍会保留。如需详细了解如何保留 MIG 实例状态,请参阅有状态 MIG。
限制
如果您创建具有特定名称的实例:
- 您必须在实例创建过程中停用自动扩缩功能。
- 您必须将 MIG 的更新政策设置为寻机更新。
- 如果您要更新区域级 MIG:
- 您必须停用主动式实例重新分布功能。
- 您不能选择要在其中创建虚拟机的可用区。
- 您不能在项目中使用重复的虚拟机实例名称。
您可以使用 gcloud CLI 或 REST 将具有特定名称的虚拟机添加到现有 MIG。
执行此任务所需的权限
您必须拥有以下权限才能执行此任务:
- 针对代管实例组的
compute.instanceGroupManagers.update
权限
使用 instance-groups managed create-instance
命令。
gcloud compute instance-groups managed create-instanceINSTANCE_GROUP_NAME \ --instanceINSTANCE_NAME \ [--regionREGION | --zoneZONE ]
替换以下内容:
- INSTANCE_GROUP_NAME 是要添加新实例的区域级或可用区级 MIG 的名称。
- INSTANCE_NAME 是您要分配给新实例的名称。
向 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 秒才会移除或删除虚拟机实例。
执行此任务所需的权限
您必须拥有以下权限才能执行此任务:
- 针对代管实例组的
compute.instanceGroupManagers.update
权限
在 Google Cloud 控制台中,前往实例组页面。
在列表的名称列下方,点击要删除单个实例的实例组的名称。此时将打开一个页面,其中会显示实例组属性和组中包含的实例的列表。
在成员部分中,从实例列表中选择要删除的一个或多个实例。
点击删除实例。选定的实例即会被删除。
如需使用 gcloud CLI 删除实例,请使用 instance-groups managed delete-instances
命令。
gcloud compute instance-groups managed delete-instancesINSTANCE_GROUP_NAME \ --instancesINSTANCE_NAME_1 ,INSTANCE_NAME_2 \ [--regionREGION | --zoneZONE ]
该命令返回每个实例的操作状态:
- 如果 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
向 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 秒才会移除或删除虚拟机实例。
执行此任务所需的权限
您必须拥有以下权限才能执行此任务:
- 针对代管实例组的
compute.instanceGroupManagers.update
权限
在 Google Cloud 控制台中,前往实例组页面。
在列表的名称列下方,点击要从中移除实例的实例组的名称。此时将打开一个页面,其中会显示实例组属性和组中包含的实例的列表。
在成员部分中,从实例列表中选择一个或多个要从组中移除的实例。
点击从组中移除。选定的实例即会从组中移除,但会继续在组外运行。
如需从实例组中移除实例而不删除虚拟机,请使用 instance-groups managed abandon-instances
子命令。
gcloud compute instance-groups managed abandon-instancesINSTANCE_GROUP_NAME \ --instancesINSTANCE_NAME_1 ,INSTANCE_NAME_2 \ [--regionREGION | --zoneZONE ]
向 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 或与支持团队联系。
在 Google Cloud 控制台中,前往实例组页面。
在列表的名称列下方,点击要提高大小限制的实例组的名称。
点击修改以修改此实例组。
点击显示高级配置,展开高级设置部分。
在代管式实例列表 API 调用结果下,选择分页选项。
点击保存以应用更改。
对于现有 MIG,请使用 update
命令:
gcloud compute instance-groups managed updateINSTANCE_GROUP_NAME \ --list-managed-instances-results=PAGINATED
对于新的 MIG,请使用 create
命令:
gcloud compute instance-groups managed createINSTANCE_GROUP_NAME \ --templateINSTANCE_TEMPLATE \ --sizeSIZE \ --list-managed-instances-results=PAGINATED
如需提高 MIG 的大小限制,请将 list_managed_instances_results
参数设置为 PAGINATED
。
以下示例提高了可用区级 MIG 的大小限制。如需详细了解示例中使用的资源,请参阅 google_compute_instance_group_manager
资源。对于区域级 MIG,请使用 google_compute_region_instance_group_manager
资源。
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
对于现有的可用区级 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
。
后续步骤
- 了解如何使用代管式实例,例如,了解如何删除、放弃和重新创建代管式实例。
- 查看有关代管式实例组和代管式实例的信息。
- 排查代管式实例组问题。