在 MIG 中配置有状态永久性磁盘

通过将永久性磁盘配置为有状态,您可以利用虚拟机实例自动修复功能和自动更新功能,同时保留磁盘的状态。

您可以针对代管实例组 (MIG) 中的所有实例将实例模板中定义的任何磁盘配置为有状态,方法是将相应磁盘的设备名称添加到 MIG 的有状态政策。

您还可以通过设置实例配置为 MIG 中的实例单独配置有状态永久性磁盘;这些磁盘不需要在实例模板中定义。

准备工作

限制

有状态 MIG 存在以下限制:

  • 您不能对有状态 MIG 使用自动扩缩功能。
  • 如果您要使用自动滚动更新,则必须将替换方法设置为 RECREATE
  • 当永久删除某实例(无论是手动删除还是调整大小)时,MIG 不会保留其有状态元数据。
  • 对于有状态地区级 MIG,必须停用主动式重新分布功能(将重新分布类型设置为 NONE),以防止通过自动跨区域重新分布删除有状态实例。

何时使用有状态永久性磁盘

使用有状态永久性磁盘可利用虚拟机自动修复自动更新功能,同时仍保留磁盘上的数据。如需了解详情,请参阅有状态 MIG 的用例

配置有状态磁盘时,系统会通过虚拟机实例自动修复、更新和重新创建功能保留这些磁盘。但是,这也意味着无法从原始映像重新创建有状态磁盘,也无法将其更新为新映像。

我们建议的最佳做法是将启动磁盘保持为无状态。

将启动磁盘保持无状态具有以下优点:

  • 可以通过从原始映像重新创建启动磁盘来修复已损坏的启动磁盘。自动修复功能会自动进行此类修复。
  • 您可以使用新版本和安全补丁程序将启动磁盘更新为最新映像。

如需了解详情,请参阅自动修复更新如何处理保留状态。

为 MIG 中的所有虚拟机配置有状态永久性磁盘

您可以将实例模板中定义的任何磁盘配置为有状态,方法是将相应磁盘的设备名称添加到 MIG 的有状态政策。MIG 会针对所有现有和未来的虚拟机实例将具有该设备名称的磁盘视为有状态。

使用 gcloud 工具或 Compute Engine API:

  • 在创建 MIG 时配置有状态磁盘。
  • 为现有 MIG 中的磁盘设置或更新有状态配置。
  • 从 MIG 中移除有状态磁盘。

在创建 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]

替换以下内容:

  • INSTANCE_GROUP_NAME:要创建的代管实例组的名称。
  • INSTANCE_TEMPLATE:创建实例时要使用的实例模板的名称。
  • SIZE:您所需的该实例组初始虚拟机数。
  • DEVICE_NAME:实例模板中指定的磁盘的设备名称。
  • DELETE_RULE:用于设置在删除虚拟机后应如何处理有状态磁盘的值。可用的选项包括:

    • never:(默认值)永不删除磁盘;而是在删除磁盘虚拟机后分离磁盘。
    • on-permanent-instance-deletion:从实例组永久删除磁盘的虚拟机实例时(例如,手动删除代管实例或减小实例组大小时),删除该磁盘。

    无论删除规则的值如何,有状态磁盘在虚拟机自动修复、更新和重新创建操作时始终会保留。

示例

您想要部署一个包含 12 个碎片的数据库,每个碎片均有一个包含操作系统和数据库二进制文件的无状态启动磁盘,以及一个有状态数据磁盘。按照以下步骤操作:

  1. 创建一个实例模板,使其包含基于映像 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 执行以下操作:

    1. 通过预先准备的空 ext4 映像为每个虚拟机实例创建一个新的 10 GB 磁盘。
    2. 使用设备名称 data-disk 以读写模式将该磁盘挂接到其虚拟机。
  2. 从该实例模板创建 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 取自该实例模板。当虚拟机被永久删除时(由于手动删除实例或由于手动减小实例组大小),系统会将数据磁盘配置为与虚拟机实例一起删除。数据磁盘在自动修复、更新和虚拟机重新创建时会保留。

  3. 验证是否已在有状态政策中配置数据磁盘:

    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 的磁盘声明为有状态,并规定在永久删除虚拟机时删除此类磁盘。

