使用所有实例配置替换实例模板属性


本页面介绍如何使用所有实例配置来为托管式实例组 (MIG) 中的所有虚拟机实例设置标签元数据属性,而无需创建新实例模板。

您可以继续使用实例模板在 MIG 中设置实例属性。但在某些情况下,使用 MIG 的所有实例配置更容易,例如在以下情况下:

  • 您需要经常更新实例元数据或标签,不想每次都创建新模板。请记住,实例模板是不可变的,也就是说,实例模板在创建后无法修改。

  • 您希望根据一个实例模板创建多个 MIG,但需要为每个 MIG 配置不同的标签或元数据。例如,如果您有一个应用,但希望支持不同的开发、测试和生产环境。可以创建一个实例模板并在所有环境中重复使用该实例模板,方法是使用不同的所有实例配置为每个环境设置不同的元数据。

  • 您有一个团队拥有基础架构和映像,而另一个团队运行需要配置的应用。可以让一个团队使用一个实例模板来预配基础架构,应用团队则可以使用所有实例配置来管理应用配置。

  • 您在虚拟机上运行代理,想要使用元数据对其进行配置。您希望确保即使代理的实例模板发生更改,虚拟机代理配置仍会保留。使用实例模板控制应用版本,并使用所有实例配置配置虚拟机代理。

如果您同时使用 MIG 的实例模板及其所有实例配置设置了相同的属性,则 MIG 会优先采用所有实例配置中的值。例如,如果 enable-guest-attributes 的元数据在 MIG 的实例模板中设置为 FALSE,在该 MIG 的所有实例配置中设置为 TRUE,则 Compute Engine 在组中的所有实例上应用 TRUE。这样,您就可以使用所有实例配置来替换实例模板中定义的属性。

准备工作

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

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

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

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

限制

  • 您只能使用所有实例配置替换以下实例模板属性:

    • 元数据
    • 标签
  • 无法对所有实例配置执行 Canary 更新。将配置应用于组时,Compute Engine 会根据您的更新政策将属性应用于所有新实例和现有实例。如果您想要控制在何时更新哪些现有实例,可以使用选择性更新

  • 如果您在 MIG 中使用有状态配置,则无法在任何每个实例配置中设置相同的属性,同时也无法在组的所有实例配置中设置相同的属性。

设置所有实例配置中的属性

使用 gcloud CLI 或 REST 创建和更新 MIG 的所有实例配置。

控制台

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

    转到“实例组”

  2. 选择要设置所有实例配置的 MIG。

  3. 点击更新虚拟机

  4. 所有实例配置部分中,执行以下操作:

    • 如需添加或更新元数据值,请点击管理元数据。完成设置,然后点击保存
    • 如需添加或更新标签,请点击管理标签。完成设置,然后点击保存
  5. 完成所有实例配置中的属性设置后,点击更新虚拟机

    如果 MIG 的更新类型设置为自动,则您设置的所有实例配置会立即应用于所有现有虚拟机。 如果更新类型为选择性,则必须选择性地将配置应用于现有虚拟机。如需了解详情,请参阅将所有实例配置应用于现有虚拟机

gcloud

使用 all-instances-config update 命令添加或更新所有实例配置。

gcloud compute instance-groups managed all-instances-config update INSTANCE_GROUP_NAME \
    --metadata=KEY1=VALUE1,KEY2=VALUE2 \
    --labels=KEY3=VALUE3,KEY4=VALUE4

请替换以下内容:

  • INSTANCE_GROUP_NAME:MIG 的名称。
  • KEYSVALUES:标签或元数据的键值对。如果不存在键,更新命令会添加键。对于现有键,其值会更新。

请务必将更新后的配置应用到 MIG 中的现有虚拟机。

REST

通过对可用区级区域级的 MIG 发出 PATCH 请求,添加或更新所有实例配置。

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

{
  "allInstancesConfig": {
    "properties": {
      "metadata": {
        "KEY1": "VALUE1",
        ...
      },
      "labels": {
        "KEY2": "VALUE2",
        ...
      },
    }
  }
}

