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


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

您可以针对托管式实例组 (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

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. Terraform

      如需在本地开发环境中使用本页面上的 Terraform 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

      如需了解详情,请参阅 Set up authentication for a local development environment

      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 采用有状态配置,则您无法使用自动扩缩功能。
  • 如果您要使用自动滚动更新,则必须将替换方法设置为 RECREATE
  • 对于有状态区域级 MIG,您必须停用主动式重新分布功能(将重新分布类型设置为 NONE),以防止通过自动跨可用区重新分布删除有状态实例。
  • 如果您使用所有实例配置来替换实例模板属性,则无法在任何每个实例配置中指定这些属性,同时也无法在组的所有实例配置中指定这些属性。

  • 有状态的区域级 MIG 不会自动协调跨可用区故障切换。使用区域级 MIG 时,通过将冗余副本部署到多个可用区并依赖应用的数据复制功能,使有状态应用对于可用区级故障具有恢复能力。

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

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

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

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

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

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

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

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

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

在创建 MIG 时配置有状态磁盘

控制台

  1. 在 Google Cloud 控制台中,转到实例组页面。

    进入“实例组”

  2. 选择您的项目并点击继续

  3. 点击创建实例组

  4. 选择新建托管式实例组(有状态)

  5. 为该实例组指定名称

  6. 选择实例模板。如果没有可用的模板,请创建实例模板

  7. 实例数下方,指定实例组的实例数。

  8. 有状态配置部分显示实例模板中指定的磁盘。点击一个磁盘,修改其有状态配置。

    1. 有状态下方,选择
    2. 永久性实例删除时下拉列表中,选择在删除虚拟机实例后要对有状态磁盘执行的操作。可用的选项包括:

      • 分离磁盘(默认):永不删除磁盘;而是在删除磁盘虚拟机后分离磁盘。
      • 删除磁盘:从实例组永久删除有状态磁盘的虚拟机时(例如,手动删除代管式实例或减小实例组大小时),删除该有状态磁盘。
    3. 完成有状态配置后,点击完成

  9. 点击创建

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

Terraform

如果您尚未创建您希望为 MIG 中的每个虚拟机指定机器类型、启动磁盘映像、网络和其他虚拟机属性的实例模板,请创建实例模板

以下示例会创建一个具有有状态磁盘的可用区级 MIG。如需指定创建 MIG 时实例模板中的哪些磁盘应为有状态,请添加 stateful_disk 组成块。如需详细了解示例中使用的资源,请参阅 google_compute_instance_group_manager 资源。如需创建区域级 MIG,请使用 google_compute_region_instance_group_manager 资源

resource "google_compute_instance_group_manager" "default" {
  name               = "example-database-group"
  base_instance_name = "shard"
  target_size        = 12
  zone               = "us-central1-f"
  version {
    instance_template = google_compute_instance_template.default.id
    name              = "primary"
  }
  stateful_disk {
    device_name = "data-disk"
    delete_rule = "ON_PERMANENT_INSTANCE_DELETION"
  }
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

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" }
      }
    }
  }
}

替换以下内容:

  • 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,您必须停用主动式跨可用区实例重新分布,然后才能配置有状态磁盘。如需了解详情,请参阅区域级实例组如何处理保留状态

控制台

  1. 在 Google Cloud 控制台中,转到实例组页面。

    进入“实例组”

  2. 点击您要在其中其指定磁盘有状态配置的实例组的名称。

  3. 点击修改以修改此托管式实例组。

  4. 有状态配置下,展开要设为有状态磁盘的磁盘。

    1. 有状态下方,选择
    2. 永久性实例删除时下拉列表中,选择在删除虚拟机实例后要对有状态磁盘执行的操作。

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

    3. 更新有状态配置后,点击完成

  5. 点击保存以完成更新。

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 命令来验证是否已在有状态政策中配置数据磁盘。

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" }
      }
    }
  }
}

替换以下内容:

  • 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 资源,验证是否已在有状态政策中配置数据磁盘。

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

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

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

如需将具有给定设备名称的所有磁盘声明为无状态,请从有状态政策中移除该磁盘的配置。

MIG 会将对有状态政策的更改自动且异步地应用于所有实例。更新有状态政策中的磁盘配置不会中断正在运行的虚拟机实例。

如需了解详情,请参阅应用有状态政策更新

控制台

  1. 在 Google Cloud 控制台中,转到实例组页面。

    进入“实例组”

  2. 点击您要从其中移除磁盘有状态配置的实例组的名称。

  3. 点击修改以修改此托管式实例组。

  4. 有状态配置下,展开您要设为无状态磁盘的有状态磁盘。

    1. 有状态选项更改为
    2. 点击完成
  5. 完成更改后,点击保存

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 会通过实例模板中指定的映像重新创建启动磁盘。

REST

如需指定将 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 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]

替换以下内容:

  • 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 作为设备名称将该磁盘挂接到新虚拟机。

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

替换以下内容:

  • 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 实例以更新虚拟机,这有助于数据库应用开始使用新磁盘。

Terraform

如需为 MIG 中的虚拟机单独配置有状态磁盘,请在关联的实例配置中添加有状态磁盘配置。然后更新实例以应用配置

如需为虚拟机添加实例配置,请使用 google_compute_per_instance_config 资源并添加 preserved_state 组成块,如以下示例所示。

resource "google_compute_per_instance_config" "default" {
  instance_group_manager = google_compute_instance_group_manager.default.name
  zone                   = google_compute_instance_group_manager.default.zone
  name                   = "db-instance"
  preserved_state {
    disk {
      device_name = "data-disk"
      source      = google_compute_disk.default.id
      delete_rule = "NEVER"
    }
  }
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

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

替换以下内容:

  • 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 会在实例模板中通过磁盘启动映像重新创建磁盘。

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"
      ...
    }
  ]
}

替换以下内容:

  • 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,与我们的团队分享您的反馈。

后续步骤