API

如需指定创建 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" }
      }
    }
  }
}

替换以下内容:

  • PROJECT:请求的项目 ID。
  • ZONE:MIG 所在的区域(适用于区域级 MIG)。
    • 对于地区级 MIG,将 zones/ZONE 替换为 regions/REGION 并指定 MIG 所在的地区。
  • NAME:要创建的 MIG 的名称。
  • TEMPLATE:创建实例时要使用的实例模板的名称。
  • SIZE:您所需的该实例组初始实例数。
  • DEVICE_NAME:实例模板中指定的磁盘的设备名称。
  • DELETE_RULE:用于设置在删除虚拟机实例后应如何处理有状态磁盘的值。可用的选项包括:

    • never:(默认值)永不删除磁盘;而是在删除磁盘虚拟机后分离磁盘。
    • on_permanent_instance_deletion:从实例组永久删除有状态磁盘的虚拟机时(例如,手动删除代管实例或减小实例组大小时),删除该有状态磁盘。

示例

您想要部署一个包含 12 个碎片的数据库,每个碎片均有一个包含操作系统和数据库二进制文件的无状态启动磁盘,以及一个有状态数据磁盘。按照以下步骤操作:

  1. 使用 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 映像创建,并以读写模式挂接。

  2. 使用 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),以便数据磁盘在自动修复、更新和实例重新创建时会保留。
  3. 使用 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(未进行任何有状态配置的 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]

替换以下内容:

  • NAME:要更新的托管实例组的名称。
  • DEVICE_NAME:实例模板中指定的磁盘设备名称。
  • DELETE_RULE:用于设置在删除虚拟机实例后应如何处理有状态磁盘的值。可用的选项包括:

    • never:(默认值)永不删除磁盘;而是在删除磁盘实例后分离磁盘。
    • on-permanent-instance-deletion:从实例组永久删除有状态磁盘的实例时(例如,手动删除代管实例或减小实例组大小时),删除该有状态磁盘。

如果已在有状态政策中配置指定的设备名称,则该命令会更新配置。

示例

您在名为 example-database- group 的 MIG 上运行包含多个碎片的数据库。该 MIG 中的每个虚拟机都将碎片存储在一个设备名称为 data-disk 的额外磁盘上,该磁盘由实例模板定义。该 MIG 未进行有状态配置,并且您想要在实例重新创建、自动修复和更新时保留数据磁盘。您还希望在删除虚拟机时防止数据磁盘被删除。

  1. 更新 MIG 以使用以下命令将数据磁盘定义为有状态:

    gcloud compute instance-groups managed update example-database-group \
      --stateful-disk device-name=data-disk,auto-delete=never
    

    因此,MIG 会将有状态政策配置更新自动且异步地应用于所有实例的数据磁盘。现在,数据磁盘在自动修复、更新和实例重新创建时会保留,并且由于 auto-delete 规则设置为 never,数据磁盘在实例删除时会分离。

  2. 通过运行 gcloud compute instance-groups managed describe example-database-group 命令来验证是否已在有状态政策中配置数据磁盘。

API

如需指定实例模板中的哪些磁盘应为有状态,或更新现有 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" }
      }
    }
  }
}

替换以下内容:

  • PROJECT:请求的项目 ID。
  • ZONE:MIG 所在的区域(适用于区域级 MIG)。
    • 对于地区级 MIG,将 zones/ZONE 替换为 regions/REGION 并指定 MIG 所在的地区。
  • NAME:要更新的 MIG 的名称。
  • DEVICE_NAME:实例模板中指定的要更新有状态配置的磁盘的设备名称。
  • DELETE_RULE:用于设置在删除虚拟机实例后应如何处理有状态磁盘的值。可用的选项包括:

    • never:(默认值)永不删除磁盘;而是在删除磁盘实例后分离磁盘。
    • on-permanent-instance-deletion:从实例组永久删除有状态磁盘的实例时(例如,手动删除实例或减小实例组大小时),删除该有状态磁盘。