请替换以下内容:

  • PROJECT_ID:该 MIG 所在的项目
  • REGION:MIG 所在的区域。对于可用区级 MIG,请将 regions/REGION 替换为 zones/ZONE
  • INSTANCE_GROUP_NAME:MIG 的名称。
  • KEYSVALUES:标签或元数据的键值对。如果键不存在,请求会添加键。对于现有键,其值会更新。

请务必将更新后的配置应用到 MIG 中的现有虚拟机。

将所有实例配置应用于现有虚拟机

您为 MIG 中的虚拟机指定的虚拟机配置会自动应用于添加到该组的新虚拟机。

如需将更新后的虚拟机配置(包括更新后的所有实例配置)应用于该组中的现有虚拟机,请使用以下方法之一:

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

自动(主动)

如果您希望在每次更改时自动将更新后的所有实例配置应用于所有现有虚拟机,请将组的更新政策类型设置为“主动”。如需了解详情,请参阅自动(主动)更新类型

您可以使用可选的 maxUnavailablemaxSurgeminReadySec 设置控制主动配置发布速度。

若要使用主动更新,您只需配置一次。之后,MIG 便会根据组更新政策中的设置将未来所有虚拟机配置的更改(即对实例组的所有实例配置、实例模板和每个实例配置的更改)自动应用于组中的所有虚拟机。

如需自动应用配置更新,请使用 gcloud CLI 或 REST。

gcloud

您可以使用 update 命令配置自动(主动)更新。

gcloud compute instance-groups managed update INSTANCE_GROUP_NAME \
    --update-policy-type=proactive \
    --update-policy-max-unavailable=MAX_UNAVAILABLE \
    --update-policy-max-surge=MAX_SURGE \
    --update-policy-min-ready=MIN_READY \
    --update-policy-minimal-action=MINIMAL_ACTION \
    --update-policy-replacement-method=REPLACEMENT_METHOD

替换以下内容:

  • INSTANCE_GROUP_NAME:MIG 的名称。
  • MAX_UNAVAILABLE(可选):更新期间不可用的实例数上限。例如,如果将 update-minimal-action 标志设置为 restart,则此标志会限制一次重启的虚拟机数量。这可以是固定数量(例如 5)或托管式实例组大小的某一百分比(例如 10%)。
  • MAX_SURGE(可选):更新期间可以额外创建的实例数上限。这可以是固定数量(例如 5)或托管式实例组大小的某一百分比(例如 10%)。
  • MIN_READY(可选):重启或替换的虚拟机准备就绪后,在被视为可用前需保持正常的最短时间。例如 10s 表示 10 秒钟。如需了解时长格式,请参阅 gcloud topic datetimes
  • MINIMAL_ACTION(可选):在配置更新期间要对每个实例执行的操作:
    • refresh:将新配置应用于正在运行的实例,而无需重启实例。
    • restart:在更新期间重启虚拟机,如果应用仅在重新启动期间读取元数据,这种做法将非常有用。
    • replace:删除虚拟机并创建新的虚拟机以应用新配置。
  • REPLACEMENT_METHOD(可选):指定用于替换实例的操作:
    • recreate:等待旧实例被删除,然后创建一个与旧实例同名的新实例。
    • substitute:删除旧实例时,使用新名称创建实例

REST

您可以通过对可用区级区域级 MIG 发出 PATCH 请求来配置自动(主动)更新。

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

{
  "updatePolicy": {
    "type": "PROACTIVE",
    "maxUnavailable": {
      "percent": MAX_UNAVAILABLE
    },
    "maxSurge": {
      "percent": MAX_SURGE
    },
    "minimalAction": MINIMAL_ACTION,
    "replacementMethod": REPLACEMENT_METHOD
  }
}

