在 MIG 中应用新的虚拟机配置


本页面介绍如何配置代管式实例组 (MIG) 中的虚拟机实例,以及可以使用哪些方法将配置应用于组中的现有虚拟机。

您可以使用以下虚拟机配置组件为 MIG 中的虚拟机指定预期配置:

  • 必需:实例模板
  • 可选:所有实例配置
  • 可选:有状态配置

每次使用这些组件更新预期配置时,Compute Engine 都会自动将更新后的配置应用于添加到组中的新虚拟机。

如需将更新后的配置应用于现有虚拟机,请使用本页面中介绍的方法:

  • 自动发布(指定中断预算)并选择性地对新模板执行 Canary 更新
  • 仅选择性地手动更新特定虚拟机,最大限度地减少中断
  • 重新创建特定虚拟机

您还可以将 MIG 配置为在虚拟机修复期间将最新的可用配置应用于虚拟机。如需了解详情,请参阅在修复期间应用配置更新

如果您只需要调整 MIG 的大小,请参阅文档以了解如何添加或移除 MIG 中的实例。 如需了解如何配置 MIG 功能,请参阅自动扩缩自动修复负载均衡有状态工作负载文档。

准备工作

  • 设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

    REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

MIG 中虚拟机的配置组件

您可以通过以下组件配置 MIG 中的虚拟机:

组件属性使用场景
实例模板 机器类型、启动磁盘映像、标签、启动脚本和其他虚拟机属性 必需:使用实例模板为组中的所有虚拟机定义必需和可选实例属性。

可选:如果要对第二个虚拟机配置进行 Canary 测试,您可以向组添加第二个实例模板,并将其应用于组中的部分虚拟机组。
所有实例配置 标签和元数据 可选:使用所有实例配置可快速替换组中所有虚拟机的实例模板属性。
有状态配置 有状态磁盘、IP 地址和元数据 可选:如果您需要支持有状态工作负载,请将有状态配置添加到组中的虚拟机。

如果您通过这些组件更新组的任何配置,则必须将更新后的配置应用于组中的现有虚拟机,才能使更新后的配置生效。

将新配置应用于现有虚拟机的方法

更新 MIG 的虚拟机配置后,您可以使用以下方法将新配置应用于组中的现有虚拟机:

  • 自动(主动):如果您希望 MIG 自动将新配置应用于组中的所有或部分现有虚拟机,请使用此方法。正在运行的虚拟机的中断级别取决于您配置的更新政策。您可以使用此方法对新的实例模板执行 Canary 更新。如需使用此方法,请将 MIG 的更新类型设置为“主动”。
  • 选择性(寻机):如果您想手动应用更新或想要一次性更新组中的所有现有虚拟机,请使用此方法。定位到要更新为最新配置的任意或所有虚拟机。如需使用此方法,请将 MIG 的更新类型设置为“寻机”。
  • 重新创建虚拟机:通过重新创建特定虚拟机来应用新配置。

如需详细了解如何设置 MIG 的更新类型,请参阅设置主动更新或寻机更新

自动(主动)

自动更新类型也称为“主动”更新类型。将 MIG 的更新类型设置为主动时,MIG 会根据需要自动将更新后的配置应用于虚拟机。

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

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

如需了解如何设置 MIG 的更新类型,请参阅设置主动更新或寻机更新

如需详细了解自动发布,请参阅在 MIG 中自动应用虚拟机配置更新

选择性(寻机)

选择性更新类型也称为“寻机”更新类型。将 MIG 的更新类型设置为寻机更新时,只有当您选择性地定位到要更新的特定虚拟机时,MIG 才会对新虚拟机应用新配置。

将 MIG 的更新类型设置为“寻机”具有以下优势:

  • 您可以选择要更新的虚拟机。
  • 您可以控制更新的时间和顺序。
  • 您可以使用 gcloud CLI 或 REST 立即更新所有实例。

在某些情况下,选择性更新类型非常有用,因为如果能避免,您肯定不希望导致系统不稳定。例如,应该考虑以下事项:

  • MIG 中的一个虚拟机发生故障,需要修复,但您不希望其配置发生更改。如果将 MIG 的更新类型设置为寻机更新,并且您没有在修复期间强制应用更新,则 Compute Engine 会使用在创建虚拟机时所用的配置修复该虚拟机,即使原始实例模板已不存在也是如此。

  • 您有一个自动扩缩的 MIG,并且您希望在没有任何紧急情况下,应用非关键更新。为确保 Compute Engine 不会删除现有的虚拟机以应用更新,请将 MIG 的更新类型设置为寻机更新。 横向缩容时,自动扩缩器会优先终止具有旧配置的虚拟机。横向扩容时,组会使用最新配置创建虚拟机。

