在 MIG 中配置有状态元数据

实例元数据对于设置应用属性以及通过元数据服务器与应用进行通信非常有用。例如,您可以使用元数据来配置虚拟机 (VM) 实例的身份、环境变量、集群架构相关信息或虚拟机负责的数据范围。

通过在代管实例组 (MIG) 中配置有状态元数据,可确保特定于实例的元数据在代管实例自动修复、更新和重新创建事件中得以保留。

如需为 MIG 中的虚拟机实例单独配置有状态元数据,请在实例配置中设置该元数据并应用配置。您可以在创建实例时设置个别实例配置,也可以针对现有代管实例进行设置。应用个别实例配置后,MIG 会存储代管实例配置字段中处于保留状态的有状态元数据(此配置字段为 preservedStateFromConfig)。

准备工作

限制

有状态 MIG 存在以下限制:

  • 您不能对有状态 MIG 使用自动扩缩功能。
  • 如果您配置有状态磁盘或有状态元数据,则不能使用 proactive 滚动更新。
    • 您可以通过更新特定实例来控制更新并限制中断。
    • 如果使用自定义实例名称并且未配置有状态磁盘或元数据,则可以使用主动更新,但要保留实例名称,必须将替换方法设置为 RECREATE
  • 当永久删除某实例(无论是手动删除还是调整大小)时,MIG 不会保留其有状态元数据。
  • 对于有状态地区级 MIG,必须停用主动式重新分布功能(将重新分布类型设置为 NONE),以防止通过自动跨区域重新分布删除有状态实例。

在创建实例时设置有状态元数据

您可以在 MIG 中手动创建实例时设置有状态元数据。这种做法有助于将独立虚拟机上的有状态应用迁移到有状态 MIG 以及创建有状态实例。

如果您在 MIG 中手动创建实例并提供有状态元数据,MIG 会执行以下任务:

  1. 使用提供的实例名称通过实例模板创建代管实例
  2. 使用提供的有状态元数据创建个别实例配置,并在实例上设置该元数据。
  3. 存储关联代管实例的配置 (preservedStateFromConfig) 中处于保留状态的有状态元数据。

gcloud

如需使用自定义名称创建代管实例并在该虚拟机上设置有状态元数据,请使用带有 --stateful-metadata 标志的 gcloud compute instance-groups managed create-instance 命令

gcloud compute instance-groups managed create-instance NAME \
  --instance INSTANCE_NAME \
  --stateful-metadata KEY=VALUE[,KEY=VALUE,...]

替换以下内容:

  • NAME:要在其中创建实例的 MIG 的名称
  • INSTANCE_NAME:要创建的实例的名称
  • KEYVALUE:除了在实例模板中定义的元数据之外,还要为实例单独设置的有状态元数据键值对
    • 您在此处设置的键值对优先于实例模板中任何冲突的键值对

示例

您需要部署一个可以 activestandby 模式运行的节点集群 example-cluster。您使用元数据为集群中的每个虚拟机单独设置模式,例如:mode:active。您还使用 logging 元数据键(可设置为 basicelaborate)来为每个节点配置详细日志记录。节点上的应用使用实例元数据中的值进行配置。

如需创建具有详细日志记录的活跃节点 node-12,请运行以下命令:

gcloud compute instance-groups managed create-instance example-cluster \
  --instance node-12 \
  --stateful-metadata mode=active,logging=elaborate

该命令会在 example-cluster MIG 中创建一个虚拟机 node-12,并为新实例设置两个元数据键值对 mode:activelogging:elaborate

API

如需在 MIG 中创建一个或多个具有自定义虚拟机名称的代管实例,并在这些虚拟机上单独设置有状态元数据,请使用 instanceGroupManagers.createInstances 方法。 对于区域级 MIG,请使用 regionInstanceGroupManagers.createInstances 方法

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/NAME/createInstances
{
  "perInstanceConfigs": [
    {
      "name": "INSTANCE_NAME",
      "preservedState" : {
        "metadata": {
          "KEY" : "VALUE",
          ...
        }
      }
    },
    ...
  ]
}

替换以下内容:

  • PROJECT_ID:请求的项目 ID。
  • ZONE:MIG 所在的区域(适用于区域级 MIG)
    • 对于地区级 MIG,将 zones/ZONE 替换为 regions/REGION 并指定 MIG 所在的地区
  • NAME:要在其中创建实例的 MIG 的名称
  • INSTANCE_NAME:要创建的实例的名称
  • KEYVALUE:除了在实例模板中定义的元数据之外,还要为实例单独设置的有状态元数据键值对
    • 您在此处设置的键值对优先于实例模板中任何冲突的键值对

示例

您需要部署一个可以 activestandby 模式运行的节点集群 example-cluster。您使用元数据为集群中的每个虚拟机单独设置模式,例如:mode:active。您还使用 logging 元数据键(可设置为 basicelaborate)来为每个节点配置详细日志记录。节点上的应用使用实例元数据中的值进行配置。

