有状态 MIG 的工作原理

有状态代管实例组(有状态 MIG)会在机器重启、重新创建、自动修复或更新后保留每个虚拟机实例的独有状态(包括虚拟机名称、挂接的 Persistent Disk 和/或元数据)。

本页面介绍了有状态 MIG 的工作原理。请参阅配置有状态 MIG,了解如何设置有状态 MIG。

有状态 MIG 的工作原理概览

如果您创建了有状态配置,则 MIG 会被视为有状态 MIG。

如需创建有状态配置,您可以设置一个非空的有状态政策和/或一个或多个非空的实例配置:

  • 有状态政策定义了您要为 MIG 中的所有实例保留的项。
  • 实例配置定义了要为某个特定虚拟机实例保留的项。

该配置在由您或 MIG 应用后生效:

  • MIG 会自动将您的有状态政策配置应用于新实例和现有实例。
  • 创建或更新实例配置时,您可以选择是手动应用新配置,还是自动应用新配置。

应用有状态配置(有状态政策和/或实例配置)后,您可以通过检查每个代管实例的保留状态验证该配置。

对 MIG 的有状态配置或大小的后续更改(例如减小 MIG 的大小,或删除或放弃 MIG 中的实例)会影响实例的保留状态

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

有状态配置在由您或 MIG 应用后生效。 如何将有状态配置应用于 MIG 的实例取决于具体的配置:

  • 有状态政策:MIG 会自动将您的有状态政策配置应用于新实例和现有实例。
  • 实例配置:创建或更新实例配置时,您可以选择是手动应用新配置,还是自动应用新配置。

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

有状态政策更新如何应用于实例

当您创建或更新有状态政策(例如添加或移除有状态磁盘)时,MIG 会自动以异步方式将有状态政策配置应用于群组中的所有代管实例。在创建实例的过程中(例如,MIG 的大小增加时或者您在 MIG 中手动创建实例时),MIG 还会自动将您的有状态政策配置应用于新实例。

应用配置后,您可以在每个代管实例的政策保留状态中查看更新的效果。

更新有状态政策不会中断正在运行的虚拟机。

当您更新有状态政策以添加有状态磁盘时,MIG 会更新每个虚拟机资源,并更改磁盘的 autoDelete 标志 (instances.disks[].autoDelete) 的值:

  • 对于您配置为有状态磁盘的磁盘,MIG 会将 autoDelete 设置为 FALSE。这样可以防止该磁盘在实例由于自动修复、更新或手动重新创建等原因而重新创建时被删除。
  • 对于将要用作无状态磁盘的所有磁盘,MIG 会设置 autoDelete 以便与您的实例模板配置 (instanceTemplates.disks[].autoDelete) 匹配。

更改 autoDelete 标志的值不会中断正在运行的虚拟机。

实例配置更新如何应用于实例

创建或更新实例配置时,您可以选择是手动应用新配置还是自动应用新配置。

您可以通过以下方式将实例配置更新应用于相应的实例:

  • 您可以手动将更新应用于特定实例以控制更新的中断级别、时间安排和顺序。将更新类型设置为寻机更新可以防止自动更新,以及仅在手动重新创建或更新虚拟机实例时应用更新。
  • 您可以在 MIG 中手动创建新实例,并在创建时指定其名称和实例配置。MIG 会在创建虚拟机时立即应用实例配置。
  • 使用 gcloud 命令行创建或更新实例配置时,您可以选择是将配置同时应用于关联的代管实例,还是推迟应用。如果推迟,对实例配置的更新不会自动应用于实例。您必须手动应用更新才能使更新生效。

下表显示了将不同的实例配置更新应用于虚拟机所需的中断级别

实例配置更新 应用更新所需的虚拟机中断级别
将实例模板定义的磁盘配置为有状态磁盘(添加到实例配置) 刷新
将实例模板定义的磁盘配置为无状态磁盘(从实例配置中移除) 刷新
添加实例模板未定义的磁盘,并将其挂接到虚拟机 刷新
移除实例模板未定义的磁盘,并将其与虚拟机分离 刷新
添加不是通过实例模板创建的外部启动磁盘,并将其挂接到虚拟机 替换
移除不是通过实例模板创建的外部启动磁盘,将其与虚拟机分离,然后改为通过实例模板创建启动磁盘 替换
添加元数据键值对 刷新
移除元数据键值对 刷新

