自动向 MIG 中的实例发布更新

本文档介绍了如何自动将配置更新应用于代管式实例组 (MIG) 中的虚拟机 (VM) 实例。

Compute Engine 会根据您在实例模板中指定的配置和可选的有状态配置来维护 MIG 中的虚拟机。有时,您可能希望更新此配置。

设置自动更新时,MIG 会自动将实例模板的新版本发布到实例组的所有虚拟机或部分虚拟机。如果您有有状态配置,则 MIG 还会将所有未应用的实例配置应用于相应的虚拟机。

您可以控制部署速度、服务中断级别,以及使用 Canary 更新时 MIG 通过新模板更新的实例数。指定新配置后,您无需提供额外输入,更新便会自行完成。

或者,如果您希望选择性地将新配置仅应用于 MIG 中的新实例或特定实例,请参阅选择性地更新 MIG 中的实例。为帮助您做出决定,请参阅在自动更新和选择性更新之间进行选择

准备工作

限制

  • 如果您有有状态 MIG 并且想要使用自动滚动更新,则必须在替换实例时保留实例名称,或者将替换方法设置为 RECREATE

开始基本滚动更新

基本滚动更新是逐步应用于 MIG 中的所有实例的更新,直到所有实例均已更新为最新预期配置。滚动更新会自动跳过已采用最新配置的实例。

您可以控制滚动更新的各个方面,例如可以离线进行更新的实例数、两次更新实例之间的等待时间、新模板是影响所有实例还是仅影响部分实例等等。

进行滚动更新时,请注意以下事项:

  • 更新是基于意图的。当您发出初始更新请求时,Compute Engine API 会返回成功的响应,以确认该请求有效,但这并不表示更新成功。您必须检查实例组的状态来确定您的更新是否已成功部署。

  • Instance Group Updater API 属于声明式 API。该 API 需要收到一个指定该 MIG 所需更新后配置的请求,而非显式函数调用。

  • 自动更新最多支持 MIG 中的两个实例模板版本。这意味着您可以为您的组指定两个不同的实例模板版本,这对于执行 Canary 更新非常有用。

如需启动基本滚动更新以将更新应用于组中的所有实例,请按照以下说明操作。

控制台

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

    转到“实例组”

  2. 选择要更新的 MIG。

  3. 在页面顶部,点击更新虚拟机

  4. 全新模板下,点击下拉列表并选择要更新至的全新模板。目标大小会自动设置为 100%,这表示您的所有实例都将更新。

  5. 更新配置下,展开选择菜单,然后选择自动作为更新类型。其他选项保留默认值。

  6. 点击更新以开始更新。

gcloud

使用 rolling-action start-update 命令

gcloud compute instance-groups managed rolling-action start-update INSTANCE_GROUP_NAME \
    --version=template=INSTANCE_TEMPLATE_NAME
    [--zone=ZONE | --region=REGION]

请替换以下内容:

  • INSTANCE_GROUP_NAME:MIG 的名称
  • INSTANCE_TEMPLATE_NAME:新实例模板
  • ZONE:对于可用区 MIG,请提供可用区
  • REGION:对于区域 MIG,请提供区域

API

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

例如,对于区域 MIG,以下请求显示将所有实例自动更新到新实例模板所需的最低配置。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME

{
  "instanceTemplate": "global/instanceTemplates/NEW_TEMPLATE",
  "updatePolicy": {
    "type": "PROACTIVE"
   }
}

发出请求后,可以监控更新来了解更新完成时间。

对于高级配置,请添加其他更新选项。如果不指定,则 maxSurgemaxUnavailable 选项默认为 1 乘以受影响可用区数量之积。这意味着每个受影响的可用区中仅 1 个实例离线,并且更新期间 MIG 在每个可用区仅额外创建 1 个实例。

配置更新选项

对于更复杂的更新,您可以配置其他选项,如以下部分所述。

模式

托管实例组支持两种类型的更新模式:

  • 自动或主动更新
  • 选择性更新或寻机更新

如果您希望自动应用更新,请将模式设置为主动

或者,如果自动更新可能会破坏性很大,您可以选择执行寻机更新。仅当您在选定实例上手动启动更新或创建新实例时,MIG 才会应用机会更新。当您或其他服务(例如自动扩缩器)调整 MIG 的大小时,便可以创建新实例。Compute Engine 不会主动发出对现有实例应用寻机更新的请求。

如需详细了解自动更新与选择性更新,请参阅在自动更新和选择性更新之间进行选择

超额配置数量上限

使用 maxSurge 选项来配置自动更新期间 MIG 在超过 targetSize 后可以创建的新实例数量。例如,如果您将 maxSurge 设置为 5,则 MIG 会使用新的实例模板创建最多 5 个大小超过目标大小的新实例。设置较高的 maxSurge 值可加快更新速度,但代价是会产生额外的实例,而这些实例将根据 Compute Engine 价格表进行计费。

