更新托管实例组

本页面介绍如何更新您的托管实例组。要了解托管实例组,请阅读实例组文档。

托管实例组包含使用实例模板来控制的一个或多个虚拟机实例。要更新托管实例组中的实例,您可以使用托管实例组更新程序功能对整个组发出更新请求。

通过托管实例组更新程序,您可以轻松地将新版本的软件部署到您的托管实例组中的实例,同时控制部署速度、服务中断级别以及更新范围。该更新程序有两个主要优势:

  • 根据您的指定自动发布更新,在初始请求后用户无需额外输入。
  • 您可以执行部分发布,以进行 Canary 测试。

通过允许在现有托管实例组内部署新软件,您无需在每次发布新版本的软件时,都重新配置实例组或重新连接负载平衡、自动调节或自动修复。如果没有该更新程序,则必须通过创建具有新软件版本的新托管实例组来部署新软件版本(每次都需要进行额外设置),或者通过用户手动启动操作,逐个重新创建实例。在整个过程中,这两种方法都需要大量手动步骤。

准备工作

开始基本滚动更新

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

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

  • 更新基于您的意图。 当您发出初始更新请求时,API 会返回一条成功响应消息,以确认请求有效,但这并不表示更新成功!您将需要检查托管实例组的状态,以确定您的更新是否已成功部署。

  • 实例组更新程序 API 属于声明性 API。API 期望要求指定托管实例组所需的更新后配置的请求,而不是显式函数调用。

  • 该更新程序功能最多支持托管实例组中的两个实例模板版本。这意味着您可以为托管实例组指定两个不同的实例模板版本,这对执行 Canary 更新非常有用。

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

Console

  1. 转到 GCP Console 中的“实例组”页面。

    转到“实例组”页面

  2. 选择您要更新的实例组。
  3. 点击页面顶部的滚动更新
  4. 模板下,将下拉菜单往下拉并选择据以更新的新模板。
  5. 对于目标大小,输入 100% 以更新所有实例。
  6. 您可以选择切换配置选项,例如更新是主动(组主动替换实例)还是随机(组不会主动替换实例,而是在以其他方式替换实例时应用更新)。您还可以提供超额配置数量上限不可用选项数上限最短等待时间
  7. 点击更新以开始更新。

gcloud

使用 gcloud 工具运行 rolling-action start-update 命令:

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

其中:

  • [INSTANCE_GROUP] 是要更新的实例组的名称。
  • [INSTANCE_TEMPLATE] 是要据以更新实例组的新实例模板。
  • 对于此实例组,可以是 [ZONE][REGION]。如果实例组是地区实例组,请提供地区。如果是区域实例组,请提供区域。

API

在 API 中,对以下网址发出 PATCH 请求:

https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/zones/[ZONE]/instanceGroupManagers/[MANAGED_INSTANCE_GROUP_NAME]

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

该请求负载包含:

以下是在 API 中启动更新所需的最低配置。如果您未另行指定,则 maxSurgemaxUnavailable 属性将设置为 1,这意味着在更新期间,该更新程序在任何给定时间只能使 1 个实例不可用,而且在超过实例组的目标大小后仅创建 1 个额外实例。该请求将根据新的实例模板更新所有实例。

例如:

{
  "instanceTemplate": "global/instanceTemplates/example-template",
  "updatePolicy": {
    "type": "proactive"
   }
 }

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

为您的更新配置选项

对于较为复杂的更新,您可以针对特定的更新请求配置额外的选项。这些选项如下所述。

超额配置数量上限

设置 maxSurge 属性以允许该更新程序在更新期间临时创建大于 targetSize 的新实例。例如,如果将 maxSurge 设置为 5,则在超过目标大小后,托管实例组将使用新的实例模板最多创建 5 个新实例。设置较高的 maxSurge 值会加快您的更新速度,但代价是实例数增加,实例根据 Compute Engine 价格表计费。如果您未设置 maxSurge 值,则使用 1 作为超额配置实例数上限默认值。

此选项仅在使用 REPLACE 最少操作配置时才可识别,但不受 RESTART 操作设置支持。您可以指定固定数量,或者如果托管实例组具有 10 个或更多的实例,则指定百分比。如果设置百分比,则该更新程序将根据需要对实例数进行向上舍入。

maxSurge 仅在您具有足够的配额或资源来支持额外资源时才有效。

