创建托管实例组

托管实例组 (MIG) 包含基于实例模板创建的一组相同实例。MIG 会主动让您的实例保持可用(即处于 RUNNING 状态),以维护应用的高可用性。

托管实例组支持自动修复负载平衡自动扩缩自动更新功能。

您可以创建地区级(单地区)MIG 和区域级(多地区)MIG。区域级 MIG 将实例分布在同一区域内的多个地区中,因此可提供较高的可用性。

如需详细了解实例组,请参阅实例组概览

准备工作

限制

  • 每个托管实例组最多可包含 1000 个虚拟机 (VM) 实例。
  • 更新托管实例组时,您可以在单个请求中最多指定 1000 个实例。

将托管实例组用于无状态应用

托管实例组支持无状态应用,此类应用的运行不依赖于底层虚拟机实例的特定状态。 这样可以实现自动扩缩和自动修复等功能,也就是说,可让托管实例组自动删除和重新创建实例。此外,如果由于用户执行的某种操作导致某个实例在自动修复的过程中从托管实例组中删除,或者由于在实例未设置为实时迁移的情况下进行基础架构维护,致使该实例从托管实例组中删除,实例组将自动使用新的根永久性磁盘重新创建该实例。

鉴于托管实例组的无状态特性,您应该对应用进行设计或改进,确保其不依赖于不会持久保留的特定实例属性,例如 IP 地址或内存数据。 同样,启动永久性磁盘的默认行为是在相应的虚拟机实例被删除时随之删除,因此您不应使用启动磁盘来存储托管实例组中的持久性数据。

如需保留您的数据,Google 建议您定期对操作系统映像进行维护以确保其保持最新状态、使用启动脚本,并将数据集中备份到另一个位置(例如 Cloud Storage)。

在实例模板中,您可以指定容器映像自定义映像和相关的启动脚本,以确保重新创建的实例会安装必要的应用并可以访问所需的数据。如需了解有关创建实例模板的更多建议,请参阅确定性实例模板

如需保存与托管实例组关联的磁盘,请停用 disks.autoDelete 选项,以防止永久性磁盘被删除。如果使用该磁盘的实例被删除(例如,自动扩缩程序将实例组缩容,或者您手动删除该实例),那么您可以根据需要手动清理剩余磁盘。

创建托管实例组

在创建托管实例组之前,您必须创建实例模板并指定操作系统映像或容器映像以及该实例组中每个实例的设置。

创建模板后,您可以通过 Google Cloud Consolegcloud compute 工具API 来创建托管实例组。

控制台

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

    转到“实例组”页面

  2. 点击创建实例组
  3. 为该托管实例组输入一个名称,然后选择您希望该实例组所在的地区。
  4. 组类型下方,选择托管实例组
  5. 实例模板下方,选择一个实例模板。如果没有可用的模板,请创建实例模板
  6. 指定要在该实例组中创建的实例数。 您还可以选择启用自动扩缩功能,以便该实例组根据其利用率自动添加或移除实例;或者启用自动修复功能,以便对该实例组中的实例执行基于应用的运行状况检查。
  7. 点击创建以创建新实例组。

gcloud

使用 instance-groups managed create 子命令创建实例组:

gcloud compute instance-groups managed create instance-group-name \
        --base-instance-name base-name \
        --size size \
        --template instance-template \
        --zone zone

替换以下内容:

  • instance-group-name:此实例组的名称。
  • base-name:在此实例组中创建的实例将使用的名称。由于这些实例完全相同,因此系统会为每个实例分配一个随机字符串,作为实例名称的一部分。 基本名称将用作此随机字符串的前缀。例如,如果基本名称是 example,实例名称将类似于 example-yahsexample-qtyz。如果您需要特定名称,请参阅在 MIG 中创建具有特定名称的实例
  • size:此实例组的大小。
  • instance-template:此实例组将使用的实例模板的名称。
  • zone:提供 Compute Engine 服务的一个地区

    例如,以下命令将创建一个名为 example-group 的实例组,其基本实例名称为 test。该实例组包含三个实例:

    gcloud compute instance-groups managed create example-group \
          --base-instance-name test \
          --size 3 \
          --template an-instance-template

API

在 API 中,构建对 instanceGroupManagers.insert 方法或 regionInstanceGroupManagers.insert 方法的 POST 请求。在请求正文中,添加实例组名称、实例组大小、实例组中实例的基本名称以及实例模板的网址。

    POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instanceGroupManagers

    {
      "baseInstanceName": "base-name",
      "versions": [
        {
          "instanceTemplate": "global/instanceTemplates/instance-template"
        }
      ],
      "name": "instance-group-name",
      "targetSize": size
    }
    