您可以指定固定数量;如果代管实例组中的实例数大于或等于 10 个,则可指定百分比。指定百分比时,该更新程序会根据需要将实例数向上舍入。

如果您未设置 maxSurge 值,系统会采用默认值。对于可用区级 MIG,maxSurge 的默认值为 1。对于区域 MIG,默认值是与代管实例组关联的可用区数,默认值为 3

maxSurge 仅在您有足够的配额或资源来支持额外资源时才会发挥作用。

如果更新不需要替换虚拟机,则系统会忽略此选项。您可以通过设置最少操作选项,在更新期间强制替换虚拟机。

不可用数量上限

使用 maxUnavailable 选项配置在自动更新期间任何时候都无法使用的实例。例如,如果您将 maxUnavailable 设置为 5,那么系统一次只会将 5 个实例离线以进行更新。使用此选项可以控制更新对您的服务造成的干扰程度和更新的部署速度。

此数量也包含所有由于其他原因而无法使用的实例。例如,如果实例组正在调整大小,则正在创建的实例可能无法使用。这些实例会计入 maxUnavailable 数量。

您可以指定固定数量;如果代管实例组中的实例数大于或等于 10 个,则可指定百分比。指定百分比时,该更新程序会根据需要将实例数向下舍入。

如果您不希望在更新期间有任何机器不可用,请将 maxUnavailable 值设置为 0,并将 maxSurge 值设置为大于 0。通过这些设置,Compute Engine 只有在创建并运行新的替换机器后才会移除每个旧机器。

如果您未设置 maxUnavailable 值,系统会采用默认值。对于可用区 MIG,默认值为 1。对于区域 MIG,默认值是与代管实例组关联的可用区数,默认值为 3

最短等待时间

如果您想要指定在等待多长时间后新实例或重启的实例才会被视为已更新,请使用 minReadySec 选项。使用此选项可以控制自动更新的部署速度。在同时满足以下两个条件时,系统会启动计时器:

  • 实例的状态为 RUNNING
  • 已启用运行状况检查,且运行状况检查返回 HEALTHY

请注意,为了让运行状况检查返回 HEALTHY,该更新程序将等待以下情况:

  1. 等待 MIG 的 autohealingPolicies.initialDelaySec 值所指定的时段,让运行状况检查以 HEALTHY 形式返回。
  2. 然后等待 minReadySec 所指定的时长。

如果运行状况检查未在 initialDelaySec 内返回 HEALTHY,则该更新程序将声明虚拟机实例运行状况不佳并可能会停止更新。当虚拟机实例在 initialDelaySecminReadySec 时间段内等待验证时,该实例的 currentAction 将处于 VERIFYING 状态。不过,底层虚拟机实例状态将仍然为 RUNNING

如果未针对实例组进行运行状况检查,则计时器会在实例状态为 RUNNING 时启动。

minReadySec 字段的最大值为 3600 秒(1 小时)。

下图显示了目标大小、不可用数量上限、超额配置数量上限和最短等待时间选项对实例的影响。如需详细了解目标大小,请参阅 Canary 版更新

更新政策选项如何影响您的请求。

最少操作

使用最少操作选项可尽可能减少中断,或应用超出必要中断次数的操作。例如,Compute Engine 不需要重启虚拟机即可更改其元数据。但是,如果您的应用仅在虚拟机重启时读取实例元数据,您可以将最少操作设置为 restart,以选择元数据更改。

如果您的更新所要求的操作比此标志设置的中断次数更多,则 Compute Engine 会执行必要的操作来执行更新。例如,如果将 restart 指定为最少操作,则该更新程序会尝试重启实例以应用更新。但是,如果要更改操作系统(无法通过重启实例来完成),则更新程序将用新的虚拟机实例替换实例组中的实例。

如需了解详情(包括有效选项),请参阅控制滚动更新期间的中断级别

允许的最具中断性的操作

使用允许的最具中断性的操作选项可在中断次数超出承受范围时阻止更新。如果因此设置而无法完成更新,则更新将失败,并且您的虚拟机会保留其先前的配置。

如需了解详情,请参阅控制滚动更新期间的中断级别

替换方法

默认情况下,当您主动更新 MIG 时,该组会删除您的虚拟机实例,并使用具有新名称的新实例来更换您的虚拟机实例。如果您需要保留虚拟机实例的名称,请使用 replacementMethod 选项。

如果您的应用或系统依赖于使用特定的实例名称,则保留现有的实例名称会很有用。例如,某些应用(如 Memcached)依赖于实例名称,因为它们不具有发现服务;因此,只要实例名称发生变化,应用就会断开与该特定虚拟机的连接。