不可用实例数上限

设置 maxUnavailable 配置,以便在更新期间的任何时候仅特定数量的实例不可用。例如,如果将 maxUnavailable 设置为 5,则一次只能使 5 个实例离线以进行更新。使用此参数可以控制更新会对您的服务造成怎样的中断以及控制部署更新的速度。

此数量也包含由于其他原因而不可用的任何实例。例如,如果实例组正在调大,则正在创建的实例可能不可用;这些实例会计入 maxUnavailable 数。您可以指定固定数量,或者如果托管实例组具有 10 个或更多的实例,则指定百分比。如果设置百分比,则该更新程序将根据需要对实例数进行向下舍入。

区域托管实例组中 maxUnavailable 的默认值为 1。在区域托管实例组中,默认设置为 [NUMBER_OF_ZONES],其中,[NUMBER_OF_ZONES] 是为区域托管实例组选择的地区数,默认值为 3

最短等待时间

设置 minReadySeconds 以指定等待时间,只有在经过这段时间后,才会将新创建或重启的实例视为已更新。使用此功能可以控制部署更新的速度。在以下两个条件得到满足时,计时器会启动:

  • 实例的状态为 RUNNING
  • 如果启用了运行状况检查,则在运行状况检查返回 HEALTHY 时。

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

  1. 在由 autohealingPolicies.initialDelaySec 指定的时间段内等待,以便运行状况检查返回 HEALTHY
  2. 然后等待由 minReadySeconds 指定的时间段。

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

如果未针对实例组进行运行状况检查,则计时器会在实例状态为 RUNNING 时启动。minReadySeconds 属性的最大值为 3600 秒(1 小时)。

最少操作

设置最少操作属性,以控制该更新程序必须执行以更新组实例的最少操作。例如,如果您将 REPLACE 设置为最少操作,则将删除所有受影响的实例,并将其替换为新实例,无论是否有必要。

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

适用的操作为 REPLACERESTART

  • RESTART:重启实例(执行 stopstart 请求)。请注意,如果您的更新请求要求替换实例以获取更改(例如,更改映像将要求删除并替换实例),则系统将强制该更新程序执行 REPLACE

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

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

此图表介绍不同更新选项如何影响您的请求

额外的更新示例

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

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

gcloud beta 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]]

例如,如果您具有 1000 个实例并且运行了此命令,则该更新程序将先创建多达 100 个新实例,然后再开始移除那些运行前一个实例模板的实例。

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

gcloud beta 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 更新,请执行以下操作:

  • 您最多可以指定两个实例模板版本,通常将一个新的实例模板指定给 Canary,而将当前实例模板指定给其余实例。例如,您可以指定根据 new-instance-template 创建 20% 的实例,而其余实例继续在 old-instance-template 上运行。您不能一次指定两个以上的实例模板。

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

Console

  1. 转到 GCP Console 中的“实例组”页面。

    转到“实例组”页面

  2. 选择您要更新的实例组。
  3. 点击页面顶部的滚动更新
  4. 点击添加模板并选择要执行 Canary 的新实例模板。
  5. 目标大小下,输入要用于对新实例模板执行 Canary 的实例百分比或固定数量。
  6. 您可以选择切换配置选项,例如更新是主动(组主动删除并替换实例)还是随机(以其他方式创建实例时,组不会主动替换实例,而是应用更新)。您还可以提供超额配置数量上限不可用选项数上限最短等待时间
  7. 点击更新以开始更新。

gcloud

使用 gcloud 命令行工具,提供当前模板和新模板,以明确表示有多少个实例应该使用每个模板:

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

其中:

  • [CURRENT_TEMPLATE] 是实例组正在运行的当前模板的名称。
  • [NEW_TEMPLATE] 是您要执行 Canary 操作的新模板。
  • [SIZE] 是您要应用此更新的实例数或百分比。您必须将 target-size 属性应用于 --canary-version 模板。如果实例组包含 10 个或更多实例,则只能设置百分比。
  • 对于此实例组,可以是 [ZONE][REGION]。如果实例组是地区实例组,请提供地区。如果是区域实例组,请提供区域。

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

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

API

在 API 中,向以下 URI 发出 PATCH 请求:

https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/zones/[ZONE]/instanceGroupManagers/[INSTANCE_GROUP_NAME]

请求负载应包含当前实例模板和您要执行 Canary 的新实例模板。例如:

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

