创建托管实例组

托管实例组 (MIG) 包含基于实例模板的相同实例。MIG 通过主动保持实例可用(即处于 RUNNING 状态)来维护应用的高可用性。

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

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

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

准备工作

限制

  • 每个托管实例组最多可包含 1000 个虚拟机实例。
  • 更新托管实例组时,可以通过单个请求指定的实例数上限为 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

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

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

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

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

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

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

gcloud

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

gcloud beta compute instance-groups managed resize instance-group-name --size new-size \
    --nocreation-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

在 MIG 中创建具有特定名称的实例(Beta 版)

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

从组中删除特定实例

您可以删除托管实例组中的单个实例。删除实例会缩减实例组的指定 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/beta/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

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

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

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档