如需保留实例名称,且使用 gcloud 工具或 Compute Engine API 更新 MIG,请将替换方法设置为 RECREATE,而不是 SUBSTITUTE。或者,如果您从 Cloud Console 更新 MIG,请选中替换实例时保留实例名称复选框。

托管实例替换方法。

有效 replacementMethod 值包括:

  • SUBSTITUTE(默认)。系统会在更新虚拟机实例期间以更快的速度替换虚拟机实例,因为新虚拟机会在旧虚拟机关停之前创建。但实例名称不予以保留,因为这些名称仍由旧实例使用。

  • RECREATE。通过更新保留实例名称。当旧虚拟机关停时,Compute Engine 会释放实例名称。Compute Engine 随后会使用相同的名称创建新实例。如需使用此模式,您必须将 maxSurge 设置为 0

如需了解详情,请参阅保留实例名称

其他更新示例

下面介绍一些包含常用配置选项的命令行示例。

执行所有虚拟机实例的滚动更新,但一次最多创建 5 个超过目标大小的新实例

gcloud compute instance-groups managed rolling-action start-update INSTANCE_GROUP_NAME \
    --version=template=NEW_TEMPLATE \
    --max-surge=5 \
    [--zone=ZONE | --region=REGION]

执行滚动更新时最多有 3 台机器不可用,并且至少要等待 3 分钟才能将新实例标记为可用

gcloud beta compute instance-groups managed rolling-action start-update INSTANCE_GROUP_NAME \
    --version=template=NEW_TEMPLATE \
    --min-ready=3m \
    --max-unavailable=3 \
    [--zone=ZONE | --region=REGION]

执行所有虚拟机实例的滚动更新,但一次最多创建 10% 的超过目标大小的新实例

例如,如果您有 1000 个实例,并且运行以下命令,则更新程序会创建多达 100 个实例,然后再开始移除运行先前实例模板的实例。

gcloud compute instance-groups managed rolling-action start-update INSTANCE_GROUP_NAME \
    --version=template=NEW_TEMPLATE \
    --max-surge=10% \
    [--zone=ZONE | --region=REGION]

Canary 更新

Canary 更新是对实例组中的部分实例应用的更新。借助 Canary 更新,您可以随机对部分实例进行新功能或升级的测试,从而避免向所有实例发布可能造成中断的更新。如果更新进展不顺利,您只需回滚这部分实例,即可最大限度地减少用户中断。

Canary 更新与标准滚动更新相同,只不过应更新的实例数小于实例组的总大小。与标准滚动更新一样,您可以配置其他选项来控制服务的中断级别。

启动 Canary 更新

如需启动 Canary 更新,请最多指定两个实例模板版本,通常新实例模板用于 Canary 更新,而当前实例模板则用于其余实例。例如,您可以指定系统根据 NEW_INSTANCE_TEMPLATE 创建 20% 的实例,同时继续在 OLD_INSTANCE_TEMPLATE 上运行其余实例。不能同时指定两个以上的实例模板。

您必须始终为 Canary 版本指定目标大小 (targetSize)。 如果您省略 Canary 版本的目标大小,就无法启动 Canary 更新。例如,如果您指定应将 10% 的实例用于 Canary 更新,则剩余的 90% 将不受影响并使用当前实例模板。

控制台

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

    转到“实例组”

  2. 选择要更新的代管实例组。
  3. 在页面顶部,点击更新虚拟机
  4. 点击添加第二个模板并选择要执行 Canary 的新实例模板。
  5. 目标大小下,输入要用于对新实例模板执行 Canary 的实例百分比或固定数量。
  6. 如有需要,您可以配置其他更新选项
  7. 点击更新以开始更新。

gcloud

使用 rolling-action start-update 命令。 提供当前模板和新模板,以明确表示应该使用每个模板的实例数量:

gcloud compute instance-groups managed rolling-action start-update INSTANCE_GROUP_NAME \
    --version=template=CURRENT_INSTANCE_TEMPLATE_NAME \
    --canary-version=template=NEW_TEMPLATE,target-size=SIZE \
    [--zone=ZONE | --region=REGION]

请替换以下内容:

  • INSTANCE_GROUP_NAME:实例组名称。
  • CURRENT_INSTANCE_TEMPLATE_NAME:实例组目前正在运行的实例模板。
  • NEW_TEMPLATE:您要执行 Canary 更新的新模板。
  • SIZE:要应用此更新的实例的数量或百分比。您必须将 target-size 属性应用于 --canary-version 模板。只有在实例组包含 10 个或更多实例时才能设置百分比。
  • ZONE:对于可用区 MIG,请提供可用区
  • REGION:对于区域 MIG,请提供区域。