其中:

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

前滚 Canary 更新

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

Console

  1. 转到 GCP Console 中的“实例组”页面。

    转到“实例组”页面

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

gcloud

如果您要提交 Canary 更新,请发出相同的更新请求但仅设置 version 并省略 --canary-version 以前滚更新。使用 gcloud 命令行工具:

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

API

在 API 中,向以下 URI 发出 PATCH 请求:

https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/zones/[ZONE]/instanceGroupManagers/[INSTANCE_GROUP_NAME]

在请求正文中,将新实例模板指定为 version 并省略请求正文中的旧实例模板。省略目标大小指定以将更新发布到 100% 的实例。例如,您的请求正文可能如下所示:

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

[NEW_TEMPLATE] 替换为您要前滚的新实例模板的名称。

启动随机更新或主动更新

默认情况下,使用 gcloud 命令行工具的更新是主动更新,API 中发起的更新是随机更新。

对于主动更新,Compute Engine 会主动计划操作以根据需要将请求的更新应用于实例。在许多情况下,这通常意味着主动删除并重新创建实例。

此外,如果主动更新可能更具中断性,您可以选择执行随机更新。只有在托管实例组创建新实例时才会应用随机更新。如果托管实例组由其他服务(例如自动调节程序)调整大小或由用户手动调整大小,通常就会发生这种情况。Compute Engine 不会主动发起应用更新的请求。

在某些情况下,随机更新非常有用,因为如果能避免,您肯定不希望导致系统不稳定。例如,如果您具有在必要但不紧迫时应用的非关键更新,并且您具有主动进行自动调节的托管实例组,请执行随机更新,以免 Compute Engine 主动破坏现有实例来应用更新。

要选择更新是随机还是主动,请使用 gcloud 命令行工具或 API 将属性设置为 OPPORTUNISTICPROACTIVE

Console

  1. 转到 GCP Console 中的“实例组”页面。

    转到“实例组”页面

  2. 选择您要更新的实例组。
  3. 点击页面顶部的滚动更新
  4. 模板下,选择要据以更新您的实例组的模板,并为该模板选择目标大小。
  5. 更新模式下,选择随机更新或主动更新。
  6. 点击更新以开始更新。

gcloud

使用 gcloud 命令行工具:

gcloud beta compute instance-groups managed rolling-action start-update [INSTANCE_GROUP_NAME] \
    --version template=[INSTANCE_TEMPLATE] \
    --type [opportunistic|proactive] [--zone [ZONE] | --region [REGION]]

API

在要启动更新的请求负载中,请将 type 属性添加到 updatePolicy 中:

{
"updatePolicy": {
  "type": "PROACTIVE" # Performs a proactive update
},
"versions": [{
  "instanceTemplate": "global/instanceTemplates/[NEW_TEMPLATE]",
  }]
}

其中,[NEW_TEMPLATE] 是您要执行 Canary 的新模板的名称。如果您要进行随机更新,请将 PROACTIVE 替换为 OPPORTUNISTIC

执行滚动替换或重启

此外,您可以使用 restartreplace 命令,对托管实例组中的虚拟机实例执行滚动重启或滚动替换。与 start-update 命令相似,您可以为重启或替换指定任何配置选项。滚动重启或替换不会更改有关实例组的任何内容,包括实例模板。它只是使用您选择的方法来刷新组中的实例。

需要执行滚动替换或滚动重启的原因可能有许多。例如,您可能想要不时地刷新虚拟机实例以实现以下目标:

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

要执行替换以删除所有实例并将其替换为新实例,请执行以下操作:

Console

  1. 转到 GCP Console 中的“实例组”页面。

    转到“实例组”页面

  2. 选择您要更新的实例组。
  3. 点击页面顶部的滚动重启/替换
  4. 选择您要重启还是替换实例。重启操作会针对实例执行 stopstart 方法,而替换操作会主动删除并创建实例。
  5. 您可以选择切换超额配置数量上限不可用选项数上限最短等待时间等配置选项。
  6. 点击重启替换按钮以开始更新。

gcloud

gcloud beta compute instance-groups managed rolling-action replace [INSTANCE_GROUP]

此命令会替换托管实例组中的所有实例,一次替换一个。如果完全替换更具中断性,您可以改为指定滚动重启,这样就不会删除任何实例,而只是重启每个实例。