如需创建具有详细日志记录的活跃节点 node-12,请执行以下方法:

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-cluster/createInstances

{
  "instance": [
    {
      "name": "node-12",
      "preservedState" : {
        "metadata": {
          "mode":"active",
          "logging":"elaborate"
        }
      }
    }
  ]
}

该方法会在 example-cluster MIG 中创建一个虚拟机 node-12,并为新实例设置两个元数据键值对 mode:activelogging:elaborate

为现有虚拟机实例单独设置、修改和移除有状态元数据

如需设置、修改或移除 MIG 中现有实例的有状态元数据,请在关联的个别实例配置中设置该元数据,然后更新该实例以应用配置。

gcloud

如需为 MIG 中的虚拟机实例单独配置有状态元数据,请在关联的个别实例配置中设置或移除有状态元数据。如果您同时将配置应用于实例 (--update-instance),则可以选择是保持实例运行、重启实例还是重新创建实例。如果您未应用配置 (--no-update-instance),则在重新创建或更新实例之前,您的更改不会生效。

如果给定实例不存在个别实例配置,请使用带有以下标志之一的 gcloud compute instance-groups managed instance-configs create 命令

gcloud compute instance-groups managed instance-configs create NAME \
  --instance INSTANCE_NAME \
  --stateful-metadata KEY=VALUE[,KEY=VALUE,...] \
  [--no-update-instance | --update-instance] \
  [--instance-update-minimal-action MINIMAL_ACTION]

如果指定实例已存在个别实例配置,请搭配以下标志使用 gcloud compute instance-groups managed instance-configs update 命令

  • --stateful-metadata 标志(用于设置或修改元数据)或
  • --remove-stateful-metadata 标志(用于移除特定于实例的有状态元数据)。
gcloud compute instance-groups managed instance-configs update NAME \
  --instance INSTANCE_NAME \
  [--stateful-metadata KEY=VALUE[,KEY=VALUE,...]] \
  [--remove-stateful-metadata KEY[,KEY,...]] \
  [--no-update-instance | --update-instance] \
  [--instance-update-minimal-action MINIMAL_ACTION]

替换以下内容:

  • NAME:代管实例组的名称。
  • INSTANCE_NAME:要为其配置有状态元数据的实例的名称。
  • KEY=VALUE:除了在实例模板中定义的元数据之外,还要为实例单独设置的有状态元数据键值对。您在此处设置的键值对优先于实例模板中任何冲突的键值对。
  • KEY:要从个别实例配置中移除的实例特定有状态元数据键。
    • 如果实例模板未定义键的值,则在应用更改时,键值对会从实例中完全移除。
    • 如果实例模板定义了键的值,则在应用更改时,系统将在实例上设置实例模板中的值。
  • MINIMAL_ACTION:在将个别实例配置更新应用于实例时,至少执行指定的操作。只有在使用 --update-instance 标志时才能设置 MINIMAL_ACTION。该值必须为以下项之一:

    • none:不执行任何操作。
    • refresh:应用可在不停止实例的情况下应用的更新。
    • restart:停止实例,然后重新启动。
    • replace:重新创建实例。

    如果省略此项,则使用更新所需的中断性最低的操作。

示例

您有一个节点集群 example-cluster,该集群可以 activestandby 模式运行。您使用元数据为集群中的每个虚拟机单独设置模式,例如:mode:active。您还使用 logging 元数据键(可设置为 basicelaborate)来为每个节点配置详细日志记录。每个节点上的应用都使用实例元数据中的值。

实例模板定义了 mode:activelogging:basic 元数据,以用作所有实例的默认值。您已在集群内 node-12 虚拟机的个别实例配置中设置了 logging:elaborate。现在,您希望将 node-12 切换到备用模式,并将此虚拟机的日志记录切换到 basic 模式。

如需将 node-12 实例切换到备用模式并将其日志记录切换到基本模式,请运行以下命令:

gcloud compute instance-groups managed instance-configs update example-cluster \
  --instance node-12 \
  --stateful-metadata mode=standby \
  --remove-stateful-metadata logging

该命令将执行以下操作:

  1. 在与 example-cluster MIG 中的虚拟机 node-12 相关联的个别实例配置中设置 mode:standby 元数据。
  2. node-12 实例的个别实例配置中移除 logging:elaborate 元数据。
  3. 将个别实例配置更改应用于 node-12 虚拟机:
    • 根据配置设置 mode:standby 元数据。
    • 从实例模板设置 logging:basic 元数据,因为 logging 键的值不再由个别实例配置定义。
  4. 默认情况下,更改会立即应用于虚拟机,因为省略了 --no-update-instance 标志。
  5. 虚拟机在更新期间会保持运行状态,因为省略了 --instance-update-minimal-action 标志,并且系统默认为更新选择了中断性最低的操作(在本例中为 refresh)。