例如,以下命令执行 Canary 更新,将 example-template-B 发布到实例组中 10% 的实例:

gcloud compute instance-groups managed rolling-action start-update example-mig \
    --version=template=example-template-A \
    --canary-version=template=example-template-B,target-size=10%

API

区域可用区 MIG 资源调用 patch 方法。在请求正文中,包含当前实例模板和您要执行 Canary 更新的新实例模板。例如:

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME

{
 "versions": [
  {
   "instanceTemplate": "global/instanceTemplates/NEW_TEMPLATE",
   "targetSize": {
    "[percent|fixed]": NUMBER|PERCENTAGE # Use `fixed` for a specific number of instances
   }
  },
  {
   "instanceTemplate": "global/instanceTemplates/CURRENT_INSTANCE_TEMPLATE_NAME"
  }
 ]
}

请替换以下内容:

  • NEW_TEMPLATE:您要执行 Canary 更新的新模板的名称。
  • NUMBER|PERCENTAGE:要执行此 Canary 更新的实例的固定数量或百分比。只有在实例组包含 10 个或更多实例时才能设置百分比。 否则,请提供固定数量。
  • CURRENT_INSTANCE_TEMPLATE_NAME:实例组正在运行的当前实例模板的名称。

如需了解更多选项,请参阅配置更新选项

发出请求后,您可以监控更新以便了解更新完成时间。

前滚 Canary 更新

运行 Canary 更新后,您可以决定是要将更新提交至 100% 的 MIG,还是回滚更新。

控制台

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

    转到“实例组”

  2. 选择要更新的代管实例组。
  3. 在页面顶部,点击更新虚拟机
  4. 全新模板下,将 Canary 模板的目标大小更新为 100%,以将模板前滚到所有实例。或者,您可以将主模板替换为 Canary 模板,并移除第二个模板字段。
  5. 点击更新以开始更新。

gcloud

如果您要提交 Canary 更新,请通过发出另一个更新来回滚更新rolling-action start-update 命令,但仅设置 version 标志并忽略--canary-version 标志。

gcloud compute instance-groups managed rolling-action start-update INSTANCE_GROUP_NAME \
    --version=template=NEW_TEMPLATE \
    [--zone=ZONE | --region=REGION]

API

区域可用区 MIG 资源调用 patch 方法。在请求正文中,将新实例模板指定为 version,并从请求正文中省略旧实例模板。省略目标大小规格可将更新发布到所有实例。例如:

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME

{
"versions": [
   {
   "instanceTemplate": "global/instanceTemplates/NEW_TEMPLATE" # New instance template
   }
 ]
}

监控更新

启动更新后,新配置可能需要一段时间才能完成发布到所有受影响的实例这一过程。您可以通过检查以下各项来监控更新进度:

组状态

在实例组级层,Compute Engine 会填充一个名为 status 的只读字段,该字段包含 versionTarget.isReached 标志isStable 标志。您可以使用 gcloud 工具或 Compute Engine API 访问这些标志。此外,您还可以使用 Cloud Console 查看正在更新的当前和计划实例数量。

控制台

您可以转到组详情页面,以监控实例组的滚动更新。

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

    转到“实例组”

  2. 选择要监控的代管实例组。实例组的概览页面显示每个实例正在使用的模板。
  3. 如需查看详细信息,请点击详情标签页。
  4. 实例模板下方,您可以查看每个实例模板的当前实例和目标实例数,以及更新参数。

gcloud

使用 describe 命令

gcloud compute instance-groups managed describe INSTANCE_GROUP_NAME \
    [--zone=ZONE | --region=REGION]

您还可以使用带 --version-target-reached 标志的 gcloud compute instance-groups managed wait-until 命令,等待该实例组的 status.versionTarget.isReached 设置为 true

gcloud compute instance-groups managed wait-until INSTANCE_GROUP_NAME \
    --version-target-reached \
    [--zone=ZONE | --region=REGION]

API

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

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME/get

验证更新发布是否已完成

通过检查 MIG 的 status.versionTarget.isReached 字段的值来验证更新发布是否已完成:

status.versionTarget.isReached 设置为 true 表示所有虚拟机实例已在使用目标版本创建或正在创建。

status.versionTarget.isReached 设置为 false 表示至少有一个虚拟机尚未使用目标版本。或者,如果是 Canary 版更新,false 表示使用目标版本的虚拟机数与其目标大小不符。

检查代管实例组是否稳定

通过检查实例组的 status.isStable 字段的值来验证代管实例组中的所有实例是否正在运行且状况良好。

status.isStable 设置为 false 表示更改已生效、待处理或者 MIG 本身正被修改。