gcloud beta compute instance-groups managed rolling-action restart [INSTANCE_GROUP]

您可以使用更新所用的选项(例如:maxSurgemaxUnavailablemin-ready)进一步自定义其中的每个命令。

API

在 API 中,向组发出 PATCH 请求并设置主动 updatePolicy,其中 minimalActionRESTARTREPLACE,具体取决于您是要执行滚动替换以删除每个实例并将其替换为新实例,还是要执行滚动重启以停止并重启每个实例。在 RESTARTREPLACE 这两种情况下,您都必须始终提供 versions.instanceTemplateversions.name 属性(例如 v2)以触发操作。

滚动替换看起来可能如下所示:

PATCH https://www.googleapis.com/compute/beta/projects/myproject/zones/[ZONE]/instanceGroupManagers/[INSTANCE_GROUP_NAME]

{
 "updatePolicy": {
  "minimalAction": "REPLACE",
  "type": "PROACTIVE"
 },
 "versions": [
  {
   "instanceTemplate": "global/instanceTemplates/example-template",
   "name": "v2"
  }
 ]
}

对于滚动重启:

PATCH https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/zones/[ZONE]/instanceGroupManagers/[INSTANCE_GROUP_NAME]

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

额外替换/重启示例

对所有虚拟机执行滚动重启(一次两个)

此命令重启实例组中的所有虚拟机(一次两个)。请注意没有指定新的实例模板。

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

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

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

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

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

更新区域托管实例组

区域托管实例组包含分布在一个区域内多个地区中的虚拟机实例,与之相对的是地区托管实例组,其中仅包含一个地区中的实例。区域托管实例组让您能够跨多个地区分布实例,以提高应用的可用性,并在一个地区发生故障或整个实例组停止响应等极端情况下提供支持。

使用实例组更新程序功能来更新区域托管实例组,与对地区托管实例组执行更新一样,但存在一些例外情况,如下所述。当您启动对区域实例组的更新时,该更新程序将始终按比例均匀地更新每个地区的实例;它无法选择是先更新一些地区中的实例,还是仅更新一个地区中的实例。

更新区域托管实例组与更新地区托管实例组之间的差异

在启动对区域托管实例组的更新之前,您应该知道区域托管实例组和地区托管实例组在一些事项上具有不同的行为:

  • 区域托管实例组的默认更新参数为 maxUnavailable=[NUMBER_OF_ZONES]maxSurge=[NUMBER_OF_ZONES],其中,[NUMBER_OF_ZONES] 是为区域托管实例组选择的地区数,默认值为 3

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

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

如果您在更新请求中指定固定数量,则将指定的数量除以区域托管实例组中的地区数,并均匀分布。例如,如果您指定 maxSurge=10,则该更新程序会将 10 除以区域中的地区数,并根据商创建新实例。如果实例数不能被地区数整除,则该更新程序会将额外的实例添加到一个随机地区。因此,将 10 个实例分布到 3 个地区时,其中两个地区将得到 3 个实例,剩下的地区将得到 4 个实例。Canary 更新的 maxUnavailabletargetSize 参数也适用相同的逻辑。

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

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

  • 如果您为 maxSurgemaxUnavailable 等更新选项指定百分比,则该百分比将按地区单独舍入。应用于更新地区托管实例组的相同规则在这里也适用。

监控滚动更新

启动滚动更新后,需要一段时间才能完成更新。您可以通过获取属于托管实例组的实例列表来监控更新状态。Compute Engine API 将返回实例状态以及实例列表。

Console

您可以通过转到特定实例组的详细信息页面来监控组的滚动更新。

  1. 转到 GCP Console 中的“实例组”页面。

    转到“实例组”页面

  2. 选择您要更新的实例组。实例组的概览页面显示每个实例正在使用的模板。
  3. 点击详细信息标签以查看详细信息。

详细信息页面显示要为每个实例模板更新的当前和目标实例数,同时还显示更新参数。

gcloud

gcloud beta compute instance-groups managed list-instances [INSTANCE_GROUP_NAME] [--filter="zone:([ZONE])" | --filter="region:([REGION])"]

gcloud 返回一个响应,列出实例组中的实例及其各自的状态。例如:

NAME               ZONE           STATUS   ACTION    INSTANCE_TEMPLATE  LAST_ERROR
vm-instances-9pk4  us-central1-f           CREATING  my-new-template
vm-instances-h2r1  us-central1-f           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