替换以下内容:

  • project-id:请求的项目 ID。
  • zone:请求所在的地区。
  • instance-group-name:此实例组的名称。
  • base-name:在此实例组中创建的实例将使用的名称。由于这些实例完全相同,因此系统会为每个实例分配一个随机字符串,作为实例名称的一部分。 基本名称将用作此随机字符串的前缀。例如,如果基本名称是 example,实例名称将类似于 example-yahsexample-qtyz
  • size:此实例组的大小。
  • instance-template:此实例组将使用的实例模板。

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

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

您可以更改托管实例组的实例模板,而不对现有实例应用任何更改。当您请求添加或重新创建实例时,托管实例组会使用新模板,但该模板不会自动更新实例组中的现有实例。因此,您可以精确地控制要更新的实例,不过这样会导致您的实例组中包含不同的实例。

创建新实例模板后,可更改现有实例组的实例模板。

控制台

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

    转到“实例组”页面

  2. 在列表的名称列下方,点击要更改其实例模板的实例组的名称。
  3. 点击修改组以修改此托管实例组。
  4. 实例模板下方,选择要对此实例组使用的新实例模板。
  5. 点击保存以应用新模板。

gcloud

如需使用 set-instance-template 方法更新模板,请将新模板传递给 instance-groups managed set-instance-template 子命令:

gcloud compute instance-groups managed set-instance-template instance-group-name \
        --template instance-template \
        --zone zone

API

使用目标托管实例组的名称构建对 instanceGroupManagers 服务的请求。在请求正文中添加新实例模板的网址,如下所示:

POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instanceGroupManagers/instance-group-name/setInstanceTemplate

    {
     "instanceTemplate": "global/instanceTemplates/instance-template
    }

更改实例模板后,重新创建各个实例,或使用滚动更新功能更新该实例组中的所有实例。

调整托管实例组的大小

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

自动调整托管实例组的大小

您可以将托管实例组配置为自动根据其工作负载添加或移除实例。这样,您的应用就可以顺利应对流量增加的情况,而且您也可以在计算资源需求量降低时节省开销。如需开始扩缩托管实例组,请参阅自动扩缩实例组

手动设置托管实例组的大小

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

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

您可以使用 Google Cloud Consolegcloud compute 工具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

构建对 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

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

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

默认情况下,如果虚拟机实例的初始创建失败,则托管实例组会不断重试以创建每个实例,直到成功创建实例。但是,如果您不希望系统自动重试创建操作,可以在调整实例组大小时提供 --no-creation-retries 标志来停用创建重试模式。在此模式下,托管实例组只会尝试一次创建所有实例。如果在创建过程中出错,托管实例组将不会创建此实例,而是会减小托管实例组的目标大小。

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

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

如需在已停用创建重试模式的情况下调整托管实例组的大小,请使用 gcloud compute 工具API

gcloud

使用带有 --no-creation-retries 标志的 resize 子命令。

gcloud beta compute instance-groups managed resize instance-group-name --size new-size \
        --no-creation-retries \
        --zone zone

API

构建对 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 方法查看正在创建的实例及其所处的模式。对于在已停用创建重试模式的情况下创建的实例,其 currentActionCREATING_WITHOUT_RETRIES

Creating instances with specific names in MIGs

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

删除实例组中的特定实例

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

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

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

您可以使用 Google Cloud Consolegcloud compute 工具API 删除托管实例组中的实例。

控制台

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

    转到“实例组”页面

  2. 在列表的名称列下方,点击要删除其个别实例的实例组的名称。随后打开的页面中会显示实例组属性以及该实例组中所含实例的列表。
  3. 在实例列表中,选择一个或多个要删除的实例。
  4. 点击删除。选定的实例即会被删除。

gcloud

使用 instance-groups managed delete-instances 子命令:

gcloud compute instance-groups managed delete-instances instance-group-name \
        --instances example-i3n2,example-z2x9 \
        --zone zone

API

构建对 instanceGroupManagers.deleteInstances 方法的请求。在请求正文中添加要删除的一个或多个实例的网址。

POST https://www.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 工具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

构建对 instanceGroupManagers.abandonInstances 方法的请求。在请求正文中添加要放弃的一个或多个实例的网址。

POST https://www.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 工具API 重新创建托管实例组中的选定实例。

gcloud

使用 instance-groups managed recreate-instances 子命令。

gcloud compute instance-groups managed recreate-instances instance-group-name \
        --instances example-i3n2,example-z2x9 \
        --zone zone

API

构建对 instanceGroupManagers.recreateInstances 方法的请求。在请求正文中添加要重新创建的一个或多个实例的网址。