请替换以下内容:

  • PROJECT_ID:该 MIG 所在的项目
  • REGION:MIG 所在的区域。对于可用区级 MIG,请将 regions/REGION 替换为 zones/ZONE
  • INSTANCE_GROUP_NAME:MIG 的名称。
  • MAX_UNAVAILABLE(可选):更新期间不可用的实例数上限。例如,如果您将 update-minimal-action 标志设置为 RESTART,则此标志会限制一次重启的虚拟机数量。可以是百分比(例如,指定 "percent": 80 表示 80%),也可以是固定数字。如需指定固定数量,请将 "percent": MAX_UNAVAILABLE 替换为 "fixed": MAX_UNAVAILABLE
  • MAX_SURGE(可选):更新期间可以额外创建的实例数上限。可以是百分比或固定数字。
  • MINIMAL_ACTION(可选):在配置更新期间要对每个实例执行的操作:
    • REFRESH:将新配置应用于正在运行的实例,而无需重启实例。
    • RESTART:在更新期间重启虚拟机,如果应用仅在重新启动期间读取元数据,这种做法将非常有用。
    • REPLACE:删除虚拟机并创建新的虚拟机以应用新配置。
  • REPLACEMENT_METHOD(可选):指定用于替换实例的操作:
    • RECREATE:等待旧实例被删除,然后创建一个与旧实例同名的新实例。
    • SUBSTITUTE:删除旧实例时,使用新名称创建实例

如果省略可选标志,组会使用该组的更新政策中的值。您可以使用 gcloud CLI 或 REST 检查更新政策

选择性(寻机)

如果要控制何时应用新配置以及应用到哪些虚拟机,请将组的更新政策类型设置为“寻机”。如需了解详情,请参阅选择性(寻机)更新类型

选择性地应用配置更新时,对实例组的所有实例配置、实例模板或每个实例配置所做的任何更改都不会自动应用于现有虚拟机。必须将更新后的配置明确应用于现有虚拟机才能进行更新。

如需选择性地将虚拟机配置更新应用于 MIG 中的虚拟机,请使用 gcloud CLI 或 REST。

gcloud

您可以使用 update 命令配置选择性(寻机)更新:

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

将组的更新类型设置为 opportunistic 时,如果要将新配置应用到现有虚拟机,则必须启动更新。

将配置应用于特定虚拟机

若要更新选定的实例,请使用以下命令:

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

将配置应用于所有虚拟机

如需更新所有现有实例,请使用以下命令:

gcloud compute instance-groups managed update-instances INSTANCE_GROUP_NAME \
    --all-instances \
    --minimal-action=MINIMAL_ACTION \
    --most-disruptive-allowed-action=MOST_DISRUPTIVE_ALLOWED_ACTION

请替换以下内容:

  • INSTANCE_GROUP_NAME:MIG 的名称。
  • INSTANCE_NAMES:要应用模板的实例列表
  • MINIMAL_ACTION(可选):在配置更新期间要对每个实例执行的操作:
    • refresh(默认):将新配置应用于正在运行的实例,而无需重启实例。
    • restart:在更新期间重启虚拟机,如果应用仅在重新启动期间读取元数据,这种做法将非常有用。
    • replace:删除虚拟机并创建新的虚拟机以应用新配置。
  • MOST_DISRUPTIVE_ALLOWED_ACTION(可选):对每个实例执行中断程度最高为此程度的操作。如果配置更新需要执行中断程度高于此处指定程度的操作,则更新将失败并且不会进行任何更改。
    • none:无操作
    • refresh:如果可能,在不停止实例的情况下应用新配置。例如,使用 refresh 应用仅影响元数据或其他磁盘的更改。
    • restart:如果可能,在不替换实例的情况下应用新配置。例如,停止实例并重新启动它们足以将更改应用于机器类型。
    • replace:根据 --replacement-method 标志替换旧实例。

REST

您可以通过对可用区级区域级 MIG 发出 PATCH 请求来配置选择性(寻机)更新。

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

{
  "updatePolicy": {
    "type": "OPPORTUNISTIC"
  }
}

将组的更新类型设置为 OPPORTUNISTIC 时,如果要将新配置应用到现有虚拟机,则必须启动更新。