将更新的实例配置应用于相应的虚拟机时,MIG 会根据已更新的有状态项执行以下操作:

  • 在相应的代管实例中,向配置保留状态添加(或从中移除)磁盘或元数据。
  • 将实例模板未定义的磁盘挂接到虚拟机(或者将其与虚拟机分离)。
  • 设置(或移除)特定于虚拟机的元数据键值对。

实例配置应用于相应的代管虚拟机后,您可以在实例的配置保留状态中看到更新的效果。

代管实例的保留状态

应用有状态配置后,MIG 会将您的实例模板和有状态配置转换为每个代管实例的“保留状态”。

您可以通过检查代管实例来查看保留状态

MIG 会自动维护这些保留状态,并且会自动以异步方式将这些状态应用于 MIG 中相应的每个实际虚拟机实例。

通过应用有状态配置生成的代管虚拟机保留状态。

保留状态描述了给定实例的哪些项(Persistent Disk、元数据)是有状态的:

通过应用的有状态配置生成的保留状态。

基于有状态政策生成的保留状态与基于实例配置生成的保留状态是分开存储的。MIG 在重新创建虚拟机时会结合使用这两者,并且会优先使用来自实例配置的保留状态。

基于有状态政策的保留状态

有状态政策会为 MIG 中的每个虚拟机实例指定要单独保留的项,这些项存在于所有实例中并且在 MIG 的实例模板中进行了定义。

应用有状态政策后,MIG 会将其转换为特定于实例的保留状态 (managedInstances[].preservedStateFromPolicy)。MIG 会自动维护这些保留状态。

以下示例展示了一个具有两个虚拟机实例的 MIG,这两个实例使用的有状态磁盘由应用于每个实例的有状态政策所定义。此示例中没有实例配置。

仅基于有状态政策生成的保留状态。

上图显示了一个具有两个实例的 MIG:

  • 实例模板为 MIG 中的所有实例定义了一个设备名称为 boot-disk 的启动磁盘和一个设备名称为 data-disk 的磁盘。
  • 有状态政策将 data-disk 声明为有状态磁盘。启动磁盘保留为无状态磁盘。请注意,设备名称为 data-disk 的磁盘是由实例模板定义的,并且必须由实例模板定义。
  • 应用配置后,MIG 会将有状态政策转换为每个代管实例的特定保留状态。保留状态会指示 MIG 保留虚拟机实例 node-1 的磁盘 data-disk-1 以及实例 node-2 的磁盘 data-disk-2,因为这两个磁盘都在有状态政策中配置了设备名称 data-disk
  • 此示例没有实例配置。

基于实例配置的保留状态

实例配置指定了必须为特定虚拟机保留的项。这些项不必在 MIG 的实例模板中定义。

应用每个实例配置后,MIG 会将其转换为相应实例的保留状态 (preservedStateFromConfig)。

以下示例展示了一个具有两个虚拟机实例的 MIG,每个实例的实例配置 (PIC) 定义了有状态元数据和磁盘。此示例中没有有状态政策。

仅基于 PIC 生成的保留状态。

在上图中:

  • 实例模板为 MIG 中的所有实例定义了一个设备名称为 boot-disk 的启动磁盘。MIG 中所有虚拟机的启动磁盘都是无状态磁盘。
  • 实例配置为 MIG 中的以下两个实例定义了要保留的状态:node-1node-2
    • 对于 node-1 实例,实例配置定义了一个设备名称为 legacy-disk、元数据为 node-id:xyz273 的磁盘 my-legacy-1
    • 对于 node-2 实例,实例配置定义了一个设备名称为 logs-disk、元数据为 node-id:pqr851 的磁盘 my-logs-1
  • 应用配置后,MIG 会自动将实例配置转换为每个代管实例的保留状态。保留状态会指示 MIG 挂接并保留以下磁盘:
    • 虚拟机 node-1 的 Persistent Disk my-legacy-1 和元数据 node-id:xyz273
    • 虚拟机 node-2 的 Persistent Disk my-logs-1 和元数据 node-id:pqr851
  • 此示例没有有状态政策。