如果已在有状态政策中配置指定的设备名称,则 patch 方法会更新其配置。

示例

您在名为 example-database- group 的 MIG 上运行包含多个碎片的数据库。该 MIG 中的每个虚拟机都将碎片存储在一个设备名称为 data-disk 的额外磁盘上,该磁盘由实例模板定义。该 MIG 未进行有状态配置,并且您想要在实例重新创建、自动修复和更新时保留数据磁盘。您还希望在删除虚拟机时防止数据磁盘被删除。

  1. 修补 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,因此数据磁盘在实例删除时会分离。

  2. 通过查看 instanceGroupManagers.get 方法返回的 instanceGroupManagers 资源,验证是否已在有状态政策中配置数据磁盘。

将之前的有状态永久性磁盘声明为无状态

您可能需要配置有状态磁盘,使其被视为无状态。例如:

  • 在您要重新设计应用架构以将状态移出磁盘时。
  • 在您误将磁盘配置为有状态磁盘并想要撤销此配置时。

如需将具有给定设备名称的所有磁盘声明为无状态磁盘,请使用 gcloud 工具或 Compute Engine API 从有状态政策中移除相应磁盘的配置。

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,...]

替换以下内容:

  • NAME:要更新的 MIG 的名称。
  • 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 会通过实例模板中指定的映像重新创建启动磁盘。

API

如需指定将 MIG 的有状态政策中的哪些磁盘设为无状态,请使用 instanceGroupManagers.patch 方法从该 MIG 的有状态政策中移除每个磁盘的配置:

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

{
  "statefulPolicy": {
    "preservedState": {
      "disks": {
        "DEVICE_NAME": null,
        ...
      }
    }
  }
}

替换以下内容:

  • PROJECT:请求的项目 ID。
  • ZONE:MIG 所在的区域(适用于区域级 MIG)。
    • 对于地区级 MIG,将 zones/ZONE 替换为 regions/REGION 并指定 MIG 所在的地区。
  • NAME:要更新的 MIG 的名称。
  • 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 不允许移除有状态磁盘,因此您必须执行以下步骤:

  1. 从有状态政策中移除磁盘的有状态配置。这会使具有给定设备名称的磁盘无状态。
  2. 如果您仍想保留这些磁盘,请将其与虚拟机分离。
  3. 发布不再定义具有给定设备名称的磁盘的新实例模板。

为 MIG 中的虚拟机单独配置有状态永久性磁盘

您可以为 MIG 中的特定虚拟机配置有状态永久性磁盘,方法是将相应磁盘的设备名称添加到该虚拟机的实例配置。更新虚拟机以应用实例配置并使其生效。

在以下情况下,为 MIG 中的特定虚拟机单独配置有状态永久性磁盘非常有用:

  • 将现有工作负载(现有磁盘)从独立虚拟机迁移到有状态 MIG,以便从自动修复和易于更新中获益。
  • 恢复为虚拟机单独配置的磁盘备份。
  • 将其他有状态磁盘临时挂接到特定虚拟机,以测试、调试或复制数据。

将现有有状态磁盘添加到 MIG 中的新虚拟机

您可以将现有有状态磁盘添加到您在 MIG 中手动创建的新实例。这对于将有状态应用从现有的独立虚拟机迁移到有状态 MIG 非常有用,例如:

  1. 为所有虚拟机实例创建具有通用配置的实例模板
  2. 将数据磁盘与独立实例分离并删除这些实例。如果启动磁盘包含应保留的状态,您也可以分离启动磁盘
  3. 使用先前创建的实例模板创建一个空 MIG。
  4. 在该 MIG 中创建使用上一步中的相应名称和关联磁盘的实例。该 MIG 会响应您的请求,并执行以下操作:

    1. 使用提供的实例名称从实例模板创建虚拟机。
      • 地区级 MIG 会在磁盘所在的区域中创建虚拟机。如果磁盘是地区磁盘,则地区级 MIG 会在磁盘的任何副本区域中创建虚拟机。
    2. 使用为磁盘提供的有状态配置创建实例配置
    3. 将磁盘挂接到新实例。

