将现有工作负载迁移到有状态托管式实例组


如果独立(非托管式)Compute Engine 虚拟机 (VM) 实例上已有有状态应用,则可以将该应用迁移到有状态托管式实例组 (MIG)

通过配置有状态 MIG 并使用代管式实例,您可以获得以下优势:

  • 保留状态:保留实例名称、磁盘和元数据(即使重新创建了实例也会保留)。
  • 自动修复:在同一可用区内自动重新创建工作负载失败的虚拟机。
  • 自动更新:将新实例配置或软件版本正常部署到 MIG 中的虚拟机。

限制

  • 您必须停止现有虚拟机才能迁移其现有磁盘,或者才能截取一致的快照供新的代管式实例使用。
  • 如果要重复使用现有虚拟机的名称,您必须删除现有虚拟机。
  • 您的应用必须能够在具有相同机器类型的虚拟机上运行。如果您的现有应用需要不同机器类型的多个实例,请创建多个实例模板和 MIG,每种机器类型一个。
  • 您的应用必须在虚拟机启动时启动。您可以使用自定义映像或启动脚本。下文介绍了各个选项。
  • 如果您选择创建有状态启动磁盘,则无法在 MIG 中发布启动映像更新来更新操作系统或软件。
  • 只有在多个可用区中创建冗余副本并配置应用级数据复制,才能实现多可用区高可用性。有状态 MIG 只会自动修复同一可用区内的实例,而不会编排跨可用区故障切换。

  • 您不能对有状态 MIG 使用自动扩缩功能。

  • 查看有状态 MIG 限制

费用

本教程使用 Google Cloud 的计费组件,包括:

  • Compute Engine

您可使用价格计算器根据您的预计使用情况来估算费用。

准备工作

本指南使用 gcloud CLI。您可以使用 Cloud Shell 访问此工具。或者,如果您要改为在本地计算机上运行 gcloud CLI,请下载并安装最新的 gcloud CLI

迁移概览

  1. 了解构成有状态 MIG 的组件。
  2. 查看现有设置以确定通用虚拟机规范。
  3. (可选)创建自定义映像以用作公共启动磁盘映像。
  4. 创建实例模板以指定 MIG 的通用虚拟机配置。
  5. 创建一个空的 MIG。
  6. 将现有虚拟机转换为 MIG 中的代管式实例,包括实例配置。
  7. 为 MIG 配置自动修复以提高应用的弹性。
  8. (可选)若要减少配置开销,请将实例配置替换为有状态政策。

组件

您可以通过多个组件配置有状态 MIG 的代管式实例:

  • 实例模板包含 MIG 中虚拟机的通用配置,包括机器类型、启动磁盘映像、其他磁盘的可选规范以及可选的启动脚本
  • 可选的自定义映像包含您的应用,并用作通用启动磁盘映像。
  • 个别实例配置包含特定于实例的有状态项。例如,您可以将现有磁盘挂接到实例组中的特定实例。此磁盘可能与现有的独立实例分离、从快照或区域级磁盘恢复。不需要在您的实例模板中定义磁盘的设备名称。
  • 可选的有状态政策包含通用有状态项。例如,该政策针对实例组中所有实例将具有特定设备名称(如实例模板中所定义)的所有磁盘定义为有状态。

您需要使用哪些组件?

您需要使用的组件取决于现有设置。下表提供了在一个或多个实例上运行的应用的部分可能配置的简要说明。在本教程的后面部分,您将了解现有设置以确定需要使用哪些配置。

您的启动磁盘上是否有任何必须保留的有状态数据或配置? 您的应用如何启动?
在现有启动磁盘上配置应用 使用启动脚本配置应用
否:启动磁盘是无状态的
  1. 使用包含自定义映像的实例模板
  2. 为有状态数据磁盘添加实例配置(或有状态政策)
  1. 使用包含启动脚本的实例模板
  2. 为有状态数据磁盘添加实例配置(或有状态政策)
是:至少有一个启动磁盘是有状态的
  1. 使用包含自定义映像的实例模板
  2. 为有状态启动磁盘和数据磁盘添加实例配置(或有状态政策)
  1. 使用包含启动脚本的实例模板
  2. 为有状态启动磁盘和数据磁盘添加实例配置(或有状态政策)

查看现有设置

查看现有独立实例,以检查每个实例的机器类型、磁盘和元数据。

对每个实例使用 instances describe 命令

gcloud compute instances describe INSTANCE_NAME

请回答以下问题,为本指南中的后续步骤做好准备。

问题 含义
虚拟机属性
您要用于实例组的机器类型是什么? 在 MIG 的实例模板中指定此机器类型。
您的应用如何启动:在启动磁盘上预先配置,还是由启动脚本安装、配置和启动? 如果在启动磁盘上预先配置您的应用,请创建自定义映像,然后在 MIG 的实例模板中指定该映像。