status.isStable 设置为 true 时,则表示以下含义:

  • MIG 中的任何实例都未在进行任何类型的更改,并且所有实例的 currentAction 均为 NONE
  • MIG 中的实例没有任何待处理的更改。
  • MIG 本身未在修改。

请注意,MIG 的稳定性取决于许多因素,因为 MIG 能够以多种方式修改。例如:

  • 发出发布新实例模板的请求。
  • 发出创建、删除、调整或更新 MIG 中实例的请求。
  • 通过自动扩缩器请求调整 MIG 的大小。
  • 通过自动修复程序资源替换 MIG 中一个或多个运行状况不佳的实例。
  • 重新分配区域 MIG 中的部分实例。

完成所有操作后,该 MIG 的 status.isStable 会立即重新设置为 true

当前对实例的操作

使用 gcloud 命令行工具或 Compute Engine API 查看代管式实例组中的实例的详细信息。详细信息包括实例状态和实例组对其实例执行的当前操作。

gcloud

所有代管式实例

如需查看实例组中所有实例的状态和当前操作,请使用 list-instances 命令

gcloud compute instance-groups managed list-instances INSTANCE_GROUP_NAME \
    [--zone=ZONE | --region=REGION]

该命令会返回组中的实例列表,包括实例状态、当前操作和其他详细信息:

NAME               ZONE           STATUS   HEALTH_STATE  ACTION  INSTANCE_TEMPLATE  VERSION_NAME  LAST_ERROR
vm-instances-9pk4  us-central1-f                          CREATING  my-new-template
vm-instances-h2r1  us-central1-f  STOPPING                DELETING  my-old-template
vm-instances-j1h8  us-central1-f  RUNNING                 NONE      my-old-template
vm-instances-ngod  us-central1-f  RUNNING                 NONE      my-old-template

HEALTH_STATE 列显示为空,除非您已设置运行状况检查

某个特定的代管式实例

如需查看实例组中某个特定实例的状态和当前操作,请使用 describe-instance 命令

gcloud compute instance-groups managed describe-instance INSTANCE_GROUP_NAME \
    --instance INSTANCE_NAME \
    [--zone=ZONE | --region=REGION]

该命令会返回该实例的详细信息,包括实例状态、当前操作,以及保留状态(对于有状态 MIG):

currentAction: NONE
id: '6789072894767812345'
instance: https://www.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/instances/example-mig-hz41
instanceStatus: RUNNING
name: example-mig-hz41
preservedStateFromConfig:
  metadata:
    example-key: example-value
preservedStateFromPolicy:
  disks:
    persistent-disk-0:
      autoDelete: NEVER
      mode: READ_WRITE
      source: https://www.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/disks/example-mig-hz41
version:
  instanceTemplate: https://www.googleapis.com/compute/v1/projects/example-project/global/instanceTemplates/example-template

API

区域可用区 MIG 资源调用 listManagedInstances 方法。例如,如需查看可用区 MIG 资源中的实例的详细信息,可以发出以下请求:

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

调用会返回 MIG 的实例列表,其中包含每个实例的 instanceStatuscurrentAction

{
 "managedInstances": [
  {
   "instance": "https://www.googleapis.com/compute/v1/projects/example-project/zones/us-central1-f/instances/vm-instances-prvp",
   "id": "5317605642920955957",
   "instanceStatus": "RUNNING",
   "instanceTemplate": "https://www.googleapis.com/compute/v1/projects/example-project/global/instanceTemplates/example-template",
   "currentAction": "REFRESHING"
  },
  {
   "instance": "https://www.googleapis.com/compute/v1/projects/example-project/zones/us-central1-f/instances/vm-instances-pz5j",
   "currentAction": "DELETING"
  },
  {
   "instance": "https://www.googleapis.com/compute/v1/projects/example-project/zones/us-central1-f/instances/vm-instances-w2t5",
   "id": "2800161036826218547",
   "instanceStatus": "RUNNING",
   "instanceTemplate": "https://www.googleapis.com/compute/v1/projects/example-project/global/instanceTemplates/example-template",
   "currentAction": "REFRESHING"
  }
 ]
}

如需查看有效的 instanceStatus 字段值的列表,请参阅虚拟机实例生命周期

如果实例正在进行某种更改,代管式实例组会将实例的 currentAction 字段设置为以下操作之一,以帮助您跟踪更改进度。否则,currentAction 字段将设置为 NONE

可能的 currentAction 值如下:

  • ABANDONING:正在将该实例从 MIG 中移除。
  • CREATING:正在创建实例。
  • CREATING_WITHOUT_RETRIES:正在创建该实例,且不会重试;如果第一次尝试并未创建该实例,则 MIG 将不会再次尝试替换该实例。
  • DELETING:正在删除实例。
  • RECREATING:该实例正在被替换。
  • REFRESHING:该实例正从其当前目标池中移除,并正在被读取到当前目标池列表中(此列表与现有目标池可能相同,也可能不同)。
  • RESTARTING:正在使用 stopstart 方法重启该实例。
  • VERIFYING:该实例已创建并且正在接受验证。
  • NONE:没有对实例执行任何操作。