使用 gcloud 工具或 API 在 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]

替换以下内容:

  • 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-data-disk-1 的磁盘上的数据库服务器,你想要为其进行自动修复。

创建具有自动修复功能的有状态 MIG,在该 MIG 内创建类似的虚拟机,并将现有数据磁盘 db-data-disk-1 挂接到新实例作为有状态磁盘:

  1. 在维护期内停止虚拟机 db-instance
  2. 使用 db-instance 配置创建一个实例模板(名为 db-template)。
  3. db-data-disk-1db-instance 分离并删除 db-instance
  4. 通过 db-template 创建一个空 MIG example-database-mig 并配置自动修复功能。
  5. 创建一个使用原始 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 作为设备名称将该磁盘挂接到新虚拟机。

API

如需在 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"
          },
          ...
        }
      }
    },
    ...
  ]
}

替换以下内容:

  • PROJECT_ID:请求的项目 ID。
  • ZONE:MIG 所在的区域(适用于区域级 MIG)。
    • 对于地区级 MIG,将 zones/ZONE 替换为 regions/REGION 并指定 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-data-disk-1 的磁盘上的数据库服务器,你想要为其进行自动修复。

创建具有自动修复功能的有状态 MIG,在该 MIG 内创建类似的实例,并将现有数据磁盘 db-data-disk-1 挂接到新虚拟机作为有状态磁盘:

  1. 在维护期内停止虚拟机 db-instance
  2. 使用 db-instance 配置创建一个实例模板(名为 db-template)。
  3. db-data-disk-1db-instance 分离并删除 db-instance
  4. 通过 db-template 创建一个空 MIG example-database-mig 并配置自动修复功能。
  5. 创建一个使用原始 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 中的虚拟机将先前的无状态磁盘声明为有状态磁盘。
  • 针对 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]

替换以下内容:

  • 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:重新创建虚拟机。

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

示例

当前挂接的有状态磁盘 data-disk-1 上的数据已损坏,您需要从最新备份中恢复这些数据。您通过快照创建了一个磁盘 data-disk-2,用于替换由有状态 MIG example-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

该命令将执行以下操作:

  1. 更新 db-instance-1 的实例配置:
    1. 将设备名称为 data-disk 的磁盘的来源从 data-disk-1(上一个配置)更新为 data-disk-2(新配置)。
    2. 保留永不删除磁盘的自动删除规则,因为 --stateful-disk 标志中省略了 auto-delete 参数,默认情况下删除规则为 never
  2. 立即将实例配置更新应用于 db-instance-1 虚拟机,因为 --update-instance 标志已包含在内。MIG 会分离 data-disk-1,并将 data-disk-2 挂接在同一设备名称 data-disk 下。
  3. 由于最少操作设置为 restart,因此 MIG 会重启 db-instance-1 实例以更新虚拟机,这有助于数据库应用开始使用新磁盘。

API

如需为 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"
    },
    ...
  ]
}

请替换以下内容:

  • PROJECT_ID:请求的项目 ID。
  • ZONE:MIG 所在的区域(适用于区域级 MIG)。
    • 对于地区级 MIG,将 zones/ZONE 替换为 regions/REGION 并指定 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() 请求以检索资源。

updatePerInstanceConfigspatchPerInstanceConfigs 方法会更新指定的实例配置,但不会将配置更新应用于关联的代管虚拟机。当系统指示 MIG 重新创建或更新实例时,更改会应用于实例。 您还可以选择性地更新实例以应用更改。

示例

当前挂接的有状态磁盘 data-disk-1 上的数据已损坏,您需要从最新备份中恢复这些数据。您通过快照创建了一个磁盘 data-disk-2,用于替换由有状态 MIG example-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 的实例配置:

  1. 将设备名称为 data-disk 的磁盘的 sourcedata-disk-1(上一个配置)更新为 data-disk-2(新配置)。
  2. 使 modeautoDelete 参数保持不变,因为请求中省略了这些参数。

