通过将永久性磁盘配置为有状态,您可以利用虚拟机实例自动修复功能和自动更新功能,同时保留磁盘的状态。
您可以针对代管实例组 (MIG) 中的所有实例将实例模板中定义的任何磁盘配置为有状态,方法是将相应磁盘的设备名称添加到 MIG 的有状态政策。
您还可以通过设置实例配置为 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.
- 如果您的 MIG 采用有状态配置,则您无法使用自动扩缩功能。
- 如果您要使用自动滚动更新,则必须将替换方法设置为
RECREATE
。 - 对于有状态区域级 MIG,必须停用主动式重新分布功能(将重新分布类型设置为
NONE
),以防止通过自动跨可用区重新分布删除有状态实例。 如果您使用所有实例配置来替换实例模板属性,则无法在任何每个实例配置中指定这些属性,同时也无法在组的所有实例配置中指定这些属性。
有状态的区域级 MIG 不会自动协调跨可用区故障切换。使用地区级 MIG 时,通过将冗余副本部署到多个区域并依赖应用的数据复制功能,使有状态应用对于区域性故障具有恢复能力。
- 可以通过从原始映像重新创建启动磁盘来修复已损坏的启动磁盘。自动修复功能会自动进行此类修复。
- 您可以使用新版本和安全补丁程序将启动磁盘更新为最新映像。
- 在创建 MIG 时配置有状态磁盘。
- 为现有 MIG 中的磁盘设置或更新有状态配置。
- 从 MIG 中移除有状态磁盘。
在 Google Cloud 控制台中,转到实例组页面。
选择您的项目并点击继续。
点击创建实例组。
选择新建代管式实例组(有状态)。
为该实例组指定名称。
选择实例模板。如果没有可用的模板,请创建实例模板。
在实例数下方,指定实例组的实例数。
有状态配置部分显示实例模板中指定的磁盘。点击磁盘以修改其有状态配置。
- 在有状态下方,选择是。
在永久性实例删除时下拉列表中,选择在删除虚拟机实例后要对有状态磁盘执行的操作。可用的选项包括:
- 分离磁盘(默认):永不删除磁盘;而是在删除磁盘虚拟机后分离磁盘。
- 删除磁盘:从实例组永久删除有状态磁盘的虚拟机时(例如,手动删除代管式实例或减小实例组大小时),删除该有状态磁盘。
完成有状态配置后,点击完成。
点击创建。
INSTANCE_GROUP_NAME
:要创建的代管实例组的名称。INSTANCE_TEMPLATE
:创建实例时要使用的实例模板的名称。SIZE
:您所需的该实例组初始虚拟机数。DEVICE_NAME
:实例模板中指定的磁盘的设备名称。DELETE_RULE
:用于设置在删除虚拟机后应如何处理有状态磁盘的值。可用的选项包括:never
:(默认值)永不删除磁盘;而是在删除磁盘虚拟机后分离磁盘。on-permanent-instance-deletion
:从实例组永久删除磁盘的虚拟机实例时(例如,手动删除代管实例或减小实例组大小时),删除该磁盘。
无论删除规则的值如何,有状态磁盘在虚拟机自动修复、更新和重新创建操作时始终会保留。
创建一个实例模板,使其包含基于映像
img-example-db-v01
的无状态启动磁盘(预装有操作系统和数据库)和有状态数据磁盘:gcloud compute instance-templates create example-database-template-v01 \ --image img-example-db-v01 \ --create-disk device-name=data-disk,mode=rw,image=empty10GBext4
--create-disk
标志指示 MIG 执行以下操作:- 通过预先准备的空 ext4 映像为每个虚拟机实例创建一个新的 10 GB 磁盘。
- 使用设备名称
data-disk
以读写模式将该磁盘挂接到其虚拟机。
从该实例模板创建 MIG 并将数据磁盘定义为有状态:
gcloud compute instance-groups managed create example-database-group \ --template example-database-template-v01 \ --base-instance-name shard \ --size 12 \ --stateful-disk device-name=data-disk,auto-delete=on-permanent-instance-deletion
设备名称
data-disk
取自该实例模板。当虚拟机被永久删除时(由于手动删除实例或由于手动减小实例组大小),系统会将数据磁盘配置为与虚拟机实例一起删除。数据磁盘在自动修复、更新和虚拟机重新创建时会保留。验证是否已在有状态政策中配置数据磁盘:
gcloud compute instance-groups managed describe example-database-group baseInstanceName: shard ... name: example-database-group ... statefulPolicy: preservedState: disks: data-disk: autoDelete: ON_PERMANENT_INSTANCE_DELETION ...
您可以看到,有状态政策将设备名称为
data-disk
的磁盘声明为有状态,并规定在永久删除虚拟机时删除此类磁盘。PROJECT
:请求的项目 ID。ZONE
:MIG 所在的区域(适用于区域级 MIG)。- 对于地区级 MIG,将
zones/ZONE
替换为regions/REGION
并指定 MIG 所在的地区。
- 对于地区级 MIG,将
NAME
:要创建的 MIG 的名称。TEMPLATE
:创建实例时要使用的实例模板的名称。SIZE
:您所需的该实例组初始实例数。DEVICE_NAME
:实例模板中指定的磁盘的设备名称。DELETE_RULE
:用于设置在删除虚拟机实例后应如何处理有状态磁盘的值。可用的选项包括:never
:(默认值)永不删除磁盘;而是在删除磁盘虚拟机后分离磁盘。on_permanent_instance_deletion
:从实例组永久删除有状态磁盘的虚拟机时(例如,手动删除代管实例或减小实例组大小时),删除该有状态磁盘。
使用
instanceTemplates.insert
方法创建一个实例模板,使其包含基于映像img-example-db-v01
的无状态启动磁盘(预装有操作系统和数据库)和有状态数据磁盘:POST https://compute.googleapis.com/compute/v1/projects/example-project/global/instanceTemplates { "name": "example-database-template-v01", "properties": { "machineType":"e2-standard-2", "disks": [ { "boot": true, "deviceName": "boot-disk", "initializeParams": { "sourceImage": "projects/example-project/global/images/mg-example-db-v01" } }, { "deviceName": "data-disk", "mode": "READ_WRITE", "initializeParams": { "sourceImage": "projects/example-project/global/images/empty10GBext4" } } ], "networkInterfaces": [ { "network": "global/networks/default" } ] } }
该实例模板中的数据磁盘的设备名称为
data-disk
,配置为通过预先准备的空 ext4 映像创建,并以读写模式挂接。使用
instanceGroupManagers.insert
方法从该实例模板创建 MIG 并将数据磁盘定义为有状态:POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers { "name": "example-database-group", "baseInstanceName": "shard", "versions": [ { "instanceTemplate": "global/instanceTemplates/example-database-template-v01" } ], "targetSize": 12, "statefulPolicy": { "preservedState": { "disks": { "data-disk": {"autoDelete": "ON_PERMANENT_INSTANCE_DELETION" } } } } }
MIG 会创建 12 个实例,每个实例均有一个具有以下属性的磁盘:
- 取自实例模板的设备名称
data-disk
。 - 删除虚拟机时(由于手动删除实例或由于手动减小实例组大小)删除数据磁盘的删除规则。
- 每个代管实例的政策中处于保留状态的条目 (
preservedStateFromPolicy
),以便数据磁盘在自动修复、更新和实例重新创建时会保留。
- 取自实例模板的设备名称
使用
instanceGroupManagers.get
方法验证是否已在新的instanceGroupManagers
资源的有状态政策中配置数据磁盘:GET https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-database-group
{ "name": "example-database-group", "baseInstanceName": "shard", ... "statefulPolicy": { "preservedState": { "disks": { "data-disk": {"autoDelete": "ON_PERMANENT_INSTANCE_DELETION" } } } } ... }
您可以看到,有状态政策将设备名称为
data-disk
的磁盘声明为有状态,并规定在永久删除实例时删除此类磁盘。- 将实例模板中定义的磁盘添加到现有 MIG 的有状态政策,以将其声明为有状态。这会针对该 MIG 中所有现有和未来的实例将具有给定设备名称的磁盘标记为有状态。
- 更新有状态政策以更改磁盘的有状态配置。
在 Google Cloud 控制台中,转到实例组页面。
点击您要在其中其指定磁盘有状态配置的实例组的名称。
点击修改以修改此代管式实例组。
在有状态配置下,展开要设为有状态磁盘的磁盘。
- 在有状态下方,选择是。
在永久性实例删除时下拉列表中,选择在删除虚拟机实例后要对有状态磁盘执行的操作。
- 分离磁盘(默认):永不删除磁盘;而是在删除磁盘虚拟机后分离磁盘。
删除磁盘:从实例组永久删除有状态磁盘的虚拟机时(例如,手动删除代管式实例或减小实例组大小时),删除该有状态磁盘。
更新有状态配置后,点击完成。
点击保存以完成更新。
NAME
:要更新的托管实例组的名称。DEVICE_NAME
:实例模板中指定的磁盘设备名称。DELETE_RULE
:用于设置在删除虚拟机实例后应如何处理有状态磁盘的值。可用的选项包括:never
:(默认值)永不删除磁盘;而是在删除磁盘实例后分离磁盘。on-permanent-instance-deletion
:从实例组永久删除有状态磁盘的实例时(例如,手动删除代管实例或减小实例组大小时),删除该有状态磁盘。
更新 MIG 以使用以下命令将数据磁盘定义为有状态:
gcloud compute instance-groups managed update example-database-group \ --stateful-disk device-name=data-disk,auto-delete=never
因此,MIG 会将有状态政策配置更新自动且异步地应用于所有实例的数据磁盘。现在,数据磁盘在自动修复、更新和实例重新创建时会保留,并且由于
auto-delete
规则设置为never
,数据磁盘在实例删除时会分离。通过运行
gcloud compute instance-groups managed describe example-database-group
命令来验证是否已在有状态政策中配置数据磁盘。PROJECT
:请求的项目 ID。ZONE
:MIG 所在的区域(适用于区域级 MIG)。- 对于地区级 MIG,将
zones/ZONE
替换为regions/REGION
并指定 MIG 所在的地区。
- 对于地区级 MIG,将
NAME
:要更新的 MIG 的名称。DEVICE_NAME
:实例模板中指定的要更新有状态配置的磁盘的设备名称。DELETE_RULE
:用于设置在删除虚拟机实例后应如何处理有状态磁盘的值。可用的选项包括:never
:(默认值)永不删除磁盘;而是在删除磁盘实例后分离磁盘。on-permanent-instance-deletion
:从实例组永久删除有状态磁盘的实例时(例如,手动删除实例或减小实例组大小时),删除该有状态磁盘。
修补 MIG 以将数据磁盘定义为有状态:
PATCH https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-database-group { "statefulPolicy": { "preservedState": { "disks": { "data-disk": {"autoDelete": "NEVER" } } } } }
MIG 会将该有状态配置自动且异步地应用于所有实例的数据磁盘。数据磁盘在自动修复、更新和实例重新创建时会保留。由于
autoDelete
规则设置为NEVER
,因此数据磁盘在实例删除时会分离。通过查看
instanceGroupManagers.get
方法返回的instanceGroupManagers
资源,验证是否已在有状态政策中配置数据磁盘。- 在您要重新设计应用架构以将状态移出磁盘时。
- 在您误将磁盘配置为有状态并想要将其还原时。
在 Google Cloud 控制台中,转到实例组页面。
点击您要从其中移除磁盘有状态配置的实例组的名称。
点击修改以修改此代管式实例组。
在有状态配置下,展开您要设为无状态磁盘的有状态磁盘。
- 将有状态选项更改为否。
- 点击完成。
完成更改后,点击保存。
NAME
:要更新的 MIG 的名称。DEVICE_NAME
:要从有状态政策中移除并视为无状态的磁盘的设备名称。您可以在列表中提供一个或多个设备名称。PROJECT
:请求的项目 ID。ZONE
:MIG 所在的区域(适用于区域级 MIG)。- 对于地区级 MIG,将
zones/ZONE
替换为regions/REGION
并指定 MIG 所在的地区。
- 对于地区级 MIG,将
NAME
:要更新的 MIG 的名称。DEVICE_NAME
:要从有状态政策中移除的磁盘的设备名称。提供null
值会导致移除该磁盘的有状态配置。您可以提供一个或多个要移除的设备名称。- 从有状态政策中移除磁盘的有状态配置。这会使具有给定设备名称的磁盘无状态。
- 如果您仍想保留这些磁盘,请将其与虚拟机分离。
- 发布不再定义具有给定设备名称的磁盘的新实例模板。
- 将现有工作负载(现有磁盘)从独立虚拟机迁移到有状态 MIG,以便从自动修复和易于更新中获益。
- 恢复为虚拟机单独配置的磁盘备份。
- 将其他有状态磁盘临时挂接到特定虚拟机,以测试、调试或复制数据。
- 为所有虚拟机实例创建具有通用配置的实例模板。
- 将数据磁盘与独立实例分离并删除这些实例。如果启动磁盘包含应保留的状态,您也可以分离启动磁盘。
- 使用先前创建的实例模板创建一个空 MIG。
在该 MIG 中创建使用上一步中的相应名称和关联磁盘的实例。该 MIG 会响应您的请求,并执行以下操作:
- 使用提供的实例名称从实例模板创建虚拟机。
- 地区级 MIG 会在磁盘所在的区域中创建虚拟机。如果磁盘是地区磁盘,则地区级 MIG 会在磁盘的任何副本区域中创建虚拟机。
- 使用为磁盘提供的有状态配置创建实例配置。
- 将磁盘挂接到新实例。
- 使用提供的实例名称从实例模板创建虚拟机。
NAME
:您需要在其中创建实例的 MIG 的名称。VM_NAME
:要创建的新实例的名称。ZONE
:MIG 所在的区域(适用于区域级 MIG)。REGION
:MIG 所在的地区(适用于地区级 MIG)。DEVICE_NAME
:要在挂接磁盘时使用的设备名称。DISK
:要以projects/project-id/zones/zone/disks/disk-name
格式(对于区域磁盘)或projects/project-id/regions/region/disks/disk-name
格式(对于地区磁盘)挂接到指定DEVICE_NAME
下的现有永久性磁盘的 URI。MODE
:指定磁盘的模式。支持的选项包括:ro
:只读。rw
:(默认值)。读写。
DELETE_RULE
:用于设置在删除虚拟机实例后应如何处理有状态磁盘的值。可用的选项包括:never
:(默认值)永不删除磁盘;而是在删除磁盘实例后分离磁盘。on-permanent-instance-deletion
:从实例组永久删除有状态磁盘的实例时(例如,手动删除实例或减小实例组大小时),删除该有状态磁盘。
无论删除规则的值如何,有状态磁盘在虚拟机自动修复、更新和重新创建操作时始终会保留。
- 在维护期内停止虚拟机
db-instance
。 - 使用
db-instance
配置创建一个实例模板(名为db-template
)。 - 将
db-data-disk-1
与db-instance
分离并删除db-instance
。 - 通过
db-template
创建一个空 MIGexample-database-mig
并配置自动修复功能。 创建一个使用原始
db-instance
名称的代管实例,并挂接db-data-disk-1
作为有状态磁盘:gcloud compute instance-groups managed create-instance example-database-mig \ --instance db-instance \ --zone us-east1-c \ --stateful-disk device-name=data-disk,source=projects/example-project/zones/us-east1-c/disks/db-data-disk-1,auto-delete=never
该命令会在 MIG 中创建实例
db-instance
以及创建对应的具有db-data-disk-1
有状态磁盘的实例配置,并使用data-disk
作为设备名称将该磁盘挂接到新虚拟机。PROJECT_ID
:请求的项目 ID。ZONE
:MIG 所在的区域(适用于区域级 MIG)。- 对于地区级 MIG,将
zones/ZONE
替换为regions/REGION
并指定 MIG 所在的地区。
- 对于地区级 MIG,将
NAME
:要在其中创建实例的 MIG 的名称。VM_NAME
:要创建的实例的名称。DEVICE_NAME
:要在挂接磁盘时使用的设备名称。DISK
:要以projects/project-id/zones/zone/disks/disk-name
格式(对于区域磁盘)或projects/project-id/regions/region/disks/disk-name
格式(对于地区磁盘)挂接到指定DEVICE_NAME
下的现有永久性磁盘的 URI。MODE
:指定磁盘的模式。支持的选项包括:READ_ONLY
:只读。READ_WRITE
:(默认值)。读写。
DELETE_RULE
:用于设置在删除虚拟机后应如何处理有状态磁盘的值。可用的选项如下所示:never
:(默认值)永不删除磁盘;而是在删除磁盘虚拟机后分离磁盘。on-permanent-instance-deletion
:从实例组永久删除有状态磁盘的实例时(例如,手动删除实例或减小实例组大小时),删除该有状态磁盘。
无论删除规则的值如何,有状态磁盘在虚拟机自动修复、更新和重新创建操作时始终会保留。
- 在维护期内停止虚拟机
db-instance
。 - 使用
db-instance
配置创建一个实例模板(名为db-template
)。 - 将
db-data-disk-1
与db-instance
分离并删除db-instance
。 - 通过
db-template
创建一个空 MIGexample-database-mig
并配置自动修复功能。 创建一个使用原始
db-instance
名称的实例,并挂接db-data-disk-1
作为有状态磁盘:POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-database-mig/createInstances { "instances": [ { "name": "db-instance", "preservedState" : { "disks": { "data-disk" : { "source": "projects/example-project/zones/us-east1-c/disks/db-data-disk-1", "mode": "READ_WRITE", "autoDelete": "never" } } } } ] }
该方法会在 MIG 中创建实例
db-instance
以及创建对应的具有db-data-disk-1
有状态磁盘的实例配置,并使用data-disk
作为设备名称将该磁盘挂接到新实例。- 将有状态磁盘从 MIG 外部添加到该 MIG 中的虚拟机。
- 针对 MIG 中的虚拟机将先前的无状态磁盘声明为有状态磁盘。
- 针对 MIG 中的虚拟机将有状态磁盘替换为其他磁盘。
NAME
:托管实例组的名称。VM_NAME
:要配置有状态磁盘的虚拟机实例的名称。DEVICE_NAME
:用于挂接磁盘的设备名称。DISK
:要以projects/project-id/zones/zone/disks/disk-name
格式(对于区域磁盘)和projects/project-id/regions/region/disks/disk-name
格式(对于地区磁盘)挂接到指定DEVICE_NAME
下的现有永久性磁盘的 URI。如果实例的实例配置中已定义设备,则
source=DISK
子标志为可选项,否则为必需项。如果省略,则当前配置的磁盘 URI 将保持不变。
MODE
:指定磁盘的模式。只有在指定了source
时才能指定mode
。 支持的选项包括:ro
:只读。rw
:(默认值)。读写。
如果省略,则系统会为新的有状态磁盘配置设置默认值;该值在现有配置中将保持不变。
DELETE_RULE
:用于设置在删除虚拟机后应如何处理有状态磁盘的值。可用的选项如下所示:never
:(默认值)永不删除磁盘;而是在删除磁盘实例后分离磁盘。on-permanent-instance-deletion
:从实例组永久删除有状态磁盘的实例时(例如,手动删除实例或减小实例组大小时),删除该有状态磁盘。
如果省略,则系统会为新的有状态磁盘配置设置默认值;该值在现有配置中将保持不变。
无论删除规则的值如何,有状态磁盘在虚拟机自动修复、更新和重新创建操作时始终会保留。
MINIMAL_ACTION
:在将实例配置更新应用于实例时,至少执行指定的操作。必须与--update-instance
标志结合使用。该值必须是以下项之一:none
:不执行任何操作。refresh
:应用可在不停止虚拟机的情况下应用的更新。restart
:停止虚拟机,然后重新启动。replace
:重新创建虚拟机。
如果省略,则使用更新所需的中断性最低的操作。
- 更新
db-instance-1
的实例配置:- 将设备名称为
data-disk
的磁盘的来源从data-disk-1
(上一个配置)更新为data-disk-2
(新配置)。 - 保留永不删除磁盘的自动删除规则,因为
--stateful-disk
标志中省略了auto-delete
参数,默认情况下删除规则为never
。
- 将设备名称为
- 立即将实例配置更新应用于
db-instance-1
虚拟机,因为--update-instance
标志已包含在内。MIG 会分离data-disk-1
,并将data-disk-2
挂接在同一设备名称data-disk
下。 - 由于最少操作设置为
restart
,因此 MIG 会重启db-instance-1
实例以更新虚拟机,这有助于数据库应用开始使用新磁盘。 PROJECT_ID
:请求的项目 ID。ZONE
:MIG 所在的区域(适用于区域级 MIG)。- 对于地区级 MIG,将
zones/ZONE
替换为regions/REGION
并指定 MIG 所在的地区。
- 对于地区级 MIG,将
NAME
:MIG 的名称。VM_NAME
:要配置有状态磁盘的虚拟机的名称。DEVICE_NAME
:用于挂接磁盘的设备名称。DISK
:要以projects/project-id/zones/zone/disks/disk-name
格式(对于区域磁盘)和projects/project-id/regions/region/disks/disk-name
格式(对于地区磁盘)挂接到指定DEVICE_NAME
下的现有永久性磁盘的 URI。如果实例的实例配置中已定义设备,则
"source": "DISK"
字段为可选项,否则为必需项。如果省略
source
字段,则当前配置的磁盘 URI 将保持不变。MODE
:(可选)指定磁盘的模式。只有在提供了source
时才能指定mode
。支持的选项包括:READ_ONLY
:只读。READ_WRITE
:(默认值)。读写。
如果省略,则系统会为新的有状态磁盘配置设置默认值;该值在现有配置中将保持不变。
DELETE_RULE
:(可选)用于设置在删除虚拟机后应如何处理有状态磁盘的值。可用的选项如下所示:- never:(默认值)。永不删除磁盘;而是在删除磁盘实例后分离磁盘。
on-permanent-instance-deletion
:从实例组永久删除有状态磁盘的实例时(例如,手动删除实例或减小实例组大小时),删除该有状态磁盘。
如果省略
autoDelete
字段,则系统会为新的有状态磁盘配置设置默认值;该值在现有配置中将保持不变。无论删除规则的值如何,有状态磁盘在虚拟机自动修复、更新和重新创建操作时始终会保留。
FINGERPRINT
(可选):指定配置的指纹(如果已存在)。用于乐观锁定。如需查看最新指纹,请发出get()
请求以检索资源。- 将设备名称为
data-disk
的磁盘的source
从data-disk-1
(上一个配置)更新为data-disk-2
(新配置)。 - 使
mode
和autoDelete
参数保持不变,因为请求中省略了这些参数。 - 在您要重新设计应用架构以将状态移出磁盘时。
- 在您误将磁盘配置为有状态并想要将其还原时。
- 如果未在实例模板中定义磁盘,则 MIG 会分离磁盘。
- 无论配置中的自动删除规则如何,MIG 都不会在您从实例配置中删除磁盘配置时删除磁盘。
- 如果磁盘由实例模板定义,则 MIG 会将磁盘视为无状态,这意味着在随后实例重新创建、更新或自动修复事件时 MIG 会在实例模板中通过磁盘来源重新创建磁盘。
NAME
:MIG 的名称。VM_NAME
:要移除有状态配置的虚拟机的名称。DEVICE_NAME
:用于挂接磁盘的设备名称。MINIMAL_ACTION
:在更新具有实例配置的虚拟机时,至少执行指定的操作。只能与--update-instance
结合使用。该值必须是以下项之一:none
:不执行任何操作。refresh
:应用可在不停止虚拟机的情况下应用的更新。restart
:停止虚拟机,然后重新启动。replace
:重新创建虚拟机。
如果省略,则使用更新所需的中断性最低的操作。
- 从
node-1
的实例配置中移除设备名称为boot-disk
的磁盘的配置。 - 立即将实例配置更新应用于
node-1
虚拟机,因为--update-instance
标志已包含在内。MIG 会从代管实例的preservedStateFromConfig
中移除启动磁盘,并将启动磁盘视为无状态,这意味着在随后实例重新创建、更新或自动修复事件时 MIG 会在实例模板中通过磁盘启动映像重新创建磁盘。 PROJECT_ID
:请求的项目 ID。ZONE
:MIG 所在的区域(适用于区域级 MIG)。- 对于地区级 MIG,将
zones/ZONE
替换为regions/REGION
并指定 MIG 所在的地区。
- 对于地区级 MIG,将
NAME
:MIG 的名称。VM_NAME
:要移除有状态配置的虚拟机的名称。DEVICE_NAME
:用于挂接磁盘的设备名称。FINGERPRINT
:给定配置的指纹(如果已存在)。用于乐观锁定。如需查看最新指纹,请发出get()
请求以检索资源。对实例调用
patchPerInstanceConfigs
方法,例如,对于启动磁盘的值为null
的node-1
:POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-legacy-group/patchPerInstanceConfigs { "perInstanceConfigs": [ { "name": "node-1", "preservedState" : { "disks": { "boot-disk" : null } } } ] }
该方法会从
node-1
的实例配置中移除设备名称为boot- disk
的磁盘的配置。配置更新尚未应用于node-1
虚拟机实例。配置更新将在下次重新创建或更新实例时应用。如需将实例配置更新应用于
node-1
虚拟机实例,请为该实例调用instanceGroupManagers.applyUpdatesToInstances
方法:POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-legacy-group/applyUpdatesToInstances { "instances": ["/zones/us-east1-c/instances/node-1"] }
MIG 会从
node-1
实例的preservedStateFromConfig
中移除启动磁盘,并将磁盘视为无状态。也就是说,在后续实例重新创建、更新或自动修复事件时 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 具有以下限制:
具有有状态配置的 MIG(有状态 MIG)具有以下限制:
何时使用有状态永久性磁盘
使用有状态永久性磁盘可利用虚拟机自动修复和自动更新功能,同时仍保留磁盘上的数据。如需了解详情,请参阅有状态 MIG 的用例。
配置有状态磁盘时,系统会通过虚拟机实例自动修复、更新和重新创建功能保留这些磁盘。但是,这也意味着无法从原始映像重新创建有状态磁盘,也无法将其更新为新映像。
我们建议的最佳做法是将启动磁盘保持为无状态。
将启动磁盘保持无状态具有以下优点:
为 MIG 中的所有虚拟机配置有状态永久性磁盘
您可以将实例模板中定义的任何磁盘配置为有状态,方法是将相应磁盘的设备名称添加到 MIG 的有状态政策。MIG 会针对所有现有和未来的虚拟机实例将具有该设备名称的磁盘视为有状态。
使用 Google Cloud 控制台、gcloud CLI 或 REST 执行以下操作:
在创建 MIG 时配置有状态磁盘
控制台
gcloud
如需指定创建 MIG 时实例模板中的哪些磁盘应为有状态磁盘,请将
--stateful-disk
标志与gcloud compute instance-groups managed create
命令结合使用:gcloud compute instance-groups managed create INSTANCE_GROUP_NAME \ --template INSTANCE_TEMPLATE \ --size SIZE \ --stateful-disk device-name=DEVICE_NAME[,auto-delete=DELETE_RULE]
替换以下内容:
示例
您想要部署一个包含 12 个碎片的数据库,每个碎片均有一个包含操作系统和数据库二进制文件的无状态启动磁盘,以及一个有状态数据磁盘。按照以下步骤操作:
REST
如需指定创建 MIG 时实例模板中的哪些磁盘应为有状态,请将这些磁盘添加到
instanceGroupManagers.insert
方法的请求正文中的statefulPolicy
字段:POST https://compute.googleapis.com/compute/v1/projects/PROJECT/zones/ZONE/instanceGroupManagers { "name": "NAME", "versions": [ { "instanceTemplate": "global/instanceTemplates/TEMPLATE" } ], "targetSize": SIZE, "statefulPolicy": { "preservedState": { "disks": { "DEVICE_NAME": {"autoDelete": "DELETE_RULE" }, "DEVICE_NAME": {"autoDelete": "DELETE_RULE" } } } } }
替换以下内容:
示例
您想要部署一个包含 12 个碎片的数据库,每个碎片均有一个包含操作系统和数据库二进制文件的无状态启动磁盘,以及一个有状态数据磁盘。按照以下步骤操作:
为现有 MIG 中的磁盘设置或更新有状态配置
如果您在无状态 MIG(未进行任何有状态配置的 MIG)上运行有状态应用,则可以针对该 MIG 中的所有实例将实例模板中定义的现有磁盘配置为有状态。这样,您就可以在实例重新创建、自动修复和更新操作时保留磁盘,也可以选择在删除操作时保留。
您可以执行以下操作:
MIG 会将有状态政策中更新后的配置自动且异步地应用于所有实例。更新有状态政策中的磁盘配置不会中断正在运行的虚拟机。如需了解详情,请参阅应用有状态政策更新。
对于地区级 MIG,您必须停用主动式跨地区实例重新分布,然后才能配置有状态磁盘。如需了解详情,请参阅地区级实例组如何处理保留状态。
控制台
gcloud
如需指定实例模板中的哪些磁盘应为有状态磁盘,或更新现有 MIG 的有状态磁盘配置,请将一个或多个
--stateful-disk
标志与gcloud compute instance-groups managed update
命令结合使用:gcloud compute instance-groups managed update NAME \ --stateful-disk device-name=DEVICE_NAME[,auto-delete=DELETE_RULE]
替换以下内容:
如果已在有状态政策中配置指定的设备名称,则该命令会更新配置。
示例
您在名为
example-database- group
的 MIG 上运行包含多个碎片的数据库。该 MIG 中的每个虚拟机都将碎片存储在一个设备名称为data-disk
的额外磁盘上,该磁盘由实例模板定义。该 MIG 未进行有状态配置,并且您想要在实例重新创建、自动修复和更新时保留数据磁盘。您还希望在删除虚拟机时防止数据磁盘被删除。REST
如需指定实例模板中的哪些磁盘应为有状态,或更新现有 MIG 的有状态磁盘配置,请使用
instanceGroupManagers.patch
方法在 MIG 的有状态政策中配置磁盘:PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT/zones/ZONE/instanceGroupManagers/NAME { "statefulPolicy": { "preservedState": { "disks": { "DEVICE_NAME": {"autoDelete": "DELETE_RULE" }, "DEVICE_NAME": {"autoDelete": "DELETE_RULE" } } } } }
替换以下内容:
如果已在有状态政策中配置指定的设备名称,则
patch
方法会更新其配置。示例
您在名为
example-database- group
的 MIG 上运行包含多个碎片的数据库。该 MIG 中的每个虚拟机都将碎片存储在一个设备名称为data-disk
的额外磁盘上,该磁盘由实例模板定义。该 MIG 未进行有状态配置,并且您想要在实例重新创建、自动修复和更新时保留数据磁盘。您还希望在删除虚拟机时防止数据磁盘被删除。将之前的有状态永久性磁盘声明为无状态
您可能需要配置有状态磁盘,使其被视为无状态。例如:
如需将具有给定设备名称的所有磁盘声明为无状态,请从有状态政策中移除该磁盘的配置。
MIG 会将对有状态政策的更改自动且异步地应用于所有实例。更新有状态政策中的磁盘配置不会中断正在运行的虚拟机实例。
如需了解详情,请参阅应用有状态政策更新。
控制台
gcloud
如需指定将 MIG 的有状态政策中的哪些磁盘设为无状态,请将
--remove-stateful-disks
标志与gcloud compute instance-groups managed update
命令结合使用:gcloud compute instance-groups managed update NAME \ --remove-stateful-disks DEVICE_NAME[,DEVICE_NAME,...]
替换以下内容:
示例
您在名为
example-legacy-group
的 MIG 上运行具有多个节点的旧版应用。该 MIG 中的每个虚拟机都将应用数据存储在一个设备名称为boot-disk
的启动磁盘上,您已在该 MIG 的有状态政策中将此启动磁盘配置为有状态。您已将应用数据移至其他磁盘,现在希望将该启动磁盘设为无状态,以便于更新为新映像。如需移除该启动磁盘的有状态配置,请更新代管实例组:
gcloud compute instance-groups managed update example-legacy-group \ --remove-stateful-disks boot-disk
MIG 会对实例组中所有实例的启动磁盘自动且异步地移除设备名称为
boot-disk
的有状态配置。启动磁盘仍挂接到实例,但不再是有状态磁盘。当您重新创建或更新实例或者实例自动修复时,MIG 会通过实例模板中指定的映像重新创建启动磁盘。REST
如需指定将 MIG 的有状态政策中的哪些磁盘设为无状态,请使用
instanceGroupManagers.patch
方法从该 MIG 的有状态政策中移除每个磁盘的配置:PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT/zones/ZONE/instanceGroupManagers/NAME { "statefulPolicy": { "preservedState": { "disks": { "DEVICE_NAME": null, ... } } } }
替换以下内容:
示例
您在名为
example-legacy-group
的 MIG 上运行具有多个节点的旧版应用。该 MIG 中的每个虚拟机都将应用数据存储在一个设备名称为boot-disk
的启动磁盘上,您已在该 MIG 的有状态政策中将此启动磁盘配置为有状态。您已将应用数据移至其他磁盘,现在希望将该启动磁盘设为无状态,以便于更新为新映像。如需移除该启动磁盘的有状态配置,请修补代管实例组:
PATCH https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-legacy-group { "statefulPolicy": { "preservedState": { "disks": { "boot-disk": null } } } }
MIG 会对实例组中所有实例的启动磁盘自动且异步地移除设备名称为
boot-disk
的有状态配置。启动磁盘仍挂接到实例,但不再是有状态磁盘。当您重新创建或更新实例或者实例自动修复时,MIG 会通过实例模板中指定的映像重新创建启动磁盘。从 MIG 中移除有状态永久性磁盘
您可能需要从 MIG 的实例中完全移除有状态磁盘,例如,在重新设计应用架构并将状态移出该磁盘时。
MIG 不允许移除有状态磁盘,因此您必须执行以下步骤:
为 MIG 中的虚拟机单独配置有状态永久性磁盘
您可以为 MIG 中的特定虚拟机配置有状态永久性磁盘,方法是将相应磁盘的设备名称添加到该虚拟机的实例配置。更新虚拟机以应用实例配置并使其生效。
在以下情况下,为 MIG 中的特定虚拟机单独配置有状态永久性磁盘非常有用:
将现有有状态磁盘添加到 MIG 中的新虚拟机
您可以将现有有状态磁盘添加到您在 MIG 中手动创建的新实例。这对于将有状态应用从现有的独立虚拟机迁移到有状态 MIG 非常有用,例如:
使用 gcloud CLI 或 REST 在 MIG 中手动创建特定实例时,添加现有有状态磁盘。MIG 会在创建虚拟机时直接应用配置。
gcloud
如需创建使用自定义名称的虚拟机并将一个或多个现有有状态磁盘挂接到该虚拟机,请将命令
gcloud compute instance-groups managed create-instance
与一个或多个--stateful-disk
标志结合使用。gcloud compute instance-groups managed create-instance NAME \ --instance VM_NAME \ [--zone ZONE | --region REGION] \ --stateful-disk device-name=DEVICE_NAME,source=DISK[,mode=MODE][,auto-delete=DELETE_RULE]
替换以下内容:
示例
对于当前在名为
db-instance
的独立虚拟机上运行且当前将数据存储在名为db-data-disk-1
的磁盘上的数据库服务器,你想要为其进行自动修复。创建具有自动修复功能的有状态 MIG,在该 MIG 内创建类似的虚拟机,并将现有数据磁盘
db-data-disk-1
挂接到新实例作为有状态磁盘:REST
如需在 MIG 中创建一个或多个实例,设置自定义虚拟机名称,并将一个或多个现有有状态磁盘挂接到这些实例,请使用
instanceGroupManagers.createInstances
方法。POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/NAME/createInstances { "instances": [ { "name": "VM_NAME", "preservedState" : { "disks": { "DEVICE_NAME" : { "source": "DISK", "mode": "MODE", "autoDelete": "DELETE_RULE" }, ... } } }, ... ] }
替换以下内容:
示例
对于当前在名为
db-instance
的独立虚拟机上运行且当前将数据存储在名为db-data-disk-1
的磁盘上的数据库服务器,你想要为其进行自动修复。创建具有自动修复功能的有状态 MIG,在该 MIG 内创建类似的实例,并将现有数据磁盘
db-data-disk-1
挂接到新虚拟机作为有状态磁盘:为 MIG 中的虚拟机单独添加、声明和替换有状态磁盘
要为托管实例单独配置有状态磁盘,可以在关联的实例配置中添加或更新有状态磁盘配置。然后更新实例,将实例配置应用于虚拟机。
单独配置有状态磁盘对于以下任务很有用:
将有状态磁盘从 MIG 外部添加到该 MIG 中的虚拟机。 您可以将任何磁盘从 MIG 的外部挂接到代管实例,方法是将相应磁盘的有状态配置添加到关联的实例配置。应用该配置后,MIG 会自动将磁盘挂接到实例,并将其视为有状态。
将先前无状态永久性磁盘声明为有状态。 您可以将当前挂接到虚拟机的先前无状态磁盘声明为有状态,方法是将该磁盘的有状态配置(包括其设备名称和 URI)添加到关联的实例配置。应用该配置后,MIG 会开始将该磁盘保留为有状态。
将有状态磁盘替换为其他磁盘。 将一个有状态磁盘替换为另一个有状态磁盘会很有用,例如在您需要访问恢复的备份时。您可以将一个有状态磁盘更换为另一个有状态磁盘,方法是更新该磁盘的 URI,同时在实例配置中保留同一设备名称。应用更新后的实例配置后,MIG 将分离旧磁盘并使用同一设备名称挂接新磁盘。应用更新时,请选择是保持实例运行、重启实例还是重新创建实例。更换启动磁盘至少需要重启虚拟机。
gcloud
要为 MIG 中的虚拟机单独配置有状态磁盘,请在关联的实例配置中添加或更新有状态磁盘配置,并更新实例以应用新配置。
如果实例不存在实例配置,请将
gcloud compute instance-groups managed instance-configs create
命令与一个或多个--stateful-disk
标志结合使用:gcloud compute instance-groups managed instance-configs create NAME \ --instance VM_NAME \ --stateful-disk device-name=DEVICE_NAME[,source=DISK][,mode=MODE][,auto-delete=DELETE_RULE] \ [--no-update-instance | --update-instance] \ [--instance-update-minimal-action MINIMAL_ACTION]
如果实例已存在实例配置,请将
gcloud compute instance-groups managed instance-configs update
命令与一个或多个--stateful-disk
标志结合使用。--update-instance
标志(默认)会立即将更改应用于实例。如果您使用--no-update-instance
,则更改将保持未应用状态,并在下次重新创建或更新实例时应用。gcloud compute instance-groups managed instance-configs update NAME \ --instance VM_NAME \ --stateful-disk device-name=DEVICE_NAME[,source=DISK][,mode=MODE][,auto-delete=DELETE_RULE] \ [--no-update-instance | --update-instance] \ [--instance-update-minimal-action MINIMAL_ACTION]
替换以下内容:
示例
当前挂接的有状态磁盘
data-disk-1
上的数据已损坏,您需要从最新备份中恢复这些数据。您通过快照创建了一个磁盘data-disk-2
,用于替换由有状态 MIGexample-database-mig
管理的实例db-instance-1
中损坏的磁盘。原始磁盘data-disk-1
挂接在data-disk
设备名称下,并且具有永不删除磁盘的自动删除规则。如需将
data-disk-1
替换为data-disk-2
,请运行以下命令:gcloud compute instance-groups managed instance-configs update example-database-mig \ --instance db-instance-1 \ --stateful-disk device-name=data-disk,source=projects/example-project/zones/us-east1-c/disks/data-disk-2 \ --update-instance \ --instance-update-minimal-action restart
该命令将执行以下操作:
REST
如需为 MIG 中的虚拟机单独配置有状态磁盘,请在关联的实例配置中添加或更新有状态磁盘配置。然后更新实例以应用配置。
如果给定虚拟机尚不存在实例配置,请将
instanceGroupManagers.updatePerInstanceConfigs
方法或regionInstanceGroupManagers.updatePerInstanceConfigs
方法与一个或多个磁盘的有状态配置结合使用:POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/NAME/updatePerInstanceConfigs { "perInstanceConfigs": [ { "name": "VM_NAME", "preservedState" : { "disks": { "DEVICE_NAME" : { "source": "DISK", "mode": "MODE", "autoDelete": "DELETE_RULE" }, ... } }, "fingerprint: "FINGERPRINT" }, ... ] }
如果给定虚拟机已存在实例配置,请将
instanceGroupManagers.patchPerInstanceConfigs
方法或regionInstanceGroupManagers.patchPerInstanceConfigs
方法与一个或多个磁盘的有状态配置结合使用:POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/NAME/patchPerInstanceConfigs { "perInstanceConfigs": [ { "name": "VM_NAME", "preservedState" : { "disks": { "DEVICE_NAME" : { "source": "DISK", "mode": "MODE", "autoDelete": "DELETE_RULE" }, ... } }, "fingerprint: "FINGERPRINT" }, ... ] }
请替换以下内容:
updatePerInstanceConfigs
和patchPerInstanceConfigs
方法会更新指定的实例配置,但不会将配置更新应用于关联的代管虚拟机。当系统指示 MIG 重新创建或更新实例时,更改会应用于实例。 您还可以选择性地更新实例以应用更改。示例
当前挂接的有状态磁盘
data-disk-1
上的数据已损坏,您需要从最新备份中恢复这些数据。您通过快照创建了一个磁盘data-disk-2
,用于替换由有状态 MIGexample-database-mig
管理的实例db-instance-1
中损坏的磁盘。原始磁盘data-disk-1
挂接在data-disk
设备名称下,并且具有永不删除磁盘的自动删除规则。如需使用新磁盘更新
db-instance-1
的实例配置,请调用patchPerInstanceConfigs
方法:POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-database-mig/patchPerInstanceConfigs { "perInstanceConfigs": [ { "name": "db-instance-1", "preservedState" : { "disks": { "data-disk" : { "source": "projects/example-project/zones/us-east1-c/disks/data-disk-2" } } } } ] }
该方法会修补
db-instance-1
的实例配置:配置更新尚未应用于
db-instance-1
虚拟机。重新创建或更新实例时,MIG 会应用配置更新。如需将实例配置更新应用于
db-instance-1
虚拟机,请为该实例调用instanceGroupManagers.applyUpdatesToInstances
方法:POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-database-mig/applyUpdatesToInstances { "instances": ["/zones/us-east1-c/instances/db-instance-1"], "minimalAction": "RESTART" }
该方法会更新代管实例的保留状态,分离
data-disk-1
并将data-disk-2
挂接在同一设备名称data-disk
下。由于minimalAction
设置为RESTART
,因此该方法会重启db-instance-1
虚拟机,这样数据库应用就可以开始使用新磁盘。分离有状态磁盘或针对单个虚拟机将有状态磁盘声明为无状态
您可能需要分离有状态磁盘,或针对单个虚拟机对有状态磁盘进行配置,使其被视为无状态。例如:
您可以分离有状态磁盘或针对单个虚拟机将有状态磁盘设为无状态,方法是从关联的实例配置中移除相应磁盘的有状态配置或删除整个实例配置。当您应用更改时:
从实例配置中移除磁盘配置不会重启正在运行的虚拟机实例,除非您明确选择这样做。
如需了解详情,请参阅应用实例配置更新。
gcloud
要分离有状态磁盘或针对 MIG 中的虚拟机单独将有状态磁盘声明为无状态,请从关联的实例配置中移除有状态磁盘配置,或删除整个实例配置(如果它不包含任何其他状态)。然后更新实例以应用配置。
如需从关联的实例配置中移除有状态磁盘配置,请将
gcloud compute instance-groups managed instance-configs update
命令与--remove-stateful-disks
标志结合使用。--update-instance
标志(默认)会立即将更改应用于实例。如果您使用--no-update-instance
,则更改将保持未应用状态,并在下次重新创建或更新实例时应用。gcloud compute instance-groups managed instance-configs update NAME \ --instance VM_NAME \ --remove-stateful-disks DEVICE_NAME[,DEVICE_NAME,...] \ [--no-update-instance | --update-instance] \ [--instance-update-minimal-action MINIMAL_ACTION]
替换以下内容:
示例
您在名为
example-legacy-group
的 MIG 上运行旧版应用。该 MIG 中的每个虚拟机都将应用数据存储在一个设备名称为boot-disk
的启动磁盘上。使用实例配置,将每个启动磁盘配置为有状态。现在,您已将应用数据移至其他磁盘,并且希望针对每个虚拟机将该启动磁盘设为无状态,以便于更新为新映像。对于每个实例(例如对于
node-1
),请运行以下命令:gcloud compute instance-groups managed instance-configs update example-legacy-group \ --instance node-1 \ --remove-stateful-disks boot-disk \ --update-instance
该命令将执行以下操作:
REST
要分离有状态磁盘或针对 MIG 中的虚拟机单独将有状态磁盘声明为无状态,请从关联的实例配置中移除有状态磁盘配置,或删除整个实例配置(如果它不包含任何其他状态)。然后更新实例以应用配置。
如需从关联的实例配置中移除有状态磁盘配置,请使用
instanceGroupManagers.patchPerInstanceConfigs
方法或regionInstanceGroupManagers.patchPerInstanceConfigs
方法:POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/NAME/patchPerInstanceConfigs { "perInstanceConfigs": [ { "name": "VM_NAME", "preservedState" : { "disks": { "DEVICE_NAME" : null }, ... }, "fingerprint: "FINGERPRINT" ... } ] }
请替换以下内容:
patchPerInstanceConfigs
方法会修补指定的实例配置,但不会将更改应用于关联的虚拟机。更改会在您重新创建或更新实例时应用于虚拟机。您可以手动应用更改,也可以使用自动滚动更新。示例
您在名为
example-legacy-group
的 MIG 上运行旧版应用。该 MIG 中的每个虚拟机都将应用数据存储在一个设备名称为boot-disk
的启动磁盘上。在将独立虚拟机迁移到 MIG 中时,您在 MIG 的实例配置中将该启动磁盘配置为有状态。您已将应用数据移至其他磁盘,现在希望针对每个虚拟机将该启动磁盘设为无状态,以便于更新为新映像。反馈
我们希望了解有关有状态 MIG 的用例、挑战和反馈。请发送至 mig-discuss@google.com,与我们的团队分享您的反馈。
后续步骤
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2024-11-12。
-