回滚更新

目前没有明确的命令可用于将更新回滚到以前的版本,但是,如果您决定要回滚更新(无论是完全提交的更新还是 Canary 更新),则可以发出新的更新请求并传入要回滚到的目前实例模板。

gcloud

例如,以下 gcloud 工具命令会尽快回滚更新。将 OLD_INSTANCE_TEMPLATE 替换为您要回滚到的实例模板的名称。

gcloud compute instance-groups managed rolling-action start-update INSTANCE_GROUP_NAME \
    --version=template=OLD_INSTANCE_TEMPLATE_NAME \
    --max-unavailable=100% \
    [--zone=ZONE | --region=REGION]

API

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

在请求正文中,将 version 指定为旧实例模板:

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME

{
  "updatePolicy":
  {
    "maxUnavailable":
    {
      "percent": 100
    }
  },
  "versions": [
    {
      "instanceTemplate": "global/instanceTemplates/OLD_INSTANCE_TEMPLATE_NAME" # Old instance template
    }
  ]
}

如果是实例数少于 10 个的区域 MIG,您必须在 maxUnavailable 中使用固定值,并将该值设置为该实例组中的实例数:

更新程序处理回滚请求的方式与常规更新请求相同,因此您可以指定其他更新选项

停止更新

没有明确的方法或命令可用于停止更新。您可以从主动更新变更为寻机更新;如果代管实例组未在使用自动扩缩器等其他服务来调整大小,则变更为寻机更新可有效地停止更新。

如需使用 gcloud 工具将更新从主动改为寻机,请运行以下命令:

gcloud compute instance-groups managed rolling-action stop-proactive-update INSTANCE_GROUP_NAME \
    [--zone=ZONE | --region=REGION]

如果您要在从主动更新转为寻机更新之后彻底停止更新,请按以下步骤操作:

  1. 发出请求以确定已经更新的实例数:

    gcloud compute instance-groups managed list-instances INSTANCE_GROUP_NAME \
       [--zone=ZONE | --region=REGION]

    gcloud 工具会返回一个响应,其中包含实例组中的实例及其当前状态的列表:

    NAME               ZONE           STATUS   HEALTH_STATE  ACTION    INSTANCE_TEMPLATE  VERSION_NAME  LAST_ERROR
    vm-instances-9pk4  us-central1-f  RUNNING  HEALTHY       NONE      example-new-template
    vm-instances-j1h8  us-central1-f  RUNNING  HEALTHY       NONE      example-old-template
    vm-instances-ngod  us-central1-f  STAGING  UNKNOWN       CREATING  example-new-template
    

    在本示例中,有两个实例已更新。

  2. 接下来,发出请求以执行新的更新,但传入已经更新的实例数作为目标大小:

    gcloud compute instance-groups managed rolling-action start-update INSTANCE_GROUP_NAME \
       --version template=OLD_INSTANCE_TEMPLATE_NAME \
       --canary-version template=NEW_INSTANCE_TEMPLATE_NAME,target-size=2 \
       [--zone=ZONE | --region=REGION]

    对于该更新程序,此更新将显示为“完成”,因此不会更新其他实例,从而有效地停止更新。

控制滚动更新速度

默认情况下,当您发出更新请求时,更新程序会尽快执行更新。如果您不确定是要完全应用更新还是尝试性测试更改,可以使用以下方法来控制更新速度。

  1. 启动 Canary 更新而不是完整更新。
  2. 设置较大的 minReadySec 值。设置此值可确保该更新程序在等待此指定秒数后,才会将实例视为已成功更新并继续处理下一个实例。
  3. 启用运行状况检查。这种方式可确保该更新程序等到应用启动并报告运行状况良好信号后,才会将实例视为已成功更新并继续处理下一个实例。
  4. 设置较低的 maxUnavailablemaxSurge 值。这会确保一次只更新最少数量的实例。
  5. 选择性地更新 MIG 中的实例,而不是使用自动更新。

您也可以组合使用这些方法来控制更新速度。

控制滚动更新期间的中断级别