如果您的应用由启动脚本启动,请在 MIG 的实例模板中指定该启动脚本。

如果您的应用同时需要自定义启动磁盘映像和启动脚本,请在实例模板中指定两者。
您是否要保留现有的实例名称? 您必须删除现有独立实例才能释放实例名称。

如果您的启动磁盘保持无状态,并且您希望在 MIG 中使用自动滚动更新,请查看保留实例名称相关文档。
有状态项
对于每个实例,是否有任何您需要保留的特定于实例的元数据? 使用个别实例配置指定特定于实例的元数据。
您的启动磁盘是否是有状态的?换句话说,您必须保留其状态的任何启动磁盘上是否有任何数据? 如果您需要保留启动磁盘的状态,则无法通过发布启动磁盘映像更新来更新操作系统或软件。
所有实例是否具有相同类型的磁盘?例如,它们是否全都具有一个数据磁盘?或者它们是否具有并需要唯一的磁盘配置? 如果所有实例都具有通用磁盘配置,请在实例模板中定义这些通用设备名称,例如“data-disk”。这样,您就可以使用有状态政策在 MIG 中将这些磁盘声明为有状态,并且开销比实例配置低。
如果您要扩大实例组,当前磁盘的大小是否足够? 在实例模板中指定所需的磁盘大小。新实例将获取您指定的磁盘,前提是这些磁盘未在有状态政策或实例配置中重新定义。

本指南首先为现有有状态磁盘创建个别实例配置。但是,如果磁盘具有您在组的实例模板中声明的公共设备名称,稍后您可以将这些配置转换为有状态政策。

示例设置

本指南使用以下基本示例来说明迁移步骤。假设您有一个在三个独立的 Compute Engine 虚拟机上运行的有状态应用。假设采用以下虚拟机规格:

  • 每个虚拟机都具有相同的机器类型。
  • 每个虚拟机都位于同一项目和可用区中。
  • 每个虚拟机的启动磁盘都具有相同的应用,该应用在启动磁盘上配置为在虚拟机启动时启动。
  • 每个虚拟机的启动磁盘不包含其他任何必须保留的数据或配置。
  • 每个虚拟机都有一个辅助永久性磁盘,其中包含有状态数据,即您必须维护其当前状态的数据。

修改以下值以在整个教程中使用。

- Machine type: n2-standard-2
- Project: my-project
- Zone: europe-west1-c
- Name of one of the VMs to migrate: my-instance-1

创建自定义映像

如果您的应用或其任何要求已在现有引导磁盘上配置,请创建一个您可以重复使用的自定义映像。或者,如果您的应用只需使用启动脚本即可安装、配置和启动,请跳过此步骤并继续执行创建实例模板部分。

