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

本文档介绍了如何将新的实例模板自动应用于代管式实例组 (MIG) 中的所有虚拟机 (VM) 实例或随机子集。

当您配置自动更新时,MIG 会根据您的规范自动发布新版本的实例模板。您可以控制部署速度、服务中断级别以及 MIG 更新的实例数。开始更新后,您无需提供额外输入,更新便会自行完成。

如果希望选择性地将新模板仅应用于 MIG 中的新实例或特定实例,或者您具有有状态 MIG,并且需要应用有状态个别实例配置,请改为参阅选择性地更新 MIG 中的实例。为帮助您做出决定,请参阅在自动更新和选择性更新之间进行选择

准备工作

限制

  • 如果您的 MIG 采用任何有状态配置,则无法使用自动滚动更新。您可以改为通过更新特定实例来控制更新并限制中断。
  • 如果您使用自定义实例名称,但没有配置有状态磁盘或元数据,则可以使用自动更新。但是,如需保留实例名称,您必须将 replacement 方法设置为 RECREATE

开始基本滚动更新

基本滚动更新是指逐步应用于 MIG 中的所有实例的更新,直到所有实例均已更新为止。您可以控制滚动更新的各个方面,例如可以脱机进行更新的实例数、两次更新实例之间的等待时间、更新是影响所有实例还是仅影响部分实例等等。

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

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

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

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

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

控制台

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

    转到“实例组”

  2. 选择要更新的 MIG。

  3. 点击页面顶部的滚动更新

  4. 模板下,点击下拉列表并选择要据以更新的新模板。

  5. 对于目标大小,输入 100% 以更新所有实例。

  6. 更新模式下,选择主动

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

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 仅在您有足够的配额或资源来支持额外资源时才会发挥作用。

此选项仅在配置了 REPLACE 最少操作时才会发挥作用,但不可与 RESTART 操作设置一起使用。

不可用实例数上限

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

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

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

如果您未设置 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 小时)。

最少操作

如果您想指定自动更新为更新实例组中的实例而必须执行的最少操作,请使用最少操作选项。例如,如果您将 REPLACE 设置为最少操作,则无论是否有必要,系统都将删除所有受影响的实例并将其替换为新实例。

设置最少操作可保证该更新程序至少会执行该操作。但是,如果该更新程序确定您指定的最少操作不足以执行更新,它可能会执行更具中断性的操作。例如,如果将 RESTART 设置为最少操作,则该更新程序会尝试重启实例以应用更新。但是,如果要更改操作系统(无法通过重启实例来完成),则更新程序将用新的虚拟机实例替换实例组中的实例。

可能的操作为 REPLACERESTART

  • RESTART。通过执行 stopstart 请求重启实例。如果您的更新请求要求替换实例以获取更改(例如,更改映像将要求删除并替换实例),则该更新程序会执行 REPLACE

  • REPLACE:删除现有实例并根据目标模板创建实例。该更新程序会使用所有新的实例属性(例如新的内部和外部 IP 地址)创建实例。

下图显示了这些选项会如何影响您的实例。

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

替换方法

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

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

如需保留实例名称,请将替换方法设置为 RECREATE,而不是 SUBSTITUTE

托管实例替换方法。

有效 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 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=emplate=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 模板,并将目标大小设置为 100%。然后,您可以将第二个模板字段完全移除。
  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.isReachedisStable 标志。您可以使用 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 查看代管实例组中每个实例正在执行的 currentAction 以及 status

gcloud

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

该命令会返回 MIG 中的实例列表及其状态和当前操作。例如:

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 列显示为空,除非您已设置运行状况检查

API

区域可用区 MIG 资源调用 listManagedInstances 方法。例如:

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 中的实例,而不是使用自动更新。

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

执行滚动替换或重启

重启操作会对实例执行 stopstart 方法,而替换操作会主动删除并创建实例。

滚动重启或替换不会更改有关实例组的任何内容,包括实例模板。它仅使用您选择的方法刷新实例组中的实例。

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

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

使用 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 等更新选项,则系统会分别针对每个地区舍入余数。

后续步骤