在 MIG 中应用、查看和移除有状态配置

有状态代管实例组 (MIG) 创建或更新有状态配置后,您可以执行以下操作:

  • 应用有状态配置,使其生效。
  • 查看有状态配置以及代管实例的有效保留状态。
  • 移除有状态配置。

准备工作

将有状态配置应用于代管实例

有状态配置在由您或 MIG 应用后生效。

  • 有状态政策中的配置更改会自动应用于所有代管实例。
  • 您可以手动或自动应用实例配置中的配置更改。

如需详细了解概念性信息,请参阅有状态配置如何应用于代管式实例

应用有状态政策中的配置

有状态政策中的所有配置更改都会自动应用于所有代管实例。更新有状态政策不会中断正在运行的虚拟机 (VM) 实例。

验证是否已应用有状态政策

验证所有虚拟机

验证是否已将有状态政策的更改应用于所有虚拟机,方法是:检查 MIG 在更改之后是否变得稳定

验证特定虚拟机

通过查看代管实例的保留状态并检查有状态政策中的所有磁盘是否都存在于代管实例的 preservedStateFromPolicypreservedStateFromConfig 中,验证有状态政策的更改是否已应用于 MIG 中的特定虚拟机。

应用实例配置中的有状态配置

您可以手动或自动应用新的或更新后的实例配置。请使用以下方法之一:

  • 选择性地将更新后的配置应用于特定实例:使用此方法可控制更新的中断、时间安排和顺序。
  • 通过滚动更新自动应用更新后的配置:使用此方法可以自动滚动的方式将配置更改应用于代管式实例。

如果相关的话,这两种方法都会应用实例配置和未应用的版本或实例模板中未完成的更新。

选择性地将更新后的配置应用于特定实例

如需手动将实例配置应用于特定实例,请按以下步骤操作:

  1. 配置寻机更新政策以防止与自动主动式更新发生争用情况。
  2. 创建或更新实例配置。
  3. 通过选择性地更新特定虚拟机,将更新后的配置应用于这些虚拟机。

或者,您也可以使用以下方法:

  • 使用 gcloud 工具创建或更新实例配置时,请使用 --update-instance 标志将配置立即应用于关联的代管式实例。
  • 手动创建新实例时,请在创建时指定其名称和实例配置。MIG 会在创建虚拟机时立即应用配置。

通过滚动更新自动应用更新后的配置

为您的 MIG 配置主动式滚动更新,以滚动方式自动将配置更新应用于相应的代管式实例。

有状态 MIG 需要对主动式更新政策进行以下配置:

此配置可确保 MIG 重新创建现有的有状态实例,并且不会将其替换为不同实例。

如有可能,您还可以在实例组的更新政策中将最少操作设置为 REFRESH,以确保在不停止实例的情况下应用实例配置的更改。

验证是否已应用实例配置

验证所有单个实例配置

如需验证 MIG 中的所有实例配置是否已应用,请查看 MIG 的有状态情况,然后检查 status.stateful.perInstanceConfigs.allEffective

  • true:实例组中的所有实例配置都已应用且有效,或者实例组没有实例配置。
  • false:实例组至少有一个实例配置无效:您尚未应用配置或者系统正在应用配置。

验证特定的实例配置

如需验证对特定实例配置所做的更改是否已应用于相应的虚拟机,请查看所有实例配置并检查特定的实例配置的 status 字段:

  • UNAPPLIED:实例配置已创建或更新,您需要通过手动更新实例来将配置应用于虚拟机。
  • APPLYING:MIG 目前正在将新的或更新后的实例配置应用于虚拟机。
  • EFFECTIVE:实例配置已成功应用于虚拟机,并且有效。
  • UNAPPLIED_DELETION:实例配置已设置为将要删除。您必须通过手动更新实例来将此更新应用于虚拟机,才能使其生效。
  • DELETING:系统正在删除实例配置,并且正在将更改应用于虚拟机。

查看有状态配置和保留状态

