创建托管实例组

本文档介绍如何创建代管式实例组 (MIG)。MIG 是您将其作为单个实体进行控制的一组虚拟机 (VM) 实例。MIG 支持自动修复负载平衡自动扩缩自动更新有状态工作负载等功能。

您可以创建地区级 MIG 或区域级 MIG。地区级 MIG 可提供比区域级 MIG 更高的可用性,因为地区级 MIG 中的实例分布在单个地区内的多个区域中。本文档介绍如何创建区域级 MIG 或地区级 MIG。但是,地区级 MIG 具有额外的选项和注意事项。如需详细了解地区级 MIG,请参阅地区级 MIG 概览

如需了解有关实例组及其功能的概念信息,请参阅实例组概览

准备工作

限制

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

  • 如果您需要地区级 MIG,请查看地区级 MIG 限制

  • gcloud 工具和 API 支持托管实例组中位于 nic0 以外的接口的共享 VPC,但 Cloud Console 不支持。

无状态或有状态 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 Consolegcloud 工具Compute Engine API 创建 MIG。如果您想创建地区级 MIG,请参阅创建地区级 MIG

控制台

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

    转到“实例组”

  2. 点击创建实例组

  3. 如果要创建有状态 MIG,请选择新的代管式实例组(有状态)选项。为帮助您决定,请参阅何时使用有状态 MIG

  4. 输入 MIG 的名称,然后选择要在其中查找该组的区域。

  5. 组类型下方,选择托管实例组

  6. 实例模板下方,选择一个实例模板。如果没有可用的模板,请创建实例模板

  7. 指定要在组中创建的实例数。

  8. 您还可以选择启用自动扩缩功能,以便该实例组根据其利用率自动添加或移除实例

  9. (可选)启用自动修复功能,以对该组中的虚拟机执行基于应用的运行状况检查。

  10. 点击创建以创建新组。

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-yahstest-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-yahstest-qtyz。如果您需要特定名称,请参阅在 MIG 中创建具有特定名称的实例

各种政策和操作可能会影响组中的实例,具体取决于您对 MIG 进行配置和操作的方式。若要确定哪些代管实例已启动并正在运行,请参阅检查代管实例的状态

更改托管实例组的实例模板

如需了解如何将新的实例模板应用于 MIG,请参阅更新 MIG 中的实例

调整代管实例组的大小

如需在 MIG 中添加实例或从 MIG 中移除虚拟机,您可以执行以下操作:

自动调整 MIG 的大小

您可以将代管实例组配置为根据其工作负载自动添加或移除虚拟机。您的应用将可以顺利应对流量增加的情况,同时您也可以在计算资源需求量降低时缩减费用。如需开始扩缩代管实例组,请参阅自动扩缩实例组

手动设置 MIG 的大小

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

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

您可以使用 Google Cloud Consolegcloud 工具Compute Engine API 调整代管式实例组的大小。

控制台

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

    转到“实例组”

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

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

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

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

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
}

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

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

如果您的系统依赖于特定名称,您可以创建具有这些名称的虚拟机。分配给这些代管实例的名称会在虚拟机重新创建后保留。请参阅添加具有特定名称的实例

删除实例组中的特定实例

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

从代管实例组删除实例不会更改任何指定的自动调节程序设置。如果您从代管实例组中删除实例,则自动调节程序可能会检测到组中其他实例的工作负载增加,并将组大小增加回其先前的级别。为防止出现这种情况,请先关闭删除自动调节程序,然后再尝试删除实例。

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

您可以使用 Google Cloud Consolegcloud 工具Compute Engine API 从代管式实例组中删除实例。

控制台

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

    转到“实例组”

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

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

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

gcloud

使用 delete-instances 命令

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 Consolegcloud 工具Compute Engine API 放弃代管式实例组中的实例。

控制台

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

    转到“实例组”

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

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

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

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

使用 recreate-instances 命令

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 Consolegcloud 工具删除代管式实例组及其实例时,所有附加的自动扩缩器也会自动删除。但是,如果您使用的是 Compute Engine API,则必须先发出单独的请求来通过 autoscalers.deleteregionAutoscalers.delete 删除任何附加的自动扩缩器。

控制台

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

    转到“实例组”

  2. 在列表中选择一个或多个要删除的组。

  3. 点击删除,以删除该实例组以及代管实例组内的所有虚拟机。

gcloud

使用 delete 命令

gcloud compute instance-groups managed delete INSTANCE_GROUP_NAME \
    --zone ZONE

API

可用区区域 MIG 资源调用 delete 方法。

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/INSTANCE_GROUP_NAME

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

创建抢占式实例组

您可以使用代管实例组快速创建多个抢占式实例,这样可以降低代管实例组内虚拟机的费用。例如,您可以创建一组抢占式实例,使用这些实例运行批处理任务,然后在任务完成时删除该组。

要创建一组抢占式实例,请在实例模板中设置抢占式选项,然后使用该模板创建托管实例组。

控制台

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

    转到“实例模板”页面

  2. 点击新建实例模板

  3. 根据需要填写实例模板的属性。

  4. 点击显示高级选项以展开可用性政策部分。

  5. 抢占设置为开启

  6. 点击创建以创建模板。

  7. 使用此模板创建托管实例组

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"
      }
    }
  ]
  }
}

创建实例模板后,使用该模板来创建代管实例组

了解 instanceTemplateversions 字段

创建代管实例组时,您需要提供一个实例模板,以便代管实例组用于创建各个虚拟机实例。默认情况下,Compute Engine 以两个单独的 Compute Engine API 属性(顶级 instanceTemplate 属性和 versions 属性)来描述使用的实例模板。例如,在以下代管实例组中,请注意 instanceTemplateversions 字段已填充:

{

 "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 服务帐号不同。默认情况下,Google API 服务代理会在项目级层授予 Editor 角色 (roles/editor),因此有足够的权限根据组的配置创建资源。如果您要为 Google API 服务代理自定义访问权限,请授予 roles/compute.instanceAdmin.v1 角色和(可选)roles/iam.serviceAccountUser 角色。仅当代管式实例组创建可以服务帐号身份运行的虚拟机时,才需要使用 serviceAccountUser 角色。

请注意,Google API 服务代理也会被其他进程(包括 Deployment Manager)使用。

当您创建代管式实例组或更新实例模板时,Compute Engine 会验证 Google API 服务代理是否具有以下角色/权限:

  • serviceAccountUser 角色。如果您计划创建可以服务帐号身份运行的实例,则该角色很重要。
  • 针对通过实例模板引用的所有资源(例如映像、磁盘、VPC 网络和子网)的权限。

如需详细了解服务帐号,请参阅服务帐号概览

更新代管式实例组中的所有实例

请参阅更新 MIG 中的实例

后续步骤