为有状态托管式实例组 (MIG) 创建或更新有状态配置后,您可以执行以下操作:
准备工作
- 参阅何时使用有状态 MIG 以及有状态 MIG 的工作原理。
-
设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 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
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Set a default region and zone.
- 有状态政策中的配置更改会自动应用于所有代管实例。
- 您可以手动或自动应用实例配置中的配置更改。
- 选择性地将更新后的配置应用于特定实例:使用此方法可控制更新的中断、时间安排和顺序。
- 通过滚动更新自动应用更新后的配置:使用此方法可以自动滚动的方式将配置更改应用于代管式实例。
- 使用 gcloud CLI 创建或更新实例配置时,请使用
--update-instance
标志将配置立即应用于关联的代管式实例。 - 手动创建新实例时,请在创建时指定其名称和实例配置。MIG 会在创建虚拟机时直接应用配置。
- 您必须将替换方法设置为
RECREATE
。 - 您必须将超额配置数量上限设置为
0
。 - 对于区域级 MIG,您必须跨可用区停用主动式实例重新分布功能。
true
:实例组中的所有实例配置都已应用且有效,或者实例组没有实例配置。false
:实例组至少有一个实例配置无效:您尚未应用配置或者系统正在应用配置。UNAPPLIED
:实例配置已创建或更新,您需要通过手动更新实例来将配置应用于虚拟机。APPLYING
:MIG 目前正在将新的或更新后的实例配置应用于虚拟机。EFFECTIVE
:实例配置已成功应用于虚拟机,并且有效。UNAPPLIED_DELETION
:实例配置已设置为将要删除。您必须通过手动更新实例来将此更新应用于虚拟机,才能使其生效。DELETING
:系统正在删除实例配置,并且正在将更改应用于虚拟机。- 验证 MIG 是否包含有状态配置以及此配置是否已应用并且有效。
- 查看存储在有状态政策中并且对 MIG 中的所有实例都通用的有状态配置。
- 查看存储在实例配置中并且特定于各个实例的有状态配置,并检查此配置是否已应用并且有效。
- 根据有状态政策和应用的实例配置,查看 MIG 中每个实例的有效保留状态。
hasStatefulConfig
:true
:实例组具有有状态配置,即,实例组具有非空的有状态政策或至少一个非空的实例配置。false
:不存在有状态配置。
perInstanceConfigs.allEffective
:true
:实例组中的所有实例配置都已应用且有效,或者实例组没有实例配置。false
:实例组至少有一个实例配置无效:您尚未应用配置或者系统正在应用配置。
hasStatefulConfig
:true
:实例组具有有状态配置,即,实例组具有非空的有状态政策或至少一个非空的实例配置。false
:不存在有状态配置。
perInstanceConfigs.allEffective
:true
:实例组中的所有实例配置都已应用且有效,或者实例组没有实例配置。false
:实例组至少有一个实例配置无效:您尚未应用配置或者系统正在应用配置。
在 Google Cloud 控制台中,转到实例组页面。
点击您要查看有状态政策所属的实例组的名称。
点击详细信息标签页。
有状态资源下列出了有状态政策中的所有资源。
NAME
:要列出其中的实例配置的 MIG 的名称PROJECT_ID
:请求的项目 ID。ZONE
:MIG 所在的区域(适用于区域级 MIG)- 对于地区级 MIG,将
zones/ZONE
替换为regions/REGION
并指定 MIG 所在的地区
- 对于地区级 MIG,将
NAME
:要列出其中的实例配置的 MIG 的名称preservedStateFromPolicy
:包含基于有状态政策生成的保留状态,不包括被实例配置覆盖的任何有状态配置。preservedStateFromConfig
:包含基于已应用于代管实例的实例配置生成的保留状态。POLICY
:代管实例具有基于有状态政策的保留状态。CONFIG
:代管实例具有基于实例配置的保留状态。- 没有值:代管实例没有保留状态,属于无状态实例。
INSTANCE_GROUP_NAME
:MIG 的名称INSTANCE_NAME
:实例组中的代管实例的名称- 您已将独立的虚拟机迁移到有状态 MIG,现在希望将有状态配置从实例配置迁移到通用的有状态政策。
- 您已重新设计工作负载,不再需要保留虚拟机实例上的任何状态。
- 您创建了用于测试目的的有状态配置,现在希望对其进行清理。
- 对于 MIG 中的所有虚拟机,将之前的有状态永久性磁盘声明为无状态永久性磁盘。
- 对于 MIG 中的所有虚拟机,将之前的有状态网络接口声明为无状态网络接口。
- 对于 MIG 中的特定虚拟机,分离有状态磁盘或者将有状态磁盘声明为无状态磁盘。
- 从 MIG 中的特定虚拟机移除有状态元数据
- 将静态 IP 地址与 MIG 中的特定虚拟机取消关联。
- 您可以从实例模板中定义的来源中删除并重新创建磁盘。
- IP 地址可能会发生变化。
--remove-stateful-disks
,并列出所有已配置的有状态磁盘的设备名称。--remove-stateful-internal-ips
,并列出所有已配置的有状态内部 IP 地址的网络接口名称。--remove-stateful-external-ips
,并列出所有已配置的有状态外部 IP 地址的网络接口名称。- 删除关联的实例配置。
- 将更改应用于代管实例。您可以选择是手动还是自动应用更改。
- 您可以从实例模板中的磁盘来源分离或重新创建磁盘。
- 元数据会被移除或重置为实例模板中定义的值。
- IP 地址可能会发生变化。
INSTANCE_GROUP_NAME
:MIG 的名称。INSTANCE_NAME
:要删除实例配置的实例的名称MINIMAL_ACTION
:将实例配置更新应用于虚拟机时要执行的最少操作。此值必须为以下值之一:none
:不执行任何操作。refresh
:应用可在不停止虚拟机的情况下应用的更新。restart
:停止虚拟机,然后重新启动。replace
:重新创建虚拟机。
PROJECT_ID
:请求的项目 ID。ZONE
:MIG 所在的区域(适用于区域级 MIG)- 对于地区级 MIG,将
zones/ZONE
替换为regions/REGION
并指定 MIG 所在的地区
- 对于地区级 MIG,将
INSTANCE_GROUP_NAME
:MIG 的名称INSTANCE_NAME
:要删除实例配置的实例的名称- 配置有状态 MIG。
- 获取有关特定 MIG 及其代管实例的信息,包括虚拟机状态和属性。
- 详细了解有状态 MIG。
- 详细了解 MIG 以及如何使用代管实例。
REST
如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证。
将有状态配置应用于托管实例
有状态配置在由您或 MIG 应用后生效。
如需详细了解概念性信息,请参阅有状态配置如何应用于代管式实例。
应用有状态政策中的配置
有状态政策中的所有配置更改都会自动应用于所有代管实例。更新有状态政策不会中断正在运行的虚拟机 (VM) 实例。
验证是否已应用有状态政策
验证所有虚拟机
验证是否已将有状态政策的更改应用于所有虚拟机,方法是:检查 MIG 在更改之后是否变得稳定。
验证特定虚拟机
通过查看托管实例的保留状态并检查有状态政策中的所有磁盘是否都存在于托管实例的
preservedStateFromPolicy
或preservedStateFromConfig
中,验证有状态政策的更改是否已应用于 MIG 中的特定虚拟机。应用实例配置中的有状态配置
您可以手动或自动应用新的或更新后的实例配置。请使用以下方法之一:
如果相关的话,这两种方法都会应用实例配置和未应用的版本或实例模板中未完成的更新。
选择性地将更新后的配置应用于特定实例
如需手动将实例配置应用于特定实例,请按以下步骤操作:
或者,您也可以使用以下方法:
通过滚动更新自动应用更新后的配置
为您的 MIG 配置主动式滚动更新,以滚动方式自动将配置更新应用于相应的托管式实例。
有状态 MIG 需要对主动式更新政策进行以下配置:
此配置可确保 MIG 重新创建现有的有状态实例,并且不会将其替换为其他实例。
如有可能,您还可以在实例组的更新政策中将最少操作设置为
REFRESH
,以确保在不停止实例的情况下应用实例配置的更改。验证是否已应用实例配置
验证所有单个实例配置
如需验证 MIG 中的所有实例配置是否已应用,请查看 MIG 的有状态情况,然后检查
status.stateful.perInstanceConfigs.allEffective
:验证特定的实例配置
如需验证对特定实例配置所做的更改是否已应用于相应的虚拟机,请查看所有实例配置并检查特定的实例配置的
status
字段:查看有状态配置和保留状态
为以下任务获取有状态 MIG 的信息:
查看 MIG 的有状态配置的状态
如果 MIG 具有任何有状态配置(即,有状态政策或至少一个非空的实例配置),则会被视为有状态。
如果您创建有状态政策,则 MIG 会自动应用该政策以使其生效。如果您创建实例配置,则可以决定稍后应用配置。
如需验证 MIG 是否具有有状态配置以及是否应用了单个实例配置,请使用 gcloud CLI 或 REST 查看 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 ...
在此输出中:
REST
如需验证 MIG 是否具有有状态配置,请使用
instanceGroupManagers.get
或regionInstanceGroupManagers.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, ... }
在此输出中:
查看 MIG 的有状态政策
通过使用 Google Cloud 控制台、gcloud CLI 或 REST 检查 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 internalIPs: nic0: autoDelete: ON_PERMANENT_INSTANCE_DELETION externalIPs: nic0: autoDelete: NEVER status: isStable: true stateful: hasStatefulConfig: true perInstanceConfigs: allEffective: true versionTarget: isReached: true targetSize: 3 ...
REST
如需查看 MIG 的有状态政策,请使用
instanceGroupManagers.get
或regionInstanceGroupManagers.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" } }, "internalIPs": { "nic0" : { "autoDelete": "ON_PERMANENT_INSTANCE_DELETION"} }, "externalIPs": { "nic0" : { "autoDelete": "NEVER"} }, } }, "targetSize": 3, ... }
查看 MIG 的实例配置
通过列出 MIG 中的所有实例配置可查看实例配置。使用 gcloud CLI 或 REST。
如果您决定手动应用单个实例配置,则某些单个实例配置可能不会应用于关联的实例,因此实例的保留状态可能不会反映单个实例配置。如需了解详情,请参阅应用单个实例配置以及验证单个实例配置是否已应用
gcloud
运行
gcloud compute instance-groups managed instance-configs list
命令列出 MIG 中的所有实例配置。gcloud compute instance-groups managed instance-configs list NAME
替换以下内容:
使用标准的
--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 internalIPs: nic0: ipAddress: address: /projects/example-project/regions/us-east1/addresses/node-1-int-ip autoDelete: ON_PERMANENT_INSTANCE_DELETION externalIPs: nic0: ipAddress: literal: 130.211.181.55 autoDelete: NEVER status: EFFECTIVE --- fingerprint: IbGmJBqqEkk= name: node-2 preservedState: ...
REST
调用
instanceGroupManagers.listPerInstanceConfigs
或regionInstanceGroupManagers.listPerInstanceConfigs
方法列出 MIG 中的所有实例配置。POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/NAME/listPerInstanceConfigs
替换以下内容:
例如,如需列出
example-group
中的所有实例配置,请运行以下命令:POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-group/listPerInstanceConfigs
该方法会返回实例组中的实例配置列表:
{ "items": [ { "fingerprint": "JxPvsKOywuY=", "name": "node-1", "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" }, "internalIPs": { "nic0" : { "ipAddress" : { "address": "/projects/example-project/regions/us-east1/addresses/node-1-int-ip" }, "autoDelete": "ON_PERMANENT_INSTANCE_DELETION" } }, "externalIPs": { "nic0": { "ipAddress" : { "literal": "54.2.3.4" }, "autoDelete": "NEVER" } } }, "status": "EFFECTIVE" }, { "fingerprint": "IbGmJBqqEkk=", "name": "node-2", "preservedState" : { ... } ... }, ... ] }
查看代管实例的保留状态
应用有状态配置后,MIG 会在两个字段中生成并设置每个代管实例的有效保留状态:
如需查看 MIG 中每个托管式实例的有效保留状态,请使用 gcloud CLI 或 REST 列出托管式实例。
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
列可以包含以下值:运行
gcloud compute instance-groups managed describe-instance
命令,查看特定代管实例的保留状态。gcloud compute instance-groups managed describe-instance INSTANCE_GROUP_NAME \ --instance 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 internalIPs: nic0: ipAddress: literal: 10.0.0.1 address: .../example-project/regions/us-east1/addresses/node-1-int-ip autoDelete: ON_PERMANENT_INSTANCE_DELETION preservedStateFromConfig: metadata: role: primary my-key: my-value externalIPs: nic0: ipAddress: literal: 130.211.181.55 address: .../example-project/regions/us-east1/addresses/node-1-nat-ip autoDelete: NEVER
REST
调用
instanceGroupManagers.listManagedInstances
或regionInstanceGroupManagers.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" }, }, "internalIPs": { "nic0" : { "ipAddress": { "literal": "10.0.0.1", "address": "/projects/example-project/regions/us-east1/addresses/node-1-int-ip" }, "autoDelete": "ON_PERMANENT_INSTANCE_DELETION" } }, }, "preservedStateFromConfig": { "metadata": { "role": "primary", "my-key": "my-value" }, "externalIPs": { "nic0": { "ipAddress": { "literal": "130.211.181.55", "address": "/projects/example-project/regions/us-east1/addresses/node-1-nat-ip" }, "autoDelete": "NEVER" } }, } }, { "instance": ".../example-project/zones/us-east1-c/instances/node-2", "instanceStatus": "RUNNING", ... "preservedStateFromPolicy": { ... }, "preservedStateFromConfig": { ... } }, ... ] }
查看关联的静态 IP 地址资源
如需检索分配给 MIG 中的托管实例的静态 IP 地址(
Address
资源),请查看这些资源的保留状态。您可以在ipAddress.address
字段中查看静态地址。如果 MIG 或实例不再存在,但 IP 地址预留仍然存在,您可以列出静态内部或外部地址预留。
移除有状态配置
在以下场景中,移除有状态配置很有用:
本部分介绍了如何完全移除实例配置上的有状态政策。如果您只需要移除有状态政策或实例配置的一部分,请参阅以下部分:
移除有状态政策
移除有状态政策时,您会影响 MIG 中的所有虚拟机。MIG 会将有状态政策中配置的所有有状态资源视为无状态资源,除非这些资源在各个实例的实例配置中也进行了配置。以后重新创建、自动修复或更新实例时,现在的无状态资源可能会丢失其状态:
如需了解概念信息,请参阅从有状态政策中移除资源对保留状态有何影响。
gcloud
如需从有状态政策中删除所有配置,请运行带有适用标志的
gcloud compute instance-groups managed update
命令。 适用的标志如下所示:例如,如果您的有状态政策包含设备名称为
data-disk
和logs-disk
的两个有状态磁盘的配置,并包含nic0
网络接口中的有状态内部和外部 IP 地址的配置,请运行以下命令来清除该政策:gcloud compute instance-groups managed update example-group \ --zone us-east1-c \ --remove-stateful-disks data-disk,logs-disk \ --remove-stateful-internal-ips nic0 \ --remove-stateful-external-ips nic0
MIG 会从其有状态政策中移除
data-disk
和logs-disk
有状态配置,并移除nic0
网络接口的有状态内部和外部 IP 配置。因此,除非磁盘或 IP 地址也是在实例配置中配置的,否则 MIG 会自动以异步方式从实例组中所有代管实例的保留状态中移除这些磁盘和静态 IP 地址。REST
如需删除有状态政策中的所有配置,请使用
instanceGroupManagers.patch
或regionInstanceGroupManagers.patch
方法将statefulPolicy
字段设置为null
方法。例如,以下调用会移除有状态政策配置:
PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/NAME { "statefulPolicy": null }
MIG 会清除有状态政策配置,并且会自动以异步方式从实例组中所有代管实例的保留状态中移除有状态资源,除非资源在实例配置中也进行了配置。
移除特定虚拟机的有状态配置
移除特定虚拟机的有状态配置分为两个步骤:
应用更改后,之前在实例配置中配置的所有有状态项现在被视为无状态项,除非这些项在实例组的有状态政策中也进行了配置。以后重新创建或更新虚拟机时,这些项的状态会丢失:
如需了解详情,请参阅从实例配置中移除项对保留状态有何影响。
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]
替换以下内容:
例如,如需删除
example-group
中node-1
的实例配置,请运行以下命令:gcloud compute instance-groups managed instance-configs delete example-group \ --instances node-1 \ --update-instance
MIG 会删除
node-1
的实例配置,并且不再将之前的有状态项视为有状态(因为虚拟机已更新并且配置更改已应用)。REST
如需完全删除一个或多个实例的实例配置,请使用
instanceGroupManagers.deletePerInstanceConfigs
或regionInstanceGroupManagers.deletePerInstanceConfigs
方法。POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/INSTANCE_GROUP_NAME/deletePerInstanceConfigs { "names": ["INSTANCE_NAME",...] }
替换以下内容:
deletePerInstanceConfig
方法会删除指定的实例配置,但不会将更改应用于关联的虚拟机。更改会在您重新创建或更新实例时应用于虚拟机。手动更新选定的虚拟机以应用更改。例如,如需删除
example-group
中node-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"] }
该方法会从代管实例的保留状态中移除有状态项。
反馈
我们希望了解有关有状态 MIG 的用例、挑战和反馈。请发送至 mig-discuss@google.com,与我们的团队分享您的反馈。
后续步骤
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2024-11-25。
-