API

如需为 MIG 中的现有虚拟机实例单独配置有状态元数据,请在关联的个别实例配置中设置或移除该元数据。然后更新实例以应用配置

如果指定实例尚不存在个别实例配置,请将 instanceGroupManagers.updatePerInstanceConfigs 方法与有状态元数据结合使用:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/NAME/updatePerInstanceConfigs

{
  "perInstanceConfigs": [
    {
      "name": "INSTANCE_NAME",
      "preservedState" : {
        "metadata": {
          "KEY": "VALUE",
          ...
        }
      },
      "fingerprint: "FINGERPRINT"
    },
    ...
  ]
}

如果指定实例已存在个别实例配置,请使用 instanceGroupManagers.patchPerInstanceConfigs 方法

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/NAME/patchPerInstanceConfigs

{
  "perInstanceConfigs": [
    {
      "name": "INSTANCE_NAME",
      "preservedState" : {
        "metadata": {
          "KEY": "VALUE",
          ...
        }
      },
      "fingerprint: "FINGERPRINT"
    },
    ...
  ]
}

请替换以下内容:

  • PROJECT_ID:请求的项目 ID。
  • ZONE:MIG 所在的区域(适用于区域级 MIG)。
    • 对于地区级 MIG,将 zones/ZONE 替换为 regions/REGION 并指定 MIG 所在的地区。
  • NAME:MIG 的名称。
  • INSTANCE_NAME:要为其配置有状态元数据的虚拟机的名称。
  • KEYVALUE:除了在实例模板中定义的任何元数据之外,还要为实例单独设置的有状态元数据键值对。
    • 为实例模板中已存在的键定义的有状态元数据值将替换实例模板中的值。
    • 来自实例模板的其他元数据条目不会受影响且仍然可用。
    • 提供 null 作为值会从个别实例配置中移除键。
  • FINGERPRINT(可选):指定配置的指纹(如果已存在)。用于乐观锁定。

updatePerInstanceConfigspatchPerInstanceConfigs 方法会更新指定个别实例配置,但不会将配置更新应用于关联的虚拟机实例。更改会在您更新或重新创建实例时应用于虚拟机。如需将更改应用于虚拟机,您可以手动应用更新或以主动模式或寻机模式使用更新程序。

示例

您有一个节点集群 example-cluster,该集群可以 activestandby 模式运行。您使用元数据为集群中的每个虚拟机单独设置模式,例如:mode:active。您还使用 logging 元数据键(可设置为 basicelaborate)来为每个节点配置详细日志记录。每个节点上的应用都使用实例元数据中的值。

实例模板定义了 mode:activelogging:basic 元数据,以用作所有实例的默认值。您已在集群内 node-12 虚拟机的个别实例配置中设置了 logging:elaborate。现在,您希望将 node-12 切换到备用模式,并将此实例的日志记录切换到 basic 模式。

如需将 node-12 虚拟机切换到备用模式并将其日志记录切换到基本模式,请使用 patchPerInstanceConfigs 方法修补关联的个别实例配置:

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-cluster/patchPerInstanceConfigs

{
  "perInstanceConfigs": [
    {
      "name": "node-12",
      "preservedState" : {
        "metadata": {
          "mode": "standby",
          "logging": null
        }
      }
    }
  ]
}

该方法将执行以下操作:

  1. 在与 example-cluster MIG 中的虚拟机 node-12 关联的个别实例配置中设置 mode:standby 元数据。
  2. 从个别实例配置中移除 logging:elaborate 元数据,因为提供的值为 null

配置更新尚未应用于 node-12 虚拟机实例。如果下次重新创建或更新实例,或者您使用主动自动更新,系统将应用配置更新。

如需将个别实例配置更新应用于 node-12 虚拟机实例,请为该实例调用 instanceGroupManagers.applyUpdatesToInstances 方法

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-cluster/applyUpdatesToInstances

{
  "instances": ["/zones/us-east1-c/instances/node-12"],
  "minimalAction": "NONE"
}

该方法会将更新后的个别实例配置应用于 node-12 虚拟机:

  1. 根据个别实例配置设置 mode:standby 元数据。
  2. 从实例模板设置 logging:basic 元数据,因为 logging 键的值不再由个别实例配置定义。
  3. 虚拟机会在更新期间保持运行状态,因为 minimalAction 设置为 NONE,这允许 MIG 使用更新所需的中断性最低的操作。实例元数据更新需要执行 REFRESH 操作,这不会中断正在运行的实例。

反馈

我们希望了解有关有状态 MIG 的用例、挑战和反馈。请发送至 mig-discuss@google.com,与我们的团队分享您的反馈。

后续步骤