在前面介绍的示例场景中,每个现有独立虚拟机的启动磁盘都包含已配置的应用。因此,您可以按照以下步骤基于任何一个虚拟机创建自定义映像

  1. 停止其中一个实例。

    gcloud compute instances stop my-instance-1
  2. 通过描述该实例来确定磁盘的来源。

    gcloud compute instances describe my-instance-1

    输出内容类似如下:

    ...
    disks:
    – autoDelete: true
      boot: true
      ...
      source: https://www.googleapis.com/compute/v1/projects/my-project/zones/europe-west1-c/disks/my-instance-1
      ...
    

    在输出中找到 source 字段,并记下该字段中启动磁盘的完整网址。

  3. 使用 images create 命令准备使用同一来源的自定义映像。

    gcloud compute images create my-boot-image \
        --source-disk=https://www.googleapis.com/compute/v1/projects/my-project/zones/europe-west1-c/disks/my-instance-1
    

    输出内容类似如下:

    Created [https://www.googleapis.com/compute/v1/projects/my-project/global/images/my-boot-image].
    

创建实例模板

实例模板是存储虚拟机配置的不可变 Compute Engine 资源。创建模板后,您无法更新该模板。如果您稍后需要更改该模板,请创建一个新模板,然后将新模板发布到该组。

按照创建新实例模板中的步骤操作,并使用以下设置。

  • 机器类型:指定适用于所有现有实例的机器类型

  • 启动脚本:如果您使用启动脚本启动您的应用,请指定该脚本。

  • 启动磁盘

    • 映像:为 MIG 中的所有虚拟机指定公共启动磁盘映像。比方说,如果您基于现有虚拟机的启动磁盘创建了自定义映像,请指定该映像。如果需要对特定虚拟机使用现有启动磁盘,您可以使用实例配置明确指定该虚拟机的启动磁盘,然后再将该虚拟机转换为代管式实例:如本文档后面部分所述。
    • 设备名称:指定一个反映磁盘用途的设备名称,例如 boot-disk。这样您就可以配置单个有状态政策,以保留 MIG 中具有该设备名称的所有磁盘。
    • 大小:指定足以容纳现有实例和未来实例的启动磁盘大小,以备您想要添加任何实例。
  • 额外磁盘:默认情况下,当您将实例添加到 MIG 时,MIG 会根据模板创建磁盘。请注意,实例模板不支持配置区域磁盘,但您以后可以改为使用实例配置来配置区域磁盘。

    • 设备名称:对于每个磁盘,指定一个反映磁盘用途的设备名称,例如 data-disk
    • 大小:指定足以容纳未来实例的磁盘大小,以备您想要添加任何实例。

在此迁移中,对每个额外磁盘最重要的规范是设备名称,该名称将用作指定哪些磁盘是有状态的密钥。通过为类似磁盘使用通用设备名称,您可以使用通用有状态政策保留 MIG 中所有这些磁盘。实例模板中针对额外磁盘的大小或映像的规范仅用于为在要迁移的实例之外可能创建的新实例创建新磁盘。迁移现有实例时,您通过将现有数据磁盘与原始实例分离,然后将相同的磁盘重新挂接到新的代管式实例来保留现有数据磁盘,如本文档后面部分所述。

以下 instance-templates create 命令会为示例场景创建模板。该命令包含一个 --image 标志(指向之前创建的自定义启动映像)和一个额外的数据磁盘。

gcloud compute instance-templates create my-instance-template \
 --machine-type=n2-standard-2 \
 --image=https://www.googleapis.com/compute/v1/projects/my-project/global/images/my-boot-image \
 --boot-disk-device-name=boot-disk \
 --create-disk=mode=rw,size=100,type=pd-standard,device-name=data-disk

输出内容类似如下:

Created [https://www.googleapis.com/compute/v1/projects/my-project/global/instanceTemplates/my-instance-template].
NAME                     MACHINE_TYPE   PREEMPTIBLE  CREATION_TIMESTAMP
my-instance-template  n2-standard-2               2021-04-27T11:02:07.552-07:00

请记下模板的网址,该网址可在输出的第一行中找到。

创建托管式实例组

下一步是创建托管式实例组 (MIG)。如需创建单可用区级 MIG,请按照在单个可用区中创建 MIG 中的说明操作。或者,如果要使用区域级 MIG 防止可用区级故障,请按照说明在区域中的多个可用区中创建具有虚拟机的 MIG

创建 MIG 时,请添加以下规范:

  • 将实例组大小设置为 0。以后您将添加实例。
  • 如果您要创建区域级 MIG,请将实例重新分布类型设置为 NONE,以使该 MIG 不会自动跨可用区重新分布实例。

以下 instance-groups managed create 命令会为上文所述的示例设置创建一个可用区级 MIG。如需创建区域级 MIG,请将 --zone=ZONE 替换为 --region=REGION

gcloud compute instance-groups managed create my-mig \
    --size=0 \
    --template=https://www.googleapis.com/compute/v1/projects/my-project/global/instanceTemplates/my-instance-template \
    --zone=europe-west1-c

输出内容类似如下:

Created [https://www.googleapis.com/compute/v1/projects/my-project/zones/europe-west1-c/instanceGroupManagers/my-mig].
NAME    LOCATION        SCOPE  BASE_INSTANCE_NAME  SIZE  TARGET_SIZE  INSTANCE_TEMPLATE         AUTOSCALED
my-mig  europe-west1-c  zone   my-mig              0     0            my-instance-template      no

创建该资源后,您可以使用它与 MIG 进行交互,例如,为实例组设置政策以及在实例组中添加或移除实例。

将现有虚拟机转换为代管式实例

对于每个现有非代管式虚拟机,请按照以下流程将其转换为 MIG 中的代管式实例。此流程会将现有磁盘迁移到新的代管式实例。或者,您也可以创建现有磁盘的快照,然后根据这些快照创建磁盘,以供代管式实例使用。

  1. 描述现有虚拟机。

    gcloud compute instances describe my-instance-1
    

    记下您要在现有虚拟机中保留的项,其中可以包括以下各项:

    • 实例名称
    • 启动磁盘
    • 辅助磁盘
    • 实例元数据
  2. 停止现有虚拟机。

    gcloud compute instances stop my-instance-1
    
  3. 分离所有有状态磁盘,包括启动磁盘(如果您计划重复使用)。

    gcloud compute instances detach-disk my-instance-1 --disk=my-data-disk-1
    
  4. 删除现有虚拟机,以便创建另一个同名的虚拟机。如果您不想保留实例名称,则可以稍后删除现有虚拟机,以停止为其付费。

    gcloud compute instances delete my-instance-1
    
  5. 按照相关步骤创建代管式实例

    • 如果删除了原始实例,则可以重复使用原始实例的名称。或者提供新名称。
    • 指定此代管式实例所需的有状态磁盘或元数据。MIG 会将这些特定于实例的项存储在个别实例配置中:

      • 指定一个或多个磁盘,例如与原始虚拟机实例分离的磁盘。

      • 指定来自原始虚拟机实例的元数据。

    例如,以下命令会创建一个与原始虚拟机同名的代管式实例,并重复使用原始数据磁盘。该虚拟机的启动磁盘是通过实例组的实例模板中指定的映像创建的。

    gcloud compute instance-groups managed create-instance my-mig \
        --instance=my-instance-1    \
        --stateful-metadata=role=primary      \
        --stateful-disk=device-name=data-disk,source=https://www.googleapis.com/compute/v1/projects/my-project/zones/europe-west1-c/disks/my-data-disk-1 \
        --zone=europe-west1-c
    

    如果您需要重复使用来自旧虚拟机的启动磁盘,请使用相同命令并附加 --stateful-disk 标志。为启动磁盘使用实例模板中指定的设备名称,例如:

    gcloud compute instance-groups managed create-instance my-mig \
        --instance=my-instance-1 \
        --stateful-metadata=role=secondary    \
        --stateful-disk=device-name=data-disk,source=https://www.googleapis.com/compute/v1/projects/my-project/zones/europe-west1-c/disks/my-data-disk-1 \
        --stateful-disk=device-name=boot-disk,source=https://www.googleapis.com/compute/v1/projects/my-project/zones/europe-west1-c/disks/my-instance-1-boot-disk \
        --zone=europe-west1-c
    
  6. 对每个现有的非代管式虚拟机重复上述步骤。

如果您要查看生成的个别实例配置,请运行 instance-configs list 命令

gcloud compute instance-groups managed instance-configs list my-mig \
    --zone=europe-west1-c

如需查看实例的保留状态,请运行 describe-instance 命令

gcloud compute instance-groups managed describe-instance my-mig \
  --instance=my-instance-1 \
  --zone=europe-west1-c

如需了解详情,请参阅在 MIG 中应用、查看和移除有状态配置

配置自动修复

MIG 会自动修复停止运行的代管式实例。如需进一步提高应用的可用性以及验证应用是否能正常响应,请配置基于应用的健康检查。如需查看示例命令,请参阅示例健康检查设置

使用有状态政策而不是个别实例配置

有状态政策可让您在 MIG 中将具有通用设备名称的磁盘声明为有状态。与多个实例配置相比,单个有状态政策需要管理的工作量较少。例如,使用有状态政策时,您可以针对 MIG 中的所有实例将设备名称为 data-disk 的所有磁盘指定为有状态。

如果您的 MIG 满足以下条件,则可以将实例配置替换为有状态政策:

  • 对于类似的有状态磁盘,所有虚拟机都具有相同的设备名称(例如 data-disk)。此设备名称在 MIG 的实例模板中定义。
  • 没有虚拟机在实例配置中指定唯一的有状态元数据。如果您在实例配置中定义了有状态元数据,则可以从实例配置中移除磁盘,但必须保留实例配置才能保留该特定于实例的有状态元数据。

请按照以下步骤将多个实例配置替换为单个有状态政策。

  1. 在有状态政策中配置有状态磁盘。按照为现有 MIG 中的磁盘设置和更新有状态配置中的说明进行操作。

    对于示例场景,请使用以下命令。它声明将保留 MIG 中具有特定设备名称的所有磁盘。

    gcloud compute instance-groups managed update my-mig \
      --stateful-disk=device-name=data-disk,auto-delete=never
    
  2. 如果您需要保留实例专用元数据,请更新个别实例配置。否则,请删除个别实例配置。使用 --update-instance 标志立即应用配置更改。例如,如需删除实例配置,请使用以下命令:

    gcloud compute instance-groups managed instance-configs delete my-mig \
      --instances=my-instance-1 \
      --update-instance
    
  3. (可选)验证有状态项现在是否存储在每个代管式实例的政策保留状态 (preservedStateFromPolicy) 中。如需了解详情,请参阅查看代管式实例的保留状态

添加更多虚拟机

如果您需要添加虚拟机来扩展应用,则可以通过增加 MIG 的大小手动创建更多实例来添加额外的虚拟机。MIG 会根据组的实例模板创建其所有虚拟机,包括其永久性磁盘。如果实例组具有有状态政策,则有状态政策中列出的任何项都会在实例组中的所有新实例和现有实例重启、重新创建、自动修复和更新操作后得到保留。如果您只需要为实例组中的特定虚拟机配置有状态磁盘或元数据,请使用个别实例配置

后续步骤