本文档介绍如何创建代管式实例组 (MIG)。MIG 是您将其作为单个实体进行控制的一组虚拟机 (VM) 实例。MIG 支持自动修复、负载平衡、自动扩缩、自动更新、有状态工作负载等功能。
您可以创建地区级 MIG 或区域级 MIG。地区级 MIG 可提供比区域级 MIG 更高的可用性,因为地区级 MIG 中的实例分布在单个地区内的多个区域中。本文档介绍如何创建区域级 MIG 或地区级 MIG。但是,地区级 MIG 具有额外的选项和注意事项。如需详细了解地区级 MIG,请参阅地区级 MIG 概览。
如需了解有关实例组及其功能的概念信息,请参阅实例组概览。
准备工作
- 如果您要使用本指南中的 API 示例,请设置 API 访问权限。
- 如果希望使用本指南中的命令行示例,请安装
gcloud
命令行工具。 - 创建实例模板,这是代管式实例组的基础组件。
限制
- 使用地区级 MIG,您可以在一个地区中最多创建 2000 个虚拟机,其中每个区域的虚拟机数量上限为 1000 个。使用区域级 MIG,您最多可以创建 1000 个虚拟机。如果您需要更多信息,请与支持团队联系。
- 更新 MIG 时,您可以在单个请求中最多指定 1000 个虚拟机。
如果您需要地区级 MIG,请查看地区级 MIG 限制。
只有单个虚拟机才支持
nic0
以外的接口上的共享 VPC。Compute Engine 实例模板或代管式实例组不支持此功能。
无状态或有状态 MIG
您可以将 MIG 用于无状态传送工作负载或批处理工作负载(例如队列中的网站前端或图片处理),也可用于有状态应用(例如数据库或旧版应用)。
对无状态应用使用 MIG
无状态应用不依赖于要运行的基础虚拟机 (VM) 实例的状态。如果使用无状态 MIG,则您的应用不应依赖于不持久的虚拟机属性,例如附加磁盘内容或内存数据的内容。如果您的应用需要保留虚拟机属性,请参阅配置有状态 MIG。
MIG 中所有永久性磁盘的默认行为是在删除或重新创建相应的虚拟机时删除或重新创建永久性磁盘,因此您不应使用挂接的磁盘存储永久性数据。如需将数据保留在无状态 MIG 中,我们建议您定期更新软件和配置的最新自定义映像,或使用 启动脚本,并配置您的应用,以便将必要的数据备份到另一个集中的位置(例如 Cloud Storage)。
在实例模板中,您可以指定容器映像或自定义映像和相关的启动脚本,以确保重新创建的虚拟机会安装必要的应用并可以访问所需的数据。如需详细了解如何创建实例模板,请参阅确定性实例模板。
对有状态应用使用 MIG
代管式实例组还支持有状态应用。有状态 MIG 会在机器重启、重新创建、自动修复或更新后保留每个虚拟机的独有状态(虚拟机实例名称、挂接的 Persistent Disk 和/或元数据)。
将有状态 MIG 用于具有有状态数据或配置的应用,例如数据库、数据处理应用、旧式应用以及设有检查点且长时间运行的批量工作负载。
如果您要将有状态应用或集群部署到 Compute Engine,并希望通过自动修复和多区域部署来提高其可用性,或者希望通过自动滚动更新来简化和加速更新,请考虑使用有状态 MIG。
如需了解如何创建有状态 MIG 或向现有 MIG 添加有状态配置,请参阅配置有状态 MIG。
创建代管实例组
MIG 会根据您指定的实例模板和可选的有状态配置来创建每个代管式实例。每个代管式实例都是 MIG 中的数据实体,其中包含实际虚拟机实例的当前状态和预期状态。MIG 会主动确保实际虚拟机可用(即处于 RUNNING
状态),以保持应用的高可用性。
您可以通过 Google Cloud Console、gcloud
工具或 Compute Engine API 创建 MIG。如果您想创建地区级 MIG,请参阅创建地区级 MIG。
控制台
gcloud
使用 instance-groups managed create
命令创建实例组。
gcloud compute instance-groups managed create INSTANCE_GROUP_NAME \ --size SIZE \ --template INSTANCE_TEMPLATE \ --zone ZONE
请替换以下内容:
INSTANCE_GROUP_NAME
:此实例组的名称。SIZE
:此实例组的大小。INSTANCE_TEMPLATE
:该组将使用的实例模板的名称。ZONE
:提供 Compute Engine 服务的一个可用区。如需创建区域级 MIG,请参阅创建和管理区域级 MIG。
您可以选择提供 --base-instance-name
标志。由于这些虚拟机是基于通用模板创建的,因此系统会为每个虚拟机分配一个随机字符串,作为虚拟机名称的一部分。基本名称加在此随机字符串的前面。例如,如果您将基本名称设置为 test
,则虚拟机名称将类似于 test-yahs
和 test-qtyz
。如果您需要特定名称,请参阅在 MIG 中创建具有特定名称的实例。
例如,以下命令会创建名为 example-group 的实例组,其基本虚拟机名称为 test
。该组包含三个实例:
gcloud compute instance-groups managed create example-group \ --base-instance-name test \ --size 3 \ --template an-instance-template
API
调用 instanceGroupManagers.insert
方法或 regionInstanceGroupManagers.insert
方法。在请求正文中,包含实例组名称、实例组大小和实例模板的网址。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers { "versions": [ { "instanceTemplate": "global/instanceTemplates/INSTANCE_TEMPLATE" } ], "name": "INSTANCE_GROUP_NAME", "targetSize": SIZE }
请替换以下内容:
PROJECT_ID
:请求的项目 ID。ZONE
:请求所在的可用区。对于区域级 MIG,将zones/ZONE
替换为regions/REGION
并指定区域。如需了解详情,请参阅创建和管理区域级 MIG。INSTANCE_GROUP_NAME
:此实例组的名称。SIZE
:此实例组的大小。INSTANCE_TEMPLATE
:此实例组将使用的实例模板。
您可以选择提供 base-name
字段。由于这些虚拟机是基于通用模板创建的,因此系统会为每个虚拟机分配一个随机字符串,作为虚拟机名称的一部分。基本名称加在此随机字符串的前面。例如,如果您将基本名称设置为 test
,则虚拟机名称将类似于 test-yahs
和 test-qtyz
。如果您需要特定名称,请参阅在 MIG 中创建具有特定名称的实例。
各种政策和操作可能会影响组中的实例,具体取决于您对 MIG 进行配置和操作的方式。若要确定哪些代管实例已启动并正在运行,请参阅检查代管实例的状态。
更改托管实例组的实例模板
如需了解如何将新的实例模板应用于 MIG,请参阅更新 MIG 中的实例。
调整代管实例组的大小
如需在 MIG 中添加实例或从 MIG 中移除虚拟机,您可以执行以下操作:
- 对无状态应用使用自动扩缩功能。
- 手动设置 MIG 的大小。
- 创建具有特定名称的实例或删除/放弃特定实例。
自动调整 MIG 的大小
您可以将代管实例组配置为根据其工作负载自动添加或移除虚拟机。您的应用将可以顺利应对流量增加的情况,同时您也可以在计算资源需求量降低时缩减费用。如需开始扩缩代管实例组,请参阅自动扩缩实例组。
手动设置 MIG 的大小
如果代管实例组尚未设置为自动扩缩,则可以手动调整组的大小以更改实例数。如果增加大小,则代管实例组会使用当前实例模板添加新实例。如果您要减小代管实例组的大小,则该实例组将删除自身所含的某些虚拟机。实例组首先会删除 currentAction
为 DELETING
、CREATING
和 RECREATING
的实例,然后才会删除正在运行并且无任何计划内操作的实例。
如果该实例组属于已启用连接排空的后端服务,则在连接排空结束后,最长可能需要再等待 60 秒才会移除或删除虚拟机实例。
您可以使用 Google Cloud Console、gcloud
工具或 Compute Engine API 调整代管式实例组的大小。
控制台
- 在 Cloud Console 中,转到实例组页面。
- 在列表的名称列下方,点击要更改组大小的实例组的名称。
- 点击修改组以修改此代管实例组。
- 在实例数下方,指定要包含在此代管实例组中的实例的数量。如果启用了自动扩缩,则该组会根据需要自动添加或移除实例。不过,您可以更改实例数下限和实例数上限值,以通过自动调节程序间接调节组大小。
- 点击保存以应用新模板。
gcloud
使用 resize
命令。
gcloud compute instance-groups managed resize INSTANCE_GROUP_NAME \ --size NEW_SIZE \ --zone ZONE
API
为可用区或区域 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
。
当您发出调整代管实例组大小的请求后,虚拟机会在系统可以对其进行预配或删除后立即启动或停止。此过程可能会耗费大量时间,具体取决于组内的实例数。请验证代管实例组内实例的状态。
在调整大小期间停用创建重试模式
默认情况下,如果虚拟机实例的初始创建失败,则代管实例组会不断重试,直到成功创建虚拟机为止。但是,如果您不希望系统自动重试创建操作,可以在调整实例组大小时设置 --nocreation-retries
标志来停用创建重试模式。在此模式下,代管实例组仅尝试创建所有实例一次。如果在创建实例期间出现错误,则代管实例组会放弃此实例,将其从实例组的代管实例列表中移除,并减小代管实例组的目标大小。
此模式仅在首次尝试创建虚拟机期间适用。如果在启用此模式时成功创建了虚拟机,则此虚拟机的行为方式将与使用常规大小调整请求创建的所有其他虚拟机相同。特别要指出的是,如果正在运行的虚拟机日后异常终止并且需要重新创建,则在这种情况下,此模式不会影响重新创建行为。
如果您将系统设置为自动创建虚拟机组并且对虚拟机的准确数量不做要求,则停用创建重试模式特别有用。您可能希望让代管实例组的大小快速稳定下来,并能够灵活调整组内的虚拟机数量,而不是无限期地等待系统完成请求的所有实例的创建,因为配额错误或其他不相干的问题可能会导致实例的创建暂时或永久延迟。
如需在已停用创建重试模式的情况下调整代管式实例组的大小,请使用 gcloud
工具或 Compute Engine API。
gcloud
使用带有 --no-creation-retries
标志的 Beta 版 resize
命令。
gcloud beta compute instance-groups managed resize INSTANCE_GROUP_NAME --size NEW_SIZE \ --no-creation-retries \ --zone ZONE
API
为可用区或区域 MIG 资源调用 Beta 版 resizeAdvanced
方法。在请求正文中指定新的实例组大小和 noCreationRetries
字段。
POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/INSTANCE_GROUP_NAME/resizeAdvanced { "targetSize": SIZE "noCreationRetries": true }
如果是区域托管实例组,请将 zones/ZONE
替换为 regions/REGION
。
您可以使用 listManagedInstances
方法查看正在创建的实例及其所处的模式。对于在停用创建重试模式下创建的实例,其 currentAction
为 CREATING_WITHOUT_RETRIES
。
在 MIG 中创建具有特定名称的实例
如果您的系统依赖于特定名称,您可以创建具有这些名称的虚拟机。分配给这些代管实例的名称会在虚拟机重新创建后保留。请参阅添加具有特定名称的实例。
删除实例组中的特定实例
您可以删除代管实例组内的个别虚拟机实例。删除实例会缩减实例组的指定 targetSize
,并从虚拟机所属的任何目标池中移除该虚拟机。
从代管实例组删除实例不会更改任何指定的自动调节程序设置。如果您从代管实例组中删除实例,则自动调节程序可能会检测到组中其他实例的工作负载增加,并将组大小增加回其先前的级别。为防止出现这种情况,请先关闭或删除自动调节程序,然后再尝试删除实例。
如果该实例组属于已启用连接排空的后端服务,则在连接排空结束后,最长可能需要再等待 60 秒才会移除或删除虚拟机实例。
您可以使用 Google Cloud Console、gcloud
工具或 Compute Engine API 从代管式实例组中删除实例。
控制台
- 在 Cloud Console 中,转到实例组页面。
- 在列表的名称列下方,点击要删除单个实例的实例组的名称。此时将打开一个页面,其中会显示实例组属性和组中包含的实例的列表。
- 在实例列表中,选择要删除的一个或多个实例。
- 点击删除。选定的实例即会被删除。
gcloud
gcloud compute instance-groups managed delete-instances INSTANCE_GROUP_NAME \ --instances example-i3n2,example-z2x9 \ --zone ZONE
API
为可用区或区域 MIG 资源调用 deleteInstances
方法。在请求正文中添加要删除的一个或多个实例的网址。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/INSTANCE_GROUP_NAME/deleteInstances { "instances": [ "zones/ZONE/instances/example-instance-i3n2", "zones/ZONE/instances/example-instance-l6n1" ] }
如果是区域托管实例组,请将 zones/ZONE
替换为 regions/REGION
。
当您发出删除代管实例组中的实例的请求后,只要系统可以删除这些实例,这些实例就会停止。此过程可能会耗费大量时间,具体取决于您从组中删除的实例数。您可以验证代管实例组中的实例状态。
放弃实例组中的实例
您可以将虚拟机实例从代管实例组中分离出来,以便更轻松地调试个别虚拟机的问题,而不影响整个实例组。放弃代管实例组的某个实例时,该虚拟机也会从分配给该实例组的负载平衡器中移除。请注意,手动分配给特定单个实例的目标池不会被移除。
放弃实例会缩减实例组的指定 targetSize
,但不会更改任何指定的自动扩缩器设置。包含自动扩缩器的代管实例组会继续根据需要自动添加或移除虚拟机。
如果该实例组属于已启用连接排空的后端服务,则在连接排空结束后,最长可能需要再等待 60 秒才会移除或删除虚拟机实例。
使用 Google Cloud Console、gcloud
工具或 Compute Engine API 放弃代管式实例组中的实例。
控制台
- 在 Cloud Console 中,转到实例组页面。
- 在列表的名称列下方,点击要从中移除实例的实例组的名称。此时将打开一个页面,其中会显示实例组属性和组中包含的实例的列表。
- 在实例列表中,选择要从组中移除的一个或多个实例。
- 点击从组中移除。选定的实例即会从组中移除,但会继续在组外运行。
gcloud
如需从实例组中移除实例而不删除实例,请使用 abandon-instances
命令。
gcloud compute instance-groups managed abandon-instances INSTANCE_GROUP_NAME \ --instances example-i3n2,example-z2x9 \ --zone ZONE
API
为可用区或区域 MIG 资源调用 abandonInstances
方法。在请求正文中包含要放弃的一个或多个实例的网址。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/INSTANCE_GROUP_NAME/abandonInstances { "instances": [ "zones/ZONE/instances/example-instance-i3n2", "zones/ZONE/instances/example-instance-l6n1" ] }
如果是区域托管实例组,请将 zones/ZONE
替换为 regions/REGION
。
在您发出从代管实例组中放弃实例的请求后,该组会尽快移除相应实例。您可以验证代管实例组中的实例状态。
在组内重新创建实例
重新创建某个代管实例会删除指定的虚拟机,并使用分配给该代管实例组的实例模板创建新的虚拟机。
您可以使用此方法来更新选定的虚拟机,让这些虚拟机使用最新的实例模板。如果您需要重新创建代管实例组内的所有虚拟机,请改为启动滚动更新。
如果该实例组属于已启用连接排空的后端服务,则在连接排空结束后,最长可能需要再等待 60 秒才会移除或删除虚拟机实例。
使用 gcloud
工具或 Compute Engine API 重新创建代管式实例组中的选定虚拟机。
gcloud
gcloud compute instance-groups managed recreate-instances INSTANCE_GROUP_NAME \ --instances example-i3n2,example-z2x9 \ --zone ZONE
API
为可用区或区域 MIG 资源调用 recreateInstances
方法。在请求正文中添加要重新创建的一个或多个实例的网址。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/INSTANCE_GROUP_NAME/recreateInstances { "instances": [ "zones/ZONE/instances/example-instance-i3n2", "zones/ZONE/instances/example-instance-l6n1" ] }
如果是区域托管实例组,请将 zones/ZONE
替换为 regions/REGION
。
在您发出重新创建代管实例组内的实例的请求后,新虚拟机会在系统可以对其进行预配后立即启动。此过程可能会耗费大量时间,具体取决于您重新创建的实例数。请验证代管实例组内实例的状态。
删除托管实例组
当您删除代管实例组时,该实例组内的所有虚拟机也将随之删除。如果您必须保留此代管实例组内的某些虚拟机,请先放弃这些实例,以将虚拟机从该实例组移除。然后再删除代管实例组。
当您使用 Google Cloud Console 或 gcloud
工具删除代管式实例组及其实例时,所有附加的自动扩缩器也会自动删除。但是,如果您使用的是 Compute Engine API,则必须先发出单独的请求来通过 autoscalers.delete
或 regionAutoscalers.delete
删除任何附加的自动扩缩器。
控制台
- 在 Cloud Console 中,转到实例组页面。
- 在列表中选择一个或多个要删除的组。
- 点击删除,以删除该实例组以及代管实例组内的所有虚拟机。
gcloud
使用 delete
命令。
gcloud compute instance-groups managed delete INSTANCE_GROUP_NAME \ --zone ZONE
API
DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/INSTANCE_GROUP_NAME
如果是区域托管实例组,请将 zones/ZONE
替换为 regions/REGION
。
创建抢占式实例组
您可以使用代管实例组快速创建多个抢占式实例,这样可以降低代管实例组内虚拟机的费用。例如,您可以创建一组抢占式实例,使用这些实例运行批处理任务,然后在任务完成时删除该组。
要创建一组抢占式实例,请在实例模板中设置抢占式选项,然后使用该模板创建托管实例组。
控制台
- 在 Cloud Console 中,转到实例模板页面。
- 点击新建实例模板。
- 根据需要填写实例模板的属性。
- 点击显示高级选项以展开可用性政策部分。
- 将抢占设置为开启。
- 点击创建以创建模板。
- 使用此模板创建托管实例组。
gcloud
使用 instance-templates create
命令创建实例模板。添加 --preemptible
标志。
gcloud compute instance-templates create INSTANCE_TEMPLATE \ --preemptible
创建实例模板后,使用该模板来创建代管实例组。
API
调用 instanceTemplates.insert
方法以创建一个新的实例模板。包含 scheduling.preemptible
属性并将其设为 true
。
{ "name": "INSTANCE_TEMPLATE", "properties": { "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE", "networkInterfaces": [ { "network": "global/networks/default", "accessConfigs": [ { "name": "external-IP", "type": "ONE_TO_ONE_NAT" } ] } ], "scheduling": { "preemptible": true }, "disks": [ { "type": "PERSISTENT", "boot": true, "mode": "READ_WRITE", "initializeParams": { "sourceImage": "projects/debian-cloud/global/images/family/debian-9" } } ] } }
创建实例模板后,使用该模板来创建代管实例组。
了解 instanceTemplate
和 versions
字段
创建代管实例组时,您需要提供一个实例模板,以便代管实例组用于创建各个虚拟机实例。默认情况下,Compute Engine 以两个单独的 Compute Engine API 属性(顶级 instanceTemplate
属性和 versions
属性)来描述使用的实例模板。例如,在以下代管实例组中,请注意 instanceTemplate
和 versions
字段已填充:
{ "name": "example-group", "zone": "zones/us-central1-a", "instanceTemplate": "global/instanceTemplates/example-it", "versions": [ { "name": "v3", "instanceTemplate": "global/instanceTemplates/example-it", "targetSize": { "calculated": 3 } } ]... }
Compute Engine 会自动填充顶级 instanceTemplate
字段和 versions
字段,以实现向后兼容性。我们建议您尽可能指定 versions
字段并忽略顶级 instanceTemplates
字段。但是,如果您的应用代码当前设置了顶级 instanceTemplate
字段,那么它仍然是一个有效的请求。
如需了解详情,请参阅版本和 instanceTemplate 字段之间的关系。
(高级)使用托管实例组对实例模板进行 Canary 更新
您可以创建一个代管式实例组,其中包含两组使用不同实例模板的虚拟机。例如,您可以创建一个包含 20 个虚拟机实例的代管式实例组,其中 10 个虚拟机应在特定操作系统映像上运行,而其余的虚拟机则在其他操作系统映像上运行。借助此功能,您可以先比较两个不同的实例模板版本,然后再决定使用其中哪个版本。
如需了解详情,请参阅 Canary 版更新。
托管实例组和 IAM
由 Compute Engine 执行的关于代管式实例组的所有操作都是由项目的 Google API 服务帐号执行的。每个项目的服务帐号的电子邮件地址如下所示,其中 PROJECT_ID
是相应项目的数字 ID:
PROJECT_ID@cloudservices.gserviceaccount.com
Google API 服务帐号与默认的 Compute Engine 服务帐号不同。
因此,您应确保代管实例组使用的服务帐号具有足够的权限,可基于实例模板创建资源。具体来说,这意味着服务帐号需要被授予 compute.instanceAdmin.v1
和 serviceAccountUser
角色(可选),这样才能在实例组中创建和管理虚拟机。仅当代管实例组将创建可以服务帐号身份运行的虚拟机时,才需要使用 serviceAccountUser
角色。请注意,此帐号也会被其他进程(包括 Deployment Manager)使用。
当您创建代管实例组或更新实例模板时,Compute Engine 会验证 Google API 服务帐号是否具有以下角色/权限:
serviceAccountUser
角色。如果您计划创建可以服务帐号身份运行的实例,则该角色很重要。- 针对通过实例模板引用的所有资源(例如映像、磁盘、VPC 网络和子网)的权限。
如需详细了解服务帐号,请参阅服务帐号概览。
更新托管实例组中的所有实例
请参阅更新 MIG 中的实例。
后续步骤
- 了解如何使用代管式实例,例如,了解如何删除、放弃和重新创建代管式实例。
- 获取有关代管实例组和代管实例的信息。
- 选择负载平衡器或将实例组添加到负载平衡器。
- 为代管实例组启用自动修复功能。
- 为代管实例组启用自动扩缩功能。
- 试用教程:
- 排查代管式实例组问题。