选择性地更新 MIG 中的实例

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

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

您可以选择性地将更新后的配置应用于特定实例,从而提供以下优势:

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

或者,如果您想要将新配置自动发布到 MIG 中的所有虚拟机或随机的一部分虚拟机,请参阅自动将更新发布到 MIG 中的实例为帮助您做出决定,请参阅在自动更新和选择性更新之间进行选择

准备工作

更新选定实例

如果您指定新模板并希望仅将其应用于选定的实例,MIG 会自动将新模板应用于调整 MIG 大小时创建的新实例。对于现有实例,您可以使用 gcloud 工具或 Compute Engine API 将新模板应用于选定实例。

gcloud

如需为实例组设置新的实例模板,请使用 set-instance-template 命令

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

如需将更新应用于特定实例,请使用 update-instances 命令

gcloud compute instance-groups managed update-instances INSTANCE_GROUP_NAME \
    --instances INSTANCE_NAMES \
    --most-disruptive-allowed-action DISRUPTION_LEVEL \
    --minimal-action DISRUPTION_LEVEL

请替换以下内容:

  • INSTANCE_GROUP_NAME:MIG 的名称
  • INSTANCE_TEMPLATE:新实例模板
  • INSTANCE_NAMES:应用模板的实例列表
  • DISRUPTION_LEVEL:最低或最高中断级别nonerefreshrestartreplace
    • 最少操作默认为 none
    • 允许的最具中断性的操作默认为 replace

API

可用区区域 MIG 调用 patch 方法并更新 versions.instanceTemplate 字段。为避免将新模板自动发布到组中的所有实例,请将 updatePolicy.type 字段设置为 OPPORTUNISTIC

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

{
  "updatePolicy": {
    "type": "OPPORTUNISTIC"
  },
  "versions": [{
    "instanceTemplate": "global/instanceTemplates/NEW_TEMPLATE",
  }]
}

设置新的模板版本后,为可用区区域 MIG 调用 applyUpdatesToInstances。在请求中指定实例列表,或者将 allInstances 布尔值设置为 true 以更新所有实例。

更新特定实例

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME/applyUpdatesToInstances
{
  "instances": [
    "zones/ZONE/instances/INSTANCE_NAME_1",
    "zones/ZONE/instances/INSTANCE_NAME_2"
  ],
  "minimalAction": DISRUPTION_LEVEL,
  "mostDisruptiveAllowedAction": DISRUPTION_LEVEL
}

更新所有实例

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME/applyUpdatesToInstances
{
  "allInstances": true,
  "minimalAction": DISRUPTION_LEVEL,
  "mostDisruptiveAllowedAction": DISRUPTION_LEVEL
}

请替换以下内容:

  • INSTANCE_GROUP_NAME:组的名称
  • NEW_TEMPLATE:新模板的名称
  • ZONE:要更新的实例所在的地区。
  • INSTANCE_NAME_1INSTANCE_NAME_2:要更新的实例的名称
  • DISRUPTION_LEVEL:最低或最高中断级别NONEREFRESHRESTARTREPLACE
    • minimalAction 的默认值为 NONE
    • mostDisruptiveAllowedAction 的默认值为 REPLACE

与其他托管实例组方法类似,applyUpdatesToInstances 也是基于意图,这意味着该方法会返回操作响应。操作可能需要一些时间才能完成。

发出请求后,您可以检查状态以验证更新是否已完成。

更新实例配置

当您将更新应用于所选实例时,MIG 会同时应用实例模板和实例配置(如果存在)。

如需了解详情,请参阅应用实例配置中的有状态配置

在选择性更新期间控制中断级别

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

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

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

更新选定的实例时,这两个选项接受以下值:

说明可更新哪些实例属性?
NONE完全不中断实例。
REFRESH不停止实例。其他磁盘、实例元数据、标签、标记
RESTART停止实例并重启。其他磁盘、实例元数据、标签、标记、机器类型
REPLACE删除实例并重新创建。存储在实例模板或实例配置中的所有实例属性

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

当您有选择地更新实例时,系统将应用以下默认值:

  • 默认最少操作是 NONE,它用于尽可能限制中断。
  • 允许的最具中断性的操作默认为 REPLACE。如果您无法承受此类中断,请将允许的最具中断性操作设置为较少的中断次数。

后续步骤