如需了解如何设置 MIG 的更新类型,请参阅设置主动更新或寻机更新

如需详细了解如何选择性更新虚拟机,请参阅选择性地在 MIG 中应用虚拟机配置更新

重新创建虚拟机

您可以在 MIG 中重新创建任何虚拟机。执行此操作时,MIG 会应用尚未应用于该虚拟机的所有已更新配置。如需了解详情,请参阅在 MIG 中重新创建虚拟机

设置主动更新或寻机更新

如需自动将新配置应用到现有虚拟机,请将 MIG 的更新类型设置为“主动”。如需仅在选择要更新的虚拟机时对现有虚拟机应用新配置,请将 MIG 的更新类型设置为“寻机”。

使用 Google Cloud 控制台、Google Cloud CLI 或 REST。

控制台

  1. 在 Google Cloud 控制台中,转到实例组页面。

    转到“实例组”页面

  2. 选择要更新的 MIG。

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

  4. 如需为实例组设置不同的模板,请在新建模板下选择要使用的实例模板。

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

gcloud

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

gcloud compute instance-groups managed rolling-action start-update INSTANCE_GROUP_NAME \
    --version=template=NEW_TEMPLATE \
    --type=TYPE

还可以使用 Beta 版 update 命令并添加 --update-policy-type 标志。

gcloud beta compute instance-groups managed update INSTANCE_GROUP_NAME \
    --update-policy-type=TYPE

请替换以下内容:

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

REST

可用区区域 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",
    }]
}

请替换以下内容:

  • PROJECT_ID:该 MIG 所在的项目。
  • REGION:MIG 所在的区域。对于可用区级 MIG,请将 regions/REGION 替换为 zones/ZONE
  • INSTANCE_GROUP_NAME:组的名称。
  • NEW_TEMPLATE:该组的新模板的名称。
  • TYPE:更新类型(OPPORTUNISTICPROACTIVE)。

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

检查组的更新政策类型

您可以使用 gcloud CLI 或 REST 查看 MIG 当前配置的更新政策类型(“寻机”或“主动”)和其他更新政策设置

gcloud

使用 describe 命令并添加 --format 标志以仅列出 updatePolicy 设置。

gcloud beta compute instance-groups managed describe INSTANCE_GROUP_NAME \
    --format="(updatePolicy)"

REST

可用区级区域级 MIG 发出 GET 请求并检查 updatePolicy 字段。

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

如需更改政策类型,请参阅设置主动更新或寻机更新

针对已暂停和已停止的虚拟机的更新

如果已暂停和停止 MIG 中的虚拟机池,您可以选择性地(寻机)更新已暂停或已停止的虚拟机,就像更新其他正在运行的虚拟机一样。如果您配置自动(主动)更新,则 MIG 会按照以下顺序更新虚拟机:

  1. 运行、暂停和停止的虚拟机
  2. 状态为 SUSPENDINGSTOPPING 的虚拟机

对于自动更新,MIG 仅根据正在运行的虚拟机目标数量计算超额配置数量上限不可用数量上限,并且不会考虑备用池中的虚拟机。

如果自动更新需要替换群组中的虚拟机,则 MIG 将执行以下操作:

  1. 删除已暂停和已停止的虚拟机。
  2. 使用新的实例模板创建新虚拟机。
  3. 执行初始化过程。
  4. 暂停或停止虚拟机。

如果自动更新只需要刷新或重启实例组中的虚拟机,则 MIG 会执行以下操作:

  1. 恢复或启动虚拟机。
  2. 在虚拟机运行时对其执行更新。
  3. 执行初始化过程。
  4. 暂停或停止虚拟机。

Canary 版更新

如果您要在具有已暂停或已停止虚拟机的 MIG 中启动 Canary 版更新,则需遵守以下规则:

  • manual 备用政策模式下,MIG 仅根据要应用更新的虚拟机数量或百分比来更新正在运行的虚拟机。已暂停和已停止的虚拟机会保留在先前版本中。
  • scale-out-pool 备用政策模式下,您无法在 MIG 中启动 Canary 版更新。

versionsinstanceTemplate 字段之间的关系

如果您使用 REST,我们建议您使用 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 字段中未明确指定的实例模板。

后续步骤