根据更新的具体性质,它可能会造成实例生命周期状态中断。例如,如果要更改某实例的启动磁盘,则必须替换该实例。滚动更新期间,您可以通过设置以下选项来控制中断级别:

  • 最少操作:使用此选项可尽可能减少中断,或应用超出必要中断次数的操作。

    • 如需尽可能避免中断,请将最少操作设置为 REFRESH。如果您的更新需要中断次数更多的操作,Compute Engine 将执行必要的操作来执行更新。
    • 如需应用比严格需要更多的中断操作,请将最少操作设置为 RESTARTREPLACE。例如,Compute Engine 不需要重启虚拟机即可更改其元数据。但是,如果您的应用仅在虚拟机重启时读取实例元数据,您可以将最少操作设置为 RESTART,以选择元数据更改。
  • 允许的最具中断性的操作:使用此选项可在中断次数超出承受范围时阻止更新。如果您的更新需要执行中断程度高于此标志设置的操作,则更新请求将失败。例如,如果您将允许的最具中断性的操作设置为 RESTART,则更新启动磁盘映像的尝试将失败,因为该更新需要替换实例,此操作比重启更具中断性。

这两个选项都接受以下值:

说明可更新哪些实例属性?
REFRESH不停止实例。其他磁盘、实例元数据、标签、标记
RESTART停止实例并重启。其他磁盘、实例元数据、标签、标记、机器类型
REPLACE(默认值。)根据替换方法选项替换实例。存储在实例模板或实例配置中的所有实例属性

对于系统允许的最具中断性的操作,其造成的中断性不能比最低要求的操作更低。

自动发布更新时,系统将应用以下默认值:

  • 默认最少操作为 REPLACE。如果您想防止发生不必要的中断,请将最少操作设置为更少中断。
  • 允许的最具中断性的操作默认为 REPLACE。如果您无法承受此类中断,请将允许的最具中断性操作设置为较少的中断次数。

如需更改默认行为,您可以使用 Compute Engine API 在 MIG 资源中设置 updatePolicy.minimalActionupdatePolicy.mostDisruptiveAllowedAction 字段,例如,通过调用 regionInstanceGroupManagers.patch 方法。 或者,您可以在从 Cloud Console 更新 MIG 时选择特定的允许更新虚拟机的操作。如需查看当前设置,请参阅获取 MIG 的属性

如果需要中断程度超过允许范围的操作,则更新失败。如果发生这种情况,您可以尝试执行中断程度超过允许范围的操作以再次更新,也可以选择性地更新实例。Compute Engine 会执行最充分的验证,以确认实例是否可以使用指定的中断限制进行更新。但是,由于系统中的并发更改,因此在更新开始后,情况可能会发生变化。如果特定实例的操作失败,请列出实例错误以查看错误。

执行滚动替换或重启

滚动重启会停止并重启所有实例,而滚动替换会根据替换方法选项替换实例。滚动重启或替换不会更改有关实例组的任何内容,包括实例模板。

您可能出于各种各样的原因而需要执行滚动重启或滚动替换。例如,出于以下某个原因,您可能希望不时重启或替换虚拟机实例:

  • 清除内存泄漏问题。
  • 重启您的应用,以便它可以从全新机器运行。
  • 将定期替换作为最佳做法来应用以测试您的虚拟机。
  • 更新虚拟机的操作系统映像,或重新运行启动脚本来更新软件。

使用 Cloud Console、gcloud 命令行工具或 Compute Engine API 来执行重启或替换操作。

控制台

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

    转到“实例组”

  2. 选择要更新的代管实例组。
  3. 点击页面顶部的重启/替换虚拟机
  4. 选择您要重启还是替换实例。
  5. 您可以视需要切换超额配置数量上限不可用选项数上限最短等待时间等配置选项。
  6. 点击重启替换按钮以开始更新。

gcloud

使用 restart 命令replace 命令

以下命令会替换 MIG 中的所有实例,一次替换一个实例:

gcloud compute instance-groups managed rolling-action replace INSTANCE_GROUP_NAME

以下命令将重启每个实例,一次重启一个实例:

gcloud compute instance-groups managed rolling-action restart INSTANCE_GROUP_NAME

您可以使用更新所适用的选项(例如 maxSurgemaxUnavailable)进一步自定义其中的每条命令。

API

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

updatePolicy.minimalAction 字段中,请指定 RESTARTREPLACE。在这两种情况下,您都必须提供 versions.instanceTemplateversions.name 属性才能触发操作。

例如,对于可用区 MIG,以下请求会显示自动重启所有实例所需的最少配置。

PATCH https://compute.googleapis.com/compute/v1/projects/example-project/zones/ZONE/instanceGroupManagers/INSTANCE_GROUP_NAME

{
 "updatePolicy": {
  "minimalAction": "RESTART",
  "type": "PROACTIVE"
 },
 "versions": [
  {
   "instanceTemplate": "global/instanceTemplates/CURRENT_INSTANCE_TEMPLATE_NAME",
   "name": "v2"
  }
 ]
}

其他替换/重启示例

以一次两个的方式执行所有虚拟机的滚动重启