配置更新尚未应用于 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 虚拟机,这样数据库应用就可以开始使用新磁盘。

分离有状态磁盘或针对单个虚拟机将有状态磁盘声明为无状态

您可能需要分离有状态磁盘,或针对单个虚拟机对有状态磁盘进行配置,使其被视为无状态。例如:

  • 在您要重新设计应用架构以将状态移出磁盘时。
  • 在您误将磁盘配置为有状态并想要将其还原时。

您可以分离有状态磁盘或针对单个虚拟机将有状态磁盘设为无状态,方法是从关联的实例配置中移除相应磁盘的有状态配置或删除整个实例配置。当您应用更改时:

  • 如果未在实例模板中定义磁盘,则 MIG 会分离磁盘。
    • 无论配置中的自动删除规则如何,MIG 都不会在您从实例配置中删除磁盘配置时删除磁盘。
  • 如果磁盘由实例模板定义,则 MIG 会将磁盘视为无状态,这意味着在随后实例重新创建、更新或自动修复事件时 MIG 会在实例模板中通过磁盘来源重新创建磁盘。

从实例配置中移除磁盘配置不会重启正在运行的虚拟机实例,除非您明确选择这样做。

如需了解详情,请参阅应用实例配置更新

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]

替换以下内容:

  • NAME:MIG 的名称。
  • VM_NAME:要移除有状态配置的虚拟机的名称。
  • DEVICE_NAME:用于挂接磁盘的设备名称。
  • MINIMAL_ACTION:在更新具有实例配置的虚拟机时,至少执行指定的操作。只能与 --update-instance 结合使用。该值必须是以下项之一:

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

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

示例

您在名为 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

该命令将执行以下操作:

  1. node-1 的实例配置中移除设备名称为 boot-disk 的磁盘的配置。
  2. 立即将实例配置更新应用于 node-1 虚拟机,因为 --update-instance 标志已包含在内。MIG 会从代管实例的 preservedStateFromConfig 中移除启动磁盘,并将启动磁盘视为无状态,这意味着在随后实例重新创建、更新或自动修复事件时 MIG 会在实例模板中通过磁盘启动映像重新创建磁盘。

API

要分离有状态磁盘或针对 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"
    },
    ...
  ]
}

请替换以下内容:

  • PROJECT_ID:请求的项目 ID。
  • ZONE:MIG 所在的区域(适用于区域级 MIG)。
    • 对于地区级 MIG,将 zones/ZONE 替换为 regions/REGION 并指定 MIG 所在的地区。
  • NAME:MIG 的名称。
  • VM_NAME:要移除有状态配置的虚拟机的名称。
  • DEVICE_NAME:用于挂接磁盘的设备名称。
  • FINGERPRINT:给定配置的指纹(如果已存在)。用于乐观锁定。如需查看最新指纹,请发出 get() 请求以检索资源。

patchPerInstanceConfigs 方法会修补指定的实例配置,但不会将更改应用于关联的虚拟机。更改会在您重新创建或更新实例时应用于虚拟机。您可以手动应用更改,也可以使用自动滚动更新。

示例

您在名为 example-legacy-group 的 MIG 上运行旧版应用。该 MIG 中的每个虚拟机都将应用数据存储在一个设备名称为 boot-disk 的启动磁盘上。在将独立虚拟机迁移到 MIG 中时,您在 MIG 的实例配置中将该启动磁盘配置为有状态。您已将应用数据移至其他磁盘,现在希望针对每个虚拟机将该启动磁盘设为无状态,以便于更新为新映像。

  1. 对实例调用 patchPerInstanceConfigs 方法,例如,对于启动磁盘的值为 nullnode-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 虚拟机实例。配置更新将在下次重新创建或更新实例时应用。

  2. 如需将实例配置更新应用于 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-discuss@google.com,与我们的团队分享您的反馈。

后续步骤