更新 MIG 中的实例

本文档可帮助您决定如何将更新后的实例模板和实例配置应用于代管式实例组 (MIG) 中的虚拟机 (VM) 实例。

出于以下原因,您可能需要应用新的实例模板

  • 在每个实例上更新应用或操作系统。
  • 执行 A/B 测试,以比较相同应用的不同版本。
  • 在测试新版本时执行 Canary 更新以最大限度地减少中断。
  • 更改 MIG 中实例的其他规范,例如机器类型或磁盘选项。

如果您使用有状态 MIG,可能还需要应用更新后的单个实例配置。

更新 MIG 的配置后,您可以使用以下方法之一将更新应用于实例组中的每个虚拟机:

  • 自动滚动更新。MIG 会自动将实例模板的新版本发布到 MIG 中的所有或随机的一部分代管式实例。MIG 还会将任何未应用的有状态单个实例配置应用于相应的实例。正在运行的实例的中断级别取决于您配置的更新政策。

  • 选择性更新特定实例。您可以选择特定实例进行更新。如果您希望手动编排更新,请使用此方法。

如果您只需要调整 MIG 的大小,请参阅文档了解如何添加移除 MIG 中的实例。

限制

  • 如果您有一个有状态 MIG 并且想要使用自动滚动更新,则必须将替换方法设置为 RECREATE

在自动更新和选择性更新之间进行选择

如需自动将新配置发布到 MIG 中的所有实例或部分实例,请将 MIG 的更新类型设置为 PROACTIVE。如果自动更新可能会造成过大的中断影响,或者您希望更好地控制更新,请将 MIG 的更新类型设置为 OPPORTUNISTIC,然后选择性地更新特定实例。

自动主动更新

将 MIG 的更新类型设置为 PROACTIVE 有两个主要优势:

  • 自动根据您的要求发布更新,用户在发出初始请求后无需再进行额外输入。您可以指定部署速度、服务中断级别和更新范围。
  • 您可以执行部分发布来进行 Canary 测试。

启动主动滚动更新后,MIG 会主动调度操作以根据需要将请求的更新应用于实例。在许多情况下,这意味着主动删除并重新创建实例。

如需了解详情,请参阅自动向 MIG 中的实例发布更新

选择性更新

选择性更新特定实例具有以下优势:

  • 您可以选择要更新的实例。
  • 您可以控制更新的时间和顺序。
  • 您可以使用 API 立即执行所有实例的更新。

为了防止主动更新与选择性更新竞争,请将 MIG 的更新类型设置为 OPPORTUNISTIC

寻机更新

当更新类型设置为 OPPORTUNISTIC 时,只有当您选择性地将更新应用于特定实例或者 MIG 创建新实例时,MIG 才会应用更新。在自动或手动调整 MIG 的大小以添加实例时,MIG 会创建新实例。Compute Engine 不会主动发出应用寻机更新的请求。

在某些情况下,寻机更新非常有用,因为如果能避免,您肯定不希望导致系统不稳定。例如,如果您有可根据需要应用、没有任何紧急性的非关键更新,并且您的 MIG 会主动进行自动扩缩,则可执行寻机更新,以免 Compute Engine 主动删除要应用该更新的现有实例。减小实例组大小时,自动扩缩器会优先终止使用旧模板的实例以及尚未处于 RUNNING 状态的实例。

如需了解详情,请参阅选择性更新 MIG 中的实例

设置寻机更新或主动更新

默认情况下,使用 Cloud Console 或 gcloud 命令行工具发起的更新是主动更新,这意味着更新会自动启动。使用 Compute Engine API 发起的更新为寻机更新,这意味着 MIG 不会主动将新实例模板应用于现有实例。

如需选择寻机更新或主动更新,请使用 Cloud Console、gcloud 命令行工具或 Compute Engine API 将模式设置为寻机或主动。

控制台

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

    转到“实例组”页面

  2. 选择要更新的 MIG。

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

  4. 更新配置下,选择自动更新或选择性更新。

gcloud

使用 rolling-action start-update 命令并将 --type 标志设置为 opportunisticproactive

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

API

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

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

{
  "updatePolicy": {
    "type": "TYPE" # Choose an opportunistic or proactive update
  },
  "versions": [{
    "instanceTemplate": "global/instanceTemplates/NEW_TEMPLATE",
    }]
}

请替换以下内容:

  • NEW_TEMPLATE:该组的新模板的名称
  • TYPE:更新类型(OPPORTUNISTICPROACTIVE

如需详细了解如何设置新模板然后将该模板应用于 MIG 中的新实例和现有实例,请参阅以下页面:

versionsinstanceTemplate 字段之间的关系

如果您使用 Compute Engine API,我们建议您使用 instanceGroupManagers.versionsregionInstanceGroupManagers.versions 字段来配置可用区和区域 MIG 的实例模板。

旧版 instanceTemplate 字段在功能上与 versions 字段有所重叠,因为这两个字段都可让您指定 MIG 用于创建实例的实例模板。但是,只有 versions 字段可让您指定高级双模板(Canary 版)配置。

为了实现向后兼容性,MIG 会继续支持设置顶级 instanceTemplate 字段,但我们建议您只使用 versions 字段。同时使用顶级 instanceTemplate 字段和 versions 字段可能会导致歧义和混淆。

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

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

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

    例如,在以下请求中,顶级 instanceTemplateversions 字段会指定与当前现有模板不同的同一实例模板,因此系统将根据新的实例模板更新 MIG:

    {
     "instanceTemplate": "global/instanceTemplates/NEW_TEMPLATE",
     "versions": [
      {
       "instanceTemplate": "global/instanceTemplates/NEW_TEMPLATE"
      }
     ],
     "updatePolicy": {
       "type": "PROACTIVE"
     }
    }
    
  • 您将这两个字段设置为不同的值,但其中只有一个值与 MIG 中的当前实例模板不同

    这是有效的请求。系统会将与当前设置不同的字段视为预期值。例如,您可以调用 update() 方法并提供两个字段,但只有一个字段会更新:

    {
     "instanceTemplate": "global/instanceTemplates/CURRENT_TEMPLATE",
     "versions": [
      {
       "instanceTemplate": "global/instanceTemplates/NEW_TEMPLATE"
      }
     ],
     "updatePolicy": {
       "type": "PROACTIVE"
     }
    }
    
  • 您将这两个字段设置为不同的值,且这两个值都与 MIG 中的当前实例模板不同

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

    {
     "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() 方法的行为会保持不变,让您能够更改 MIG 用于创建实例的模板。在您调用此方法时,系统将使用 setInstanceTemplate() 方法指定的实例模板来替换 versions 字段。

此外,setInstanceTemplate() 方法还会将 updatePolicy 设置为 OPPORTUNISTIC。这样可防止 MIG 主动部署 versions 字段中未明确指定的实例模板。

后续步骤