API

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

POST https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/zones/[ZONE]/instanceGroupManagers/[INSTANCE_GROUP_NAME]/listManagedInstances

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

API 返回组的实例列表及实例各自的状态和当前操作。

{
 "managedInstances": [
  {
   "instance": "https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/zones/[ZONE]/instances/vm-instances-j701",
   "id": "4251656203855893170",
   "instanceStatus": "RUNNING",
   "instanceTemplate": "https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/global/instanceTemplates/[INSTANCE_TEMPLATE_NAME]",
   "currentAction": "REFRESHING"
  },
  {
   "instance": "https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/zones/[ZONE]/instances/vm-instances-prvp",
   "id": "5317605642920955957",
   "instanceStatus": "RUNNING",
   "instanceTemplate": "https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/global/instanceTemplates/[INSTANCE_TEMPLATE_NAME]",
   "currentAction": "REFRESHING"
  },
  {
   "instance": "https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/zones/[ZONE]/instances/vm-instances-pz5j",
   "currentAction": "DELETING"
  },
  {
   "instance": "https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/zones/[ZONE]/instances/vm-instances-w2t5",
   "id": "2800161036826218547",
   "instanceStatus": "RUNNING",
   "instanceTemplate": "https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/global/instanceTemplates/[INSTANCE_TEMPLATE_NAME]",
   "currentAction": "REFRESHING"
  }
 ]
}

组状态及待处理操作和当前操作

对于托管实例组中的每个实例,实例的当前状态在该实例的 instanceStatus 字段中描述。如果实例正在进行某类更改,则 currentAction 字段将进行填充以帮助您跟踪更新的状态。在实例成功更新之后,instanceStatus 字段将反映实例的当前状态。要查看有效的 instanceStatus 字段的列表,请参阅文档了解如何检查实例状态

如果实例正在进行某类更改,则 currentAction 字段将填充以下状态之一。否则,currentAction 字段将为 NONE

currentAction 的可能值:

  • ABANDONING:正在将实例从托管实例组中移除。
  • CREATING:正在创建实例。
  • CREATING_WITHOUT_RETRIES:正在创建实例且不重试;如果第一次尝试创建实例失败,则托管实例组将不会再次尝试替换该实例。
  • DELETING:正在删除实例。
  • RECREATING:已删除实例并且将替换实例。
  • REFRESHING:正在将实例从其当前目标池中移除,并且会将实例重新添加到当前目标池列表中(此列表与现有目标池可能相同,也可能不同)。
  • RESTARTING:正在使用 stopstart 方法来重启实例。
  • VERIFYING:已创建实例并且正在验证实例。

在托管实例组级别,Compute Engine 会填充名为 pendingActions 的字段,该字段描述当前等待特定操作的实例数。例如,pendingActions 字段可能返回如下所示的 pendingActions 计数:

CREATING: 3
DELETING: 3
RECREATING: 2
RESTARTING: 1

这表示有三个实例处于待删除状态、有两个实例将予以替换、有一个实例将重启,以及有三个实例将予以创建。

回滚更新

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

例如,以下命令会尽快回滚更新:

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

[OLD_INSTANCE_TEMPLATE] 替换为您要据以回滚的旧实例模板的名称。

在 API 中,向以下 URI 发出 PATCH 请求:

https://www.googleapis.com/compute/beta/projects/[PROJECT_ID]/zones/[ZONE]/instanceGroupManagers/[INSTANCE_GROUP_NAME]

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

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

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

实例组更新程序服务将此视为常规更新请求,因此本文档中描述的所有更新选项都可以与您的请求一起指定。

控制更新速度

默认情况下,当您发出更新请求时,服务会尽快执行更新。如果您不确定是要完全应用更新,还是暂时测试更改,则可以使用以下方法慢慢应用更新:

  1. 启动 Canary 更新而不是完整更新。
  2. 设置较大的 minReadySeconds 值。设置此值会让该服务在等待此指定秒数后,才将实例视为更新成功并继续更新下一个实例。
  3. 设置较低的 maxUnavailablemaxSurge 值。这会确保一次只更新最少数量的实例。

您还可以将这些参数组合使用以控制更新速度。

停止更新