POST https://www.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 工具删除托管实例组及其实例时,所有关联的自动扩缩程序也会自动一并删除。但是,如果使用的是 API,则必须先发出单独的请求以通过 autoscalers.deleteregionAutoscalers.delete 删除所有关联的自动扩缩程序。

控制台

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

    转到“实例组”页面

  2. 在列表中选择一个或多个要删除的实例组。
  3. 点击删除以删除相应托管实例组及其所有实例。

gcloud

使用 instance-groups managed delete 子命令。

gcloud compute instance-groups managed delete instance-group-name \
        --zone zone

API

构建对 instanceGroupManagers.delete 方法的请求。

DELETE https://www.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

gcloud compute 中,使用 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 会描述在两个单独的 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 字段,那么它仍然是一个有效的请求。

如需详细了解托管实例组更新程序,请参阅发布 MIG 更新

(高级)使用托管实例组对实例模板进行 Canary 更新

您可以创建一个托管实例组,其中包含两组使用不同实例模板的虚拟机。例如,您可以创建一个包含 20 个虚拟机实例的托管实例组,其中 10 个虚拟机应在特定操作系统映像上运行,而其余的虚拟机则在其他操作系统映像上运行。借助此功能,您可以先比较两个不同的实例模板版本,然后再决定使用其中哪个版本。

在 API 中,向以下网址发出 POST 请求:

POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instanceGroupManagers

您的请求正文应省略顶级 instanceTemplates 字段,但包含设置了两个实例模板的 versions 属性。在每个 versions 对象中,您应指定一个实例模板。对于其中一个(而不是全部两个)versions 对象,您还必须指定 targetSize。例如,以下请求会创建一个实例组,其中 50% 的虚拟机实例使用 example-template 实例模板,而其余的虚拟机实例使用 small-machine-type 模板:

{
      "baseInstanceName": "example-instances",
      "name": "example-group",
      "targetSize": 5,
      "versions":
      [
        {
          "instanceTemplate": "global/instanceTemplates/example-template",
          "targetSize":
          {
            "percent": 50
          }
        },
       {
         "instanceTemplate": "global/instanceTemplates/small-machine-type"
       }
      ]
    }

托管实例组和 IAM

由 Compute Engine 执行的关于托管实例组的所有操作都是使用您项目的 Google API 服务帐号完成的。 每个项目的服务帐号电子邮件地址如下所示,其中 project-id 是相应项目的数字 ID:

project-id@cloudservices.gserviceaccount.com

Google API 服务帐号与默认的 Compute Engine 服务帐号不同。

因此,您应确保托管实例组使用的服务帐号具有足够的权限,可根据实例模板创建虚拟机实例。具体来说,这意味着服务帐号需要被授予 compute.instanceAdmin.v1serviceAccountUser 角色(可选),这样才能创建和管理实例组中的实例。仅当托管实例组将创建可以服务帐号身份运行的实例时,才需要使用 serviceAccountUser 角色。请注意,此帐号也会被其他进程(包括 Deployment Manager)使用。

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

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

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

更新托管实例组中的所有实例

请参阅发布 MIG 更新

问题排查

我的托管实例组始终无法创建实例。这是怎么回事?

有多种问题会使得实例组无法成功创建或重新创建实例。以下是一些常见的问题:

  • 托管实例组正在尝试创建或重新创建实例和启动永久性磁盘,但永久性磁盘当前已存在。默认情况下,当您创建新实例时,系统会同时创建新的启动永久性磁盘。这些磁盘以实例命名。如果实例的名称为 my-awesome-instance,则磁盘的名称也将为 my-awesome-instance。如果已存在同名的永久性磁盘,则请求将失败。 如需解决此问题,请删除现有的永久性磁盘。

  • 您的实例模板已针对启动永久性磁盘将 disks.autoDelete 选项设置为 false,这样在删除实例时(例如因自动修复而删除),永久性磁盘不会随之删除。 当托管实例组尝试重新创建同名的实例时,也会遇到已存在同名永久性磁盘的问题。请删除现有的永久性磁盘以解决这个当前问题。如果您希望在删除实例的同时删除启动永久性磁盘,请更新实例模板以将 disks.autoDelete 设置为 true

  • 您的实例模板可能无效。如果您最近更新了实例模板,则可能存在无效属性,从而导致托管实例组无法创建实例。以下是一些可能造成属性无效的原因:

    • 您指定了不存在的资源,例如来源映像。
    • 您拼错了资源名称。
    • 您尝试挂接读写模式的其他非启动永久性磁盘。由于实例组包含多个实例,因此您要在组中的所有实例之间共享的任何其他磁盘只能以只读模式挂接。

后续步骤