为以下任务获取有状态 MIG 的信息:

  • 验证 MIG 是否包含有状态配置以及此配置是否已应用并且有效。
  • 查看存储在有状态政策中并且对 MIG 中的所有实例都通用的有状态配置。
  • 查看存储在实例配置中并且特定于各个实例的有状态配置,并检查此配置是否已应用并且有效。
  • 根据有状态政策和应用的实例配置,查看 MIG 中每个实例的有效保留状态

查看 MIG 的有状态配置的状态

如果 MIG 具有任何有状态配置(即,有状态政策或至少一个非空的实例配置),则会被视为有状态。

如果您创建有状态政策,则 MIG 会自动应用该政策以使其生效。如果您创建实例配置,则可以决定稍后应用配置。

如需验证 MIG 是否具有有状态配置以及是否应用了实例配置,请使用 gcloud 工具或 Compute Engine API 查看 MIG 的有状态情况。

gcloud

如需验证 MIG 是否具有有状态配置,请运行 gcloud compute instance-groups managed describe 命令以查看其有状态情况。例如:

gcloud compute instance-groups managed describe NAME

baseInstanceName node
...
name example-group
...
status:
  isStable: true
  stateful:
    hasStatefulConfig: true
    perInstanceConfigs:
      allEffective: true
  versionTarget:
    isReached: true
targetSize: 3
...

在此输出中:

  • hasStatefulConfig
    • true:实例组具有有状态配置,即,实例组具有非空的有状态政策或至少一个非空的实例配置。
    • false:不存在有状态配置。
  • perInstanceConfigs.allEffective
    • true:实例组中的所有实例配置都已应用且有效,或者实例组没有实例配置。
    • false:实例组至少有一个实例配置无效:您尚未应用配置或者系统正在应用配置。

API

如需验证 MIG 是否具有有状态配置,请使用 instanceGroupManagers.getregionInstanceGroupManagers.get 方法并检查 status.stateful 字段。例如:

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

该方法会返回 instanceGroupManagers 对象:

{
  "name": "example-group",
  "baseInstanceName": "node",
  ...
  "status": {
    "isStable": true,
    "stateful": {
      "hasStatefulConfig": true,
      "perInstanceConfigs": {
        "allEffective": true
      }
    },
    "versionTarget": {
      "isReached": true
    }
  },
  "targetSize": 3,
  ...
}

在此输出中:

  • hasStatefulConfig
    • true:实例组具有有状态配置,即,实例组具有非空的有状态政策或至少一个非空的实例配置。
    • false:不存在有状态配置。
  • perInstanceConfigs.allEffective
    • true:实例组中的所有实例配置都已应用且有效,或者实例组没有实例配置。
    • false:实例组至少有一个实例配置无效:您尚未应用配置或者系统正在应用配置。

查看 MIG 的有状态政策

使用 gcloud 工具或 Compute Engine API 检查 MIG 的详细信息,查看该组的有状态政策

gcloud

如需查看 MIG 的有状态政策,请运行 gcloud compute instance-groups managed describe 命令。例如:

gcloud compute instance-groups managed describe NAME

baseInstanceName node
...
name example-group
...
statefulPolicy:
  preservedState:
    disks:
      data-disk:
        autoDelete: NEVER
      logs-disk:
        autoDelete: ON_PERMANENT_INSTANCE_DELETION
status:
  isStable: true
  stateful:
    hasStatefulConfig: true
    perInstanceConfigs:
      allEffective: true
  versionTarget:
    isReached: true
targetSize: 3
...

API

如需查看 MIG 的有状态政策,请使用 instanceGroupManagers.getregionInstanceGroupManagers.get 方法并检查 statefulPolicy 字段。例如:

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

该方法会返回 instanceGroupManagers 对象:

{
  "name": "example-group",
  "baseInstanceName": "node",
  ...
  "status": {
      "isStable": true,
      "versionTarget": {
        "isReached": true
      },
      "stateful": {
        "hasStatefulConfig": true,
        "perInstanceConfigs": {
          "allEffective": true
        }
      }
  ...
  "statefulPolicy": {
    "preservedState": {
      "disks": {
        "data-disk": { "autoDelete": "NEVER" },
        "logs-disk": { "autoDelete": "ON_PERMANENT_INSTANCE_DELETION" }
      }
    }
  },
  "targetSize": 3,
  ...
}

查看 MIG 的实例配置

通过列出 MIG 中的所有实例配置可查看实例配置。使用 gcloud 工具或 Compute Engine API。

如果您决定手动应用单个实例配置,则某些单个实例配置可能不会应用于关联的实例,因此实例的保留状态可能不会反映单个实例配置。如需了解详情,请参阅应用单个实例配置以及验证单个实例配置是否已应用

gcloud

运行 gcloud compute instance-groups managed instance-configs list 命令列出 MIG 中的所有实例配置:

gcloud compute instance-groups managed instance-configs list NAME

请替换以下内容:

  • NAME:要列出其中的实例配置的 MIG 的名称

使用标准的 --filter 标志过滤列表。

例如,如需列出 example-group 中的所有实例配置,请运行以下命令:

gcloud compute instance-groups managed instance-configs list example-group
---
fingerprint: JxPvsKOywuY=
name: node-1
preservedState:
  disks:
    data-disk:
      autoDelete: NEVER
      mode: rw
      source: https://www.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/disks/data-disk-1
  metadata:
    role: primary
status: EFFECTIVE
---
fingerprint: IbGmJBqqEkk=
name: node-2
preservedState:
...

API

调用 instanceGroupManagers.listPerInstanceConfigsregionInstanceGroupManagers.listPerInstanceConfigs 方法列出 MIG 中的所有实例配置:

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

请替换以下内容:

  • PROJECT_ID:请求的项目 ID。
  • ZONE:MIG 所在的区域(适用于区域级 MIG)
    • 对于地区级 MIG,将 zones/ZONE 替换为 regions/REGION 并指定 MIG 所在的地区
  • NAME:要列出其中的实例配置的 MIG 的名称

例如,如需列出 example-group 中的所有实例配置,请运行以下命令:

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

该方法会返回实例组中的实例配置列表:

{
  "items": [
    {
      "fingerprint": "JxPvsKOywuY=",
      "preservedState" : {
        "disks": {
          "data-disk" : {
            "source": "https://www.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/disks/data-disk-1",
            "mode": "READ_WRITE",
            "autoDelete": "NEVER"
          }
        },
        "metadata": {
          "role": "primary"
        }
      },
      "name": "node-1",
      "status": "EFFECTIVE"
    },
    {
      "fingerprint": "IbGmJBqqEkk="
      "preservedState" : {
        ...
      }
      "name": "node-2",
      ...
    },
    ...
  ]
}

查看代管实例的保留状态

应用有状态配置后,MIG 会在两个字段中生成并设置每个代管实例的有效保留状态:

  • preservedStateFromPolicy:包含基于有状态政策生成的保留状态,不包括被实例配置覆盖的任何有状态配置。
  • preservedStateFromConfig:包含基于已应用于代管实例的实例配置生成的保留状态。

如需查看 MIG 中每个代管实例的有效保留状态,请使用 gcloud 工具或 Compute Engine API 列出代管实例。

gcloud

使用 gcloud compute instance-groups managed list-instances 命令并查看 PRESERVED_STATE 列中的值,检查哪些代管实例具有保留状态。例如:

gcloud compute instance-groups managed list-instances NAME

NAME    ZONE        STATUS   HEALTH_STATE  ACTION  PRESERVED_STATE  INSTANCE_TEMPLATE  ...
node-1  us-east1-c  RUNNING                NONE    POLICY,CONFIG    example-template
node-2  us-east1-c  RUNNING                NONE    POLICY,CONFIG    example-template

PRESERVED_STATE 列可以包含以下值:

  • POLICY:代管实例具有基于有状态政策的保留状态。
  • CONFIG:代管实例具有基于实例配置的保留状态。
  • 没有值:代管实例没有保留状态,属于无状态实例。

运行 gcloud compute instance-groups managed describe-instance 命令查看特定代管实例的保留状态

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

替换以下内容:

  • INSTANCE_GROUP_NAME:MIG 的名称
  • INSTANCE_NAME:实例组中的代管实例的名称

例如,如需查看 example-group 中的 node-1 代管实例的保留状态,请运行以下代码:

gcloud compute instance-groups managed describe-instance example-group \
  --instance node-1
instance: .../example-project/zones/us-east1-c/instances/node-1
instanceStatus: RUNNING
currentAction: NONE
id: 123456789012345678
version:
  instanceTemplate: .../example-project/global/instanceTemplates/example-template
preservedStateFromPolicy:
  disks:
    data-disk:
      autoDelete: NEVER
      mode: rw
      source: .../example-project/zones/us-east1-c/disks/data-disk-1
preservedStateFromConfig:
  metadata:
    role: primary
    my-key: my-value

API

调用 instanceGroupManagers.listManagedInstancesregionInstanceGroupManagers.listManagedInstances 方法列出代管实例,以查看每个实例的保留状态。

例如,如需列出所有代管实例,请运行以下命令:

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

该方法会返回实例组中的代管实例列表,其中包含有关代管实例保留状态的信息:

{
  "managedInstances": [
    {
      "instance": ".../example-project/zones/us-east1-c/instances/node-1",
      "instanceStatus": "RUNNING",
      "currentAction": "NONE",
      "id": "123456789012345678",
      "version": {
         "instanceTemplate":".../example-project/global/instanceTemplates/example-template"
      },
      "preservedStateFromPolicy": {
        "disks": {
          "data-disk" : {
            "source": "https://www.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/disks/data-disk-1",
            "mode": "rw",
            "autoDelete": "NEVER"
          }
        }
      },
      "preservedStateFromConfig": {
        "metadata": {
          "role": "primary",
          "my-key": "my-value"
        }
      }
    },
    {
      "instance": ".../example-project/zones/us-east1-c/instances/node-2",
      "instanceStatus": "RUNNING",
      ...
      "preservedStateFromPolicy": {
        ...
      },
      "preservedStateFromConfig": {
        ...
      }
    },
    ...
  ]
}

移除有状态配置

在以下场景中,移除有状态配置很有用:

  • 您已将独立的虚拟机迁移到有状态 MIG,现在希望将有状态配置从实例配置迁移到通用的有状态政策。
  • 您已重新设计工作负载,不再需要保留虚拟机实例上的任何状态。
  • 您创建了用于测试目的的有状态配置,现在希望对其进行清理。

本部分介绍了如何完全移除实例配置上的有状态政策。如果您只需要移除有状态政策或实例配置的一部分,请参阅以下部分:

移除有状态政策

移除有状态政策时,您会影响 MIG 中的所有虚拟机。MIG 会将有状态政策中配置的所有有状态资源视为无状态资源,除非这些资源在各个实例的实例配置中也进行了配置。以后重新创建、自动修复或更新实例时,现在的无状态资源可能会丢失其状态:

  • 您可以从实例模板中定义的来源中删除并重新创建磁盘。

如需了解详情,请参阅从有状态政策中移除资源对保留状态有何影响

gcloud

如需从有状态政策中删除所有配置,请运行带有 --remove-stateful-disks 标志的 gcloud compute instance-groups managed update 命令,并列出所有已配置的有状态磁盘的设备名称。

例如,如果您的有状态政策包含设备名称为 data-disklogs-disk 的两个有状态磁盘的配置,请运行以下命令来清除该政策:

gcloud compute instance-groups managed update NAME \
    --remove-stateful-disks data-disk,logs-disk

MIG 会从有状态政策中移除 data-disklogs-disk 配置,并且会自动以异步方式从实例组中所有代管实例的保留状态中移除磁盘,除非磁盘在实例配置中也进行了配置。

API

如需删除有状态政策中的所有配置,请使用 instanceGroupManagers.patchregionInstanceGroupManagers.patch 方法将 statefulPolicy 字段设置为 null

例如,以下调用会移除有状态政策配置:

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

{
  "statefulPolicy": null
}

MIG 会清除有状态政策配置,并且会自动以异步方式从实例组中所有代管实例的保留状态中移除有状态资源,除非资源在实例配置中也进行了配置。

移除特定虚拟机的有状态配置

移除特定虚拟机的有状态配置分为两个步骤:

  1. 删除关联的实例配置。
  2. 将更改应用于代管实例。您可以选择是手动还是自动应用更改。

应用更改后,之前在实例配置中配置的所有有状态项现在被视为无状态项,除非这些项在实例组的有状态政策中也进行了配置。以后重新创建或更新虚拟机时,这些项的状态会丢失:

  • 您可以从实例模板中的磁盘来源分离或重新创建磁盘。
  • 元数据会被移除或重置为实例模板中定义的值。

如需了解详情,请参阅从实例配置中移除项对保留状态有何影响

gcloud

如需完全删除实例配置,请运行 gcloud compute instance-groups managed instance-configs delete 命令

使用可选的 --update-instance 标志将更改立即应用于实例(默认设置)。如果您设置了 --no-update-instance 标志,则系统会在您下次重新创建或更新实例时应用更改。

--instance-update-minimal-action 标志只能与 --update-instance 标志一起使用。

gcloud compute instance-groups managed instance-configs delete INSTANCE_GROUP_NAME \
  --instances INSTANCE_NAME[,INSTANCE_NAME,...] \
  [--no-update-instance | --update-instance] \
  [--instance-update-minimal-action MINIMAL_ACTION

替换以下内容:

  • INSTANCE_GROUP_NAME:MIG 的名称。
  • INSTANCE_NAME:要删除实例配置的实例的名称
  • MINIMAL_ACTION:将实例配置更新应用于虚拟机时要执行的最少操作。此值必须为以下值之一:
    • none:不执行任何操作。
    • refresh:应用可在不停止虚拟机的情况下应用的更新。
    • restart:停止虚拟机,然后重新启动。
    • replace:重新创建虚拟机。

例如,如需删除 example-groupnode-1 的实例配置,请运行以下命令:

gcloud compute instance-groups managed instance-configs delete example-group \
  --instances node-1 \
  --update-instance

MIG 会删除 node-1 的实例配置,并且不再将之前的有状态项视为有状态(因为虚拟机已更新并且配置更改已应用)。

API

如需完全删除一个或多个实例的实例配置,请使用 instanceGroupManagers.deletePerInstanceConfigsregionInstanceGroupManagers.deletePerInstanceConfigs 方法。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/INSTANCE_GROUP_NAME/deletePerInstanceConfigs

{
  "names": ["INSTANCE_NAME",...]
}

请替换以下内容:

  • PROJECT_ID:请求的项目 ID。
  • ZONE:MIG 所在的区域(适用于区域级 MIG)
    • 对于地区级 MIG,将 zones/ZONE 替换为 regions/REGION 并指定 MIG 所在的地区
  • INSTANCE_GROUP_NAME:MIG 的名称
  • INSTANCE_NAME:要删除实例配置的实例的名称

deletePerInstanceConfig 方法会删除指定的实例配置,但不会将更改应用于关联的虚拟机。更改会在您重新创建或更新实例时应用于虚拟机。手动更新选定的虚拟机以应用更改。

例如,如需删除 example-groupnode-1 的实例配置,请调用以下方法:

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

{
  "names": ["node-1"]
}

该方法会从 example-group 中删除 node-1 实例的实例配置。重新创建或更新代管实例时,更改将应用于该实例。

如需应用配置更改,请调用 instanceGroupManagers.applyUpdatesToInstances 方法

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

{
  "instances": ["/zones/us-east1-c/instances/node-1"]
}

该方法会从代管实例的保留状态中移除有状态项。

后续步骤