请注意,来自实例配置的保留状态中的磁盘和元数据不是由此示例中的实例模板定义的,而仅仅是由实例配置定义的。这是因为,您在实例配置中指定的配置是针对特定虚拟机的,这意味着它不一定存在于实例模板中。

实例配置优先于有状态政策和实例模板

您可以在一个 MIG 中同时配置有状态政策和一个或多个实例配置。例如,在有状态政策中,您可以定义存在于所有实例中的有状态磁盘,而在实例配置中,您可以定义特定于实例的元数据。

当与实例模板中或有状态政策中的配置发生冲突时,代管实例的实例配置优先。

如果您应用实例配置来添加已在有状态政策中定义的磁盘,则 MIG 会将该磁盘的有状态配置存储在代管实例的配置保留状态 (preservedStateFromConfig) 中,并从它的政策保留状态 (preservedStateFromPolicy) 中移除冲突的条目。如果新的保留状态不同于先前的状态,则 MIG 必须刷新虚拟机。刷新操作可能会导致元数据发生变化,或者导致磁盘交换以将磁盘与上次的保留状态配置分离,并挂接新的保留状态配置中指定的磁盘。

在以下示例中,虚拟机实例 node-1 的实例配置重新定义了以下内容:

  • 设备名称为 logs-disk 的磁盘的保留状态,该状态最初是在有状态政策中定义的
  • 元数据键 logmonth 的值,该值最初是在实例模板中定义的。

实例配置中的配置优先于有状态政策和实例模板。

在上图中:

  • 实例模板定义了以下内容:
    • MIG 中所有实例的三个磁盘,其设备名称分别为 boot-diskdata-disklogs-disk
    • 所有实例通用的元数据:logmonth:jan
  • 有状态政策声明设备名称为 data-disklogs-disk 的磁盘是有状态磁盘;启动磁盘保留为无状态磁盘。
  • 实例 node-1 的实例配置重新定义了以下内容:
    • 设备名称为 logs-disk 的磁盘的有状态配置:此配置指示 MIG 将磁盘 pd-logs-feb 挂接到 node-1,并且位于设备名称为 logs-disk 的磁盘下面。
    • 实例模板中定义的元数据,其键值为 logmonth:jan:此元数据指示 MIG 将值 logmonth:feb 设置为 node-1
  • 在您应用配置后,MIG 会自动将有状态政策和实例配置转换为存储在代管实例中并且特定于实例的保留状态。
    • 来自政策的保留状态会指示 MIG 保留虚拟机 node-1 的磁盘 data-disk-1。请注意,来自政策的保留状态不包含设备名称为 logs-disk 的磁盘的有状态配置,因为此配置已被实例配置中的 logs-disk 的配置所覆盖。
    • 来自配置的保留状态会指示 MIG 挂接并保留 Persistent Disk logs-disk,以及为虚拟机实例 node-1 设置并保留元数据 logmonth:feb。请注意,来自配置的保留状态会覆盖来自有状态政策的 logs-disk 的配置,并且会覆盖来自实例模板的元数据 logmonth:jan

从有状态政策中移除资源对保留状态有何影响

如果从有状态政策中移除资源配置,则 MIG 会自动移除所有代管实例的相应 preservedStateFromPolicy。计算资源仍挂接到实例,但不再是有状态资源。

在以下示例中,从有状态政策中移除磁盘会导致系统从来自政策的保留状态中移除所有代管虚拟机的该磁盘。这些磁盘仍挂接到其虚拟机,但不再是有状态磁盘,可能会在下次重新创建虚拟机时被删除并重新创建。

从有状态政策中移除磁盘。

如果同一项(例如有状态永久性磁盘)同时存在于有状态政策和实例配置中,并且您仅从有状态政策中移除其有状态配置,则 MIG 不会将其从实例配置中移除。对于相应的虚拟机,配置的资源保留为有状态资源。