将配置应用于特定虚拟机

如需更新特定实例,请使用以下请求:

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": MINIMAL_ACTION,
  "mostDisruptiveAllowedAction": MOST_DISRUPTIVE_ALLOWED_ACTION
}

将配置应用于所有虚拟机

如需更新所有现有实例,请使用以下请求:

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

{
  "allInstances": true,
  "minimalAction": MINIMAL_ACTION,
  "mostDisruptiveAllowedAction": MOST_DISRUPTIVE_ALLOWED_ACTION
}

请替换以下内容:

  • PROJECT_ID:该 MIG 所在的项目
  • REGION:MIG 所在的区域。对于可用区级 MIG,请将 regions/REGION 替换为 zones/ZONE
  • INSTANCE_GROUP_NAME:MIG 的名称。
  • MINIMAL_ACTION(可选):在配置更新期间要对每个实例执行的操作:
    • REFRESH:将新配置应用于正在运行的实例,而无需重启实例。
    • RESTART:在更新期间重启虚拟机,如果应用仅在重新启动期间读取元数据,这种做法将非常有用。
    • REPLACE:删除虚拟机并创建新的虚拟机以应用新配置。
  • MOST_DISRUPTIVE_ALLOWED_ACTION(可选):对每个实例执行中断程度最高为此程度的操作。如果配置更新需要执行中断程度高于此处指定程度的操作,则更新将失败并且不会进行任何更改。
    • NONE:无操作
    • REFRESH:如果可能,在不停止实例的情况下应用新配置。例如,使用 REFRESH 应用仅影响元数据或其他磁盘的更改。
    • RESTART:如果可能,在不替换实例的情况下应用新配置。例如,停止实例并重新启动它们足以将更改应用于机器类型。
    • REPLACE:根据组的 updatePolicy.replacementMethod 字段替换旧实例。

验证是否已应用更新后的所有实例配置

您可以使用以下任一方法验证最新的所有实例配置是否已应用于组中的所有虚拟机。

控制台

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

    转到“实例组”

  2. 选择要查看所有实例配置的 MIG。

  3. 点击详细信息标签页。

  4. 如果将最新的所有实例配置应用于所有虚拟机,则所有实例配置部分中会显示上次修改时间时间戳,并且状态字段必须显示如下值:

    • 上次修改时间:显示您将所有实例配置应用于所有虚拟机的时间。
    • 状态:显示已应用于所有虚拟机。如果未将所有实例应用于所有虚拟机,则状态将显示为待处理虚拟机更新

gcloud

使用 describe 命令并添加 --format 标志以查找 status.allInstancesConfig.effective 值。

gcloud compute instance-groups managed describe INSTANCE_GROUP_NAME \
    --format="(status.allInstancesConfig)"

示例输出:

status:
  allInstancesConfig:
    currentRevision: 2022-12-02T10:30:15.012345Z
    effective: true

如果 effective 值设置为 true,则表示所有虚拟机都已应用最新配置。currentRevision 值显示组的所有实例配置的最新更改的时间戳。

如果 effective 值设置为 false,则表示最新配置尚未应用于所有虚拟机。

如需检查每个虚拟机的状态,可以列出 MIG 的所有虚拟机或使用 describe-instance 命令单独检查每个虚拟机:

gcloud compute instance-groups managed describe-instance INSTANCE_GROUP_NAME \
    --instance INSTANCE_NAME

示例输出:

allInstancesConfig:
  revision: 2022-12-02T10:30:15.012345Z
currentAction: NONE
id: '8393021473297481188'
instance: .../projects/PROJECT/zones/ZONE/instances/INSTANCE_NAME
instanceStatus: RUNNING
name: INSTANCE_NAME
version:
  instanceTemplate: .../projects/PROJECT/global/instanceTemplates/INSTANCE_TEMPLATE

如需查看哪些虚拟机应用了最新配置,请将每个虚拟机的 revision 时间戳与 MIG 上的 currentRevision 时间戳进行比较。

REST