以下命令会以一次两个的方式重启实例组中的所有虚拟机。请注意,此命令没有指定新实例模板。

gcloud compute instance-groups managed rolling-action restart INSTANCE_GROUP_NAME \
    --max-unavailable=2 \
    [--zone=ZONE | --region=REGION]

尽快对所有虚拟机执行滚动重启

gcloud compute instance-groups managed rolling-action restart INSTANCE_GROUP_NAME \
    --max-unavailable=100% \
    [--zone=ZONE | --region=REGION]

尽快对所有虚拟机执行滚动替换

gcloud compute instance-groups managed rolling-action replace INSTANCE_GROUP_NAME  \
    --max-unavailable=100% \
    [--zone=ZONE | --region=REGION]

保留实例名称

如果您需要在更新中保留虚拟机实例的名称,请将 replacementMethod 设置为 RECREATE。您还必须将 maxUnavailable 设置为大于 0 并将 maxSurge 设置为 0。重新创建实例(而不是替换实例)会导致更新需要更长时间才能完成,但更新后的实例会保留其名称。

如果您未指定替换方法,则使用 MIG 的当前 updatePolicy.replacementMethod 值。如果未设置,则使用默认值 (substitute),这会将虚拟机实例替换为具有随机生成名称的新实例。

gcloud

发出 rolling-action 命令时,请包含 --replacement-method=recreate 标志。

gcloud compute instance-groups managed rolling-action start-update INSTANCE_GROUP_NAME \
    --replacement-method=recreate \
    --version=template=NEW_TEMPLATE \
    --max-unavailable=5 \
    [--zone=ZONE | --region=REGION]

API

区域可用区 MIG 资源调用 patch 方法。在请求正文中,包含 updatePolicy.replacementMethod 字段:

PATCH /compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME
{
    "updatePolicy": {
        "type": "PROACTIVE",
        "maxUnavailable": { "fixed": 5 },
        "replacementMethod": "RECREATE"
    },
    "versions": [ {
        "instanceTemplate": "global/instanceTemplates/NEW_TEMPLATE"
    } ]
}

发出请求后,可以监控更新来了解更新完成时间。

更新区域代管实例组

区域 MIG 包含分布在一个区域内多个地区的虚拟机实例,这与可用区 MIG 不同,后者仅包含一个可用于中的实例。通过区域 MIG,您可以将实例分布到多个可用区,从而提高应用的可用性,并能应对一个可用区发生故障或整个实例组停止响应等极端情况。

对区域 MIG 执行更新与对可用区 MIG 执行更新的过程相同,但有一些例外,具体如下所述。如果您启动对区域 MIG 的更新,该更新程序将始终在每个可用区按比例均匀更新实例。您无法选择先更新哪些可用区的哪些实例,也无法选择仅更新一个可用区的实例。

更新区域 MIG 与更新可用区 MIG 之间的差异

区域级 MIG 具有以下默认更新值:

  • maxUnavailable=NUMBER_OF_ZONES
  • maxSurge=NUMBER_OF_ZONES

NUMBER_OF_ZONES 是与区域 MIG 关联的可用区数。默认情况下,区域 MIG 的可用区数为 3。但您可以选择其他数量。

如果您在指定更新时使用的是固定数量,则该固定数量必须为 0,或是大于等于区域 MIG 的关联可用区数。例如,如果该组分布于三个可用区,您就不能将 maxSurge 设置为 12,因为该更新程序必须分别在每个可用区中创建一个额外实例。

在更新请求中使用固定数量或百分比

如果您在更新请求中指定一个固定数量,则指定的数量会除以区域 MIG 中的可用区数并均匀分布。例如,如果您指定了 maxSurge=10,那么该更新程序将用 10 除以该区域中的地区数,并根据计算所得的值创建实例。如果实例数不能被地区数整除,则更新程序会随机向某个地区添加剩余的实例。因此,举例来说,如果将 10 个实例分布到 3 个地区,那么其中的两个地区会得到 3 个实例,一个地区会得到 4 个实例。该逻辑同样适用于 Canary 版更新的 maxUnavailabletargetSize 参数。

只有在您的 MIG 包含 10 个或更多虚拟机实例时,您才能指定百分比。百分比的处理方法因情况不同而有所不同:

  • 如果您为 Canary 更新指定虚拟机实例的百分比,则该更新程序会尝试在地区之间均匀分布实例。每个地区的余数会向上或向下舍入,但每个实例组的总差不会超过 1 个虚拟机实例。例如,对于有 10 个实例且目标大小百分比为 25% 的 MIG,系统会将更新发布到 2 到 3 个虚拟机实例。

  • 如果您以百分比形式指定了 maxSurgemaxUnavailable 等更新选项,则系统会分别针对每个地区舍入余数。

后续步骤