在以下示例中,从有状态政策中移除磁盘不会导致磁盘从实例配置中移除。该磁盘保留为有状态磁盘,因为它仍然属于来自配置的保留状态的一部分。

实例配置也存在时,从有状态政策中移除磁盘。

从实例配置中移除项对保留状态有何影响

如果您从实例配置中移除有状态配置并应用更改,则 MIG 会自动从相应代管实例的配置保留状态 (preservedStateFromConfig) 中移除该有状态配置。不再属于任何保留状态的计算资源将变为无状态资源。

从实例配置中移除有状态磁盘配置对保留状态有何影响

如果您从实例配置中移除有状态磁盘并将更改应用于关联的虚拟机实例,则 MIG 会执行以下操作:

  • 磁盘配置会从实例的配置保留状态中移除。
  • 如果实例模板中定义了具有相同设备名称的磁盘,但有状态政策中未配置该磁盘,则该磁盘仍会挂接到给定虚拟机。不过,对于给定虚拟机,该磁盘将变为无状态磁盘,并且可能会在下次重新创建、自动修复或更新虚拟机时根据实例模板配置重新创建。
  • 如果实例模板中未定义具有相同设备名称的磁盘,则在将更新的实例配置应用于关联的虚拟机时,该磁盘会立即自动与该虚拟机分离,无论其自动删除配置如何都是如此。
  • 如果有状态政策中配置了具有相同设备名称的磁盘,则其有状态政策配置会转换为给定代管实例的政策保留状态,并且该磁盘会保留为有状态磁盘。

在以下示例中,从 node-1 的实例配置中移除一个蓝色磁盘和一个绿磁盘会导致从 node-1 代管实例的来自配置的保留状态中移除两个磁盘。

  • 蓝色磁盘仍会挂接到 node-1 虚拟机实例,但它现在是无状态磁盘,并且可以在下次重新创建虚拟机时根据实例模板配置重新创建。
  • 绿色磁盘会与 node-1 虚拟机实例分离,因为实例模板未定义具有相同设备名称的磁盘。

从实例配置中移除磁盘。

从实例配置中移除有状态元数据对保留状态有何影响

如果从实例配置中移除有状态元数据并应用更改,则 MIG 会立即从相应代管实例的保留状态中移除该有状态元数据:

  • 如果您在实例模板中定义了具有相同键的元数据,则 MIG 会立即将实例模板中的值应用于实例。
  • 如果实例模板中未定义具有相同键的元数据,则 MIG 会立即从实例中移除键值。

在以下示例中,将 mode:devid:xyz273 元数据从 node-1 的实例配置移除会导致两个键值对自动从 node-1 代管实例的配置保留状态中移除。

  • 虚拟机中的实例模板的 mode:test 会替换 mode:dev
  • id:xyz273 会立即从虚拟机中移除,因为实例模板没有具有相同键 id 的元数据来替换它。

从实例配置中移除元数据。

回退到有状态政策

如果您从实例配置中移除资源的有状态配置,并且在有状态政策中配置了相同的资源,则该资源会根据有状态政策保留为有状态资源。

MIG 会自动从 preservedStateFromConfig 中移除该项的有状态配置,并将其添加到相应代管实例的 preservedStateFromPolicy

在以下示例中,从 node-1 的实例配置中移除磁盘不会导致磁盘从有状态政策中移除。根据有状态政策,该磁盘会保留为有状态磁盘:

  • MIG 会自动从 node-1 代管实例的 preserveStateFromConfig 中移除该磁盘,因为该磁盘不再属于其实例配置的一部分。
  • MIG 会自动将磁盘添加到 node-1 代管实例的 preserveStateFromPolicy,因为有状态政策配置仍然存在,并且不再与 node-1 实例配置冲突。

从实例配置中移除磁盘,但不从有状态政策中移除磁盘。

操作对保留状态有何影响

如需了解各种配置、MIG 操作或实例生命周期事件对代管实例的保留状态有何影响,请参阅以下部分:

反馈

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

后续步骤