没有明确的方法或命令可用于停止更新。您可以将更新从主动改为随机,而且如果没有自动调节程序等其他服务正在调整托管实例组的大小,则更改为随机后,将实际“停止”更新。

要将更新从主动改为随机,请运行以下命令:

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

如果您决定要在将更新从主动转为随机之后彻底停止更新,您可以按照以下步骤停止更新:

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

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

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

    NAME               ZONE           STATUS   ACTION    INSTANCE_TEMPLATE  LAST_ERROR
    vm-instances-9pk4  us-central1-f  RUNNING  NONE      my-new-template
    vm-instances-j1h8  us-central1-f  RUNNING  NONE      my-new-template
    vm-instances-ngod  us-central1-f  RUNNING  NONE      my-old-template
    

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

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

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

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

托管实例组的 versions 和 instanceTemplate 属性之间的关系

versions 字段和顶级 instanceTemplate 字段功能重叠,因为这两个字段都可让您指定托管实例组将用于创建新实例的实例模板。顶级 instanceTemplate 字段和 versions 字段之间的不同之处在于新的 versions 字段可让用户指定高级的双模板 (Canary) 配置。

为了向后兼容,托管实例组将继续支持设置顶级 instanceTemplate 字段,不过我们建议您切换到仅使用 versions 字段,因为从功能上讲,它是顶级 instanceTemplate 字段的超集。同时使用两个字段可能导致歧义和混淆。

如果您在调用 update()patch() 方法时,同时指定 instanceTemplate 字段和 versions 字段,就可能出现以下三种可能情况:

  • 您将两个字段设置为相同值。

    这是有效的请求。在这种情况下,它不会产生歧义,新的实例模板将应用于托管实例组。

    例如,在以下请求中,顶级 instanceTemplateversions 字段指定同一实例模板,此模板与现有的当前模板不同。托管实例组将根据新的实例模板进行更新:

    {
     "instanceTemplate": "global/instanceTemplates/new-template",
     "versions": [
      {
       "instanceTemplate": "global/instanceTemplates/new-template"
      }
     ],
     "updatePolicy": {
       "type": "PROACTIVE"
     }
    }
    
  • 您设置了两个不匹配的字段,但只有一个值与托管实例组中的当前实例模板不同。

    这是有效请求。不同于当前设置的字段将当作目标值。例如,您调用 get() 方法,更改两个字段中的一个,然后只使用已更改的字段来调用 update()

    {
     "instanceTemplate": "global/instanceTemplates/current-template",
     "versions": [
      {
       "instanceTemplate": "global/instanceTemplates/new-template"
      }
     ],
     "updatePolicy": {
       "type": "PROACTIVE"
     }
    }
    
  • 您设置了两个字段,但它们不匹配、具有不同的值以及两个值都与托管实例组中的当前实例模板不同。

    此设置无效并且将返回错误,因为意图不明确。

    {
     "instanceTemplate": "global/instanceTemplates/new-template",
     "versions": [
      {
       "instanceTemplate": "global/instanceTemplates/a-different-new-template"
      }
     ],
     "updatePolicy": {
       "type": "PROACTIVE"
     }
    }
    

versions 字段、instanceTemplate 字段和 get() 方法

如果您通过顶级 instanceTemplate 字段和/或 versions 字段,仅指定一个实例模板,则 get() 方法会在其响应中返回两个字段。这可使新的 versions 字段向后兼容。只要您在其中任一字段中指定一个实例模板,就不会对 get()instanceTemplate 字段中返回的内容做出任何更改。

如果 versions 字段指定了两个实例模板,则 get() 方法将返回空的顶级 instanceTemplate 字段。在顶级 instanceTemplate 字段中,无法明确表示一个 Canary、两个实例模板配置,所以在 Canary 更新期间不使用该字段。

versions 字段和 setInstanceTemplate() 方法

为了向后兼容,setInstanceTemplate() 方法的行为和以前一样,可让您更改托管实例组用于创建新实例的模板。当您调用此方法时,系统将使用 setInstanceTemplate() 方法指定的实例模板替换 versions 字段。

此外,该方法会将 updatePolicy 设置为 OPPORTUNISTIC。这会阻止托管实例组主动部署未在 versions 字段中明确指定的实例模板。

反馈和问题

我们欢迎您提出反馈和问题!请将问题发送至 cloud-updater-feedback@google.com

后续步骤

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

发送以下问题的反馈:

此网页
Compute Engine 文档