可用区级区域级 MIG 发出 GET 请求以检查 status.allInstancesConfig.effective 标志的值。

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

示例响应:

{
  ...
  "status": {
    "isStable": "true",
    "versionTarget": {
      "isReached": "true"
    },
    "allInstancesConfig": {
      "currentRevision": "2022-12-02T10:30:15.012345Z",
      "effective": "true"
    },
  ...
  },
  ...
}

如果 effective 字段设置为 true,则表示所有虚拟机都已应用最新配置。currentRevision 字段显示组的所有实例配置的最新更改的时间戳。

如果 effective 字段设置为 false,则表示最新配置尚未应用于所有虚拟机。

如需检查每个实例的状态,请列出可用区级区域级 MIG 的托管式实例:

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

示例输出:

{
  "managedInstances": [
    ...
    {
      "instance": ".../zones/ZONE/instances/INSTANCE_NAME",
      "instanceStatus": "RUNNING",
      "currentAction": "NONE",
      "allInstancesConfig": {
        "revision": "2022-12-02T10:30:15.012345Z"
      },
      "version": {
        "name": "V1",
        "instanceTemplate": ".../projects/.../instanceTemplates/INSTANCE_TEMPLATE"
      }
    },
    {
      ...
    }
  ]
}

如需查看哪些虚拟机应用了最新配置,请将每个虚拟机的 revision 时间戳与 MIG 上的 currentRevision 时间戳进行比较。

列出所有实例配置中的属性

所有实例配置是 MIG 配置的一部分。要查看所有实例配置,请使用以下方法之一。

控制台

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

    转到“实例组”

  2. 选择要查看所有实例配置的 MIG。

  3. 点击详细信息标签页。

  4. 请参阅所有实例配置部分。

gcloud

使用 describe 命令并添加 --format 标志以显示组的所有实例配置值。

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

该命令会返回组的所有实例配置(如果存在)。

REST

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

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

如果未设置 allInstancesConfig 字段,则该组没有所有实例配置。

删除所有实例配置中的属性

如果您从 MIG 的所有实例配置中删除了一个属性,而 MIG 的实例模板中已存在该属性,则 MIG 中的虚拟机在应用最新配置后,将从实例模板中重新继承该属性。如需详细了解如何将最新配置应用于现有虚拟机,请参阅将所有实例配置应用于现有虚拟机

如需从所有实例配置中删除属性,请使用以下方法之一。

控制台

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

    转到“实例组”

  2. 选择要从中删除所有实例配置的 MIG。

  3. 点击更新虚拟机

  4. 所有实例配置部分中,执行以下操作:

    • 如需删除元数据,请点击管理元数据
    • 如需删除标签,请点击管理标签
  5. 管理元数据管理标签窗格中,执行以下操作:

    1. 将指针悬停在某项设置上以激活删除选项,然后点击 删除项
    2. 点击保存
  6. 删除完成后,点击更新虚拟机

    如果 MIG 的更新类型设置为自动,则所有实例配置中的更改会立即应用于所有现有虚拟机。 如果更新类型为选择性,则必须选择性地将配置应用于现有虚拟机。如需了解详情,请参阅将所有实例配置应用于现有虚拟机

gcloud

如需删除属性,请使用 all-instances-configuration delete 命令,并为要删除的属性指定一个或多个键。

gcloud compute instance-groups managed all-instances-config delete INSTANCE_GROUP_NAME \
    --metadata=KEY1[, KEY1]\
    --labels=KEY1[, KEY1]

请务必将更新后的配置应用到 MIG 中的现有虚拟机。

REST

如需删除属性,请向可用区级区域级 MIG 发出 PATCH 请求,并将 null 值指定为您要移除的每个属性的键。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME
{
  "allInstancesConfig": {
    "properties": {
      "metadata": {
        "KEY1": null,
        ...
      },
      "labels": {
        "KEY2": null,
        ...
      }
    }
  }
}

请务必将更新后的配置应用到 MIG 中的现有虚拟机。

后续步骤