创建使用 Spot 虚拟机的 MIG

本文档介绍如何创建使用 Spot 虚拟机的代管式实例组 (MIG)。

Spot 虚拟机是一种可以以极低折扣价获得的虚拟机 (VM) 实例。不过,Compute Engine 可能会随时停止或删除 Spot 虚拟机来收回容量。您可以使用 Spot 虚拟机以较低的费用运行容错工作负载,例如批处理作业或无状态应用。

如需了解可用于创建 MIG 的其他方法,请参阅创建 MIG 的基本场景。

准备工作

  • 了解 Spot 虚拟机,尤其是限制。
  • 验证您是否有足够的配额用于要请求的资源。如需了解详情,请参阅分配配额。
  • 在为工作负载创建 Spot 虚拟机之前,请完成以下步骤:

    1. 配置工作负载以管理抢占。具体来说,我们建议您准备一个脚本来处理抢占,该脚本可以作为工作负载的一部分运行,也可以作为文件添加到虚拟机元数据中,以便在关停期间运行。如需查看相关说明,请参阅管理 Spot 虚拟机抢占。

    2. 我们强烈建议您查看 Spot 虚拟机的数据,以便选择合适的机器类型和位置。 通过选择资源可用性更高的机器类型和位置,您可以提高避免资源可用性错误的机会,并延长被抢占前的正常运行时间。

  • 如果您尚未设置身份验证,请进行设置。身份验证用于验证您的身份,以便访问 Google Cloud 服务和 API。如需从本地开发环境运行代码或示例,您可以通过选择以下选项之一向 Compute Engine 进行身份验证:

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后 使用联合身份登录 gcloud CLI。 登录后,运行以下命令来初始化 Google Cloud CLI:

      gcloud init
  • 设置默认区域和可用区。
  • REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭证。

      安装 Google Cloud CLI,然后 使用联合身份登录 gcloud CLI。

    如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证。

所需的角色

如需获得创建使用抢占式虚拟机的 MIG 所需的权限,请让您的管理员为您授予项目的 Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。

此预定义角色包含创建使用抢占式虚拟机的 MIG 所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需创建使用 Spot 虚拟机的 MIG,您需要拥有以下权限:

  • 如需创建实例模板:针对项目的 compute.instanceTemplates.create 权限
  • 如需创建 MIG:针对项目的 compute.instanceGroupManagers.create 权限

您也可以使用自定义角色或其他预定义角色来获取这些权限。

创建使用 Spot 虚拟机的 MIG

如需创建使用 Spot 虚拟机的 MIG,您必须完成以下步骤:

  1. 创建配置为用于创建 Spot 虚拟机的实例模板

  2. 创建区域级或可用区级 MIG

创建配置为创建 Spot 虚拟机的实例模板

如需创建配置为创建 Spot 虚拟机的实例模板,请选择以下选项之一:

控制台

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

    转到“实例模板”

  2. 点击创建实例模板。 系统会显示创建实例模板页面。

  3. 在名称字段中,输入实例模板的名称。

  4. 在位置部分中,选择要创建的实例模板类型:

    • 对于区域级实例模板,请选择区域级,然后选择要在其中创建模板的区域。根据您希望 Spot 虚拟机使用的机器类型,指定受支持的区域。

    • 对于全球实例模板,请选择全球。

  5. 在机器配置部分中,为 Spot 虚拟机选择支持的机器系列。

  6. 在预配模型部分中,执行以下操作:

    1. 在虚拟机预配模型列表中,选择 Spot。虚拟机预配模型高级设置部分随即展开。

    2. 在抢占通知时长列表中,根据您希望如何处理抢占选择一个选项。

      • 如果您选择 120 秒(推荐),请确保在创建 Spot 虚拟机之前,您已在工作负载中处理抢占。例如,验证您的工作负载是否包含一个用于保存进度的脚本,该脚本会等待直到检测到抢占时才运行。

      • 如果您选择0 秒(默认),请务必使用关停脚本处理抢占。在创建 Spot 虚拟机之前,请先创建一个包含关停脚本的文件,该脚本可在因抢占而关停时保存您的进度。按照后续步骤中的说明附加此关机脚本。

    3. 如需指定在抢占时是停止还是删除 Spot 虚拟机,请在虚拟机终止时列表中选择以下选项之一:

      • 如需停止 Spot 虚拟机,请选择停止。

      • 如需删除 Spot 虚拟机,请选择删除。

  7. 如需添加关机脚本,请完成以下步骤。如果您为抢占通知时长选择了 0 秒(默认),则必须执行此步骤来处理抢占。否则,如果您选择了 120 秒,则此步骤是可选的。

    1. 展开高级选项部分。
    2. 展开管理部分。
    3. 在元数据部分,点击 添加项。
    4. 在键字段中,输入 shutdown-script 作为元数据键。
    5. 在值字段中,添加可处理抢占的关停脚本的内容。
  8. 可选:如需更改启动磁盘类型或映像的默认值,请在启动磁盘部分中,点击更改。然后,按照提示更改启动磁盘。

  9. 点击创建。

gcloud

如需创建配置为创建竞价型虚拟机的实例模板,请使用 gcloud compute instance-templates create 命令。

以下命令会创建一个区域级实例模板。如果您要创建全球实例模板,请使用相同的命令,但不使用 --instance-template-region 标志。

gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --image-project=IMAGE_PROJECT \
    --image-family=IMAGE_FAMILY \
    --instance-template-region=REGION \
    --instance-termination-action=TERMINATION_ACTION \
    --machine-type=MACHINE_TYPE \
    --provisioning-model=SPOT \
    --preemption-notice-duration=PREEMPTION_NOTICE_DURATION \
    --metadata shutdown-script=SHUTDOWN_SCRIPT

替换以下内容:

  • INSTANCE_TEMPLATE_NAME:要创建的实例模板的名称。

  • IMAGE_PROJECT:映像所属的映像项目;例如 debian-cloud。如需详细了解支持的映像项目,请参阅公共映像。

  • IMAGE_FAMILY:映像系列。此项指定最新的未弃用操作系统映像。例如,如果您指定 debian-12,则系统会使用 Debian 12 映像系列中的最新版本。如需详细了解如何使用映像系列,请参阅映像系列最佳实践。

  • REGION:用于创建实例模板的区域。根据您希望竞价型虚拟机使用的机器类型,指定支持的区域。

  • TERMINATION_ACTION:指示 Compute Engine 在抢占时是停止还是删除 Spot 虚拟机。您必须指定是停止 (STOP) 还是删除 (DELETE) 虚拟机。

  • MACHINE_TYPE:适用于竞价型虚拟机的受支持机器类型。如果您指定 N1 机器类型,则必须添加 --accelerator 标志以定义要挂接到虚拟机的 GPU 的数量和类型。

  • PREEMPTION_NOTICE_DURATION:是否启用抢占通知时长。对于 gcloud CLI,该值必须为 120s 或 0s。

    • 如果您指定 120s(推荐),请在工作负载中处理抢占。(您也可以选择指定关机脚本。)

    • 如果您指定 0s(默认),请在关停脚本中处理抢占。

  • SHUTDOWN_SCRIPT:关停脚本。

    • 如果您将 PREEMPTION_NOTICE_DURATION 设置为 0s(默认值),则必须指定关机脚本才能处理抢占。如需详细了解如何设置关停脚本的格式和指定关停脚本,请参阅运行关停脚本。

    • 否则,如果您不想指定关机脚本,可以移除 --metadata shutdown-script 标志。

REST

如需创建配置为创建 Spot 虚拟机的实例模板,请发出以下 POST 请求之一:

例如,如需创建区域级实例模板,请发出如下请求:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceTemplates

{
  "name": "INSTANCE_TEMPLATE_NAME",
  "properties": {
    "disks": [
      {
        "boot": true,
        "initializeParams": {
          "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
        }
      }
    ],
    "machineType": "MACHINE_TYPE",
    "networkInterfaces": [
      {
        "network": "global/networks/default"
      }
    ],
    "scheduling": {
      "instanceTerminationAction": "TERMINATION_ACTION",
      "provisioningModel": "SPOT",
      "preemptionNoticeDuration": { "seconds": PREEMPTION_NOTICE_DURATION }
    },
    "metadata": {
      "items": [
        {
          "key": "shutdown-script",
          "value": "SHUTDOWN_SCRIPT"
        }
      ]
    }
  }
}

替换以下内容:

  • PROJECT_ID:要创建实例模板的项目 ID。

  • REGION:用于创建实例模板的区域。根据您希望竞价型虚拟机使用的机器类型,指定支持的区域。

  • INSTANCE_TEMPLATE_NAME:实例模板的名称。

  • IMAGE_PROJECT:映像所属的映像项目;例如 debian-cloud。如需详细了解支持的映像项目,请参阅公共映像。

  • IMAGE:指定以下其中一项:

    • 操作系统映像的特定版本,例如 debian-12-bookworm-v20240617。

    • 映像系列,其格式必须为 family/IMAGE_FAMILY。此项指定最新的未弃用操作系统映像。例如,如果您指定 family/debian-12,则系统会使用 Debian 12 映像系列中的最新版本。如需详细了解如何使用映像系列,请参阅映像系列最佳实践。

  • MACHINE_TYPE:适用于竞价型虚拟机的受支持机器类型。如果您指定 N1 机器类型,则必须添加 guestAccelerators 字段以定义要挂接到虚拟机的 GPU 的数量和类型。

  • TERMINATION_ACTION:指示 Compute Engine 在抢占时是停止还是删除 Spot 虚拟机。您必须指定是停止 (STOP) 还是删除 (DELETE) 虚拟机。

  • PREEMPTION_NOTICE_DURATION:是否启用抢占通知时长。对于 REST,该值必须为 120 或 0。

    • 如果您指定 120(推荐),请在工作负载中处理抢占。(您也可以选择指定关机脚本。)

    • 如果您指定 0(默认值),请在关停脚本中处理抢占。

  • SHUTDOWN_SCRIPT:关停脚本。

    • 如果您将 PREEMPTION_NOTICE_DURATION 设置为 0s(默认值),则必须指定关机脚本才能处理抢占。如需详细了解如何设置关停脚本的格式和指定关停脚本,请参阅运行关停脚本。

    • 否则,如果您不想指定关机脚本,则可以移除 metadata 字段和子字段。

  • TERMINATION_ACTION(可选):指定在 Compute Engine 抢占虚拟机时要执行的终止操作(STOP [默认行为] 或 DELETE)。

创建实例模板后,您可以查看模板的详细信息,以查看其属性。

创建区域级或可用区级 MIG

如需创建区域级或可用区级 MIG,请选择以下选项之一:

控制台

  1. 在 Google Cloud 控制台中,前往实例群组页面。

    进入“实例组”

  2. 点击创建实例组。 此时会打开创建实例组页面。

  3. 在名称字段中,输入 MIG 的名称。

  4. 在实例模板列表中,选择您在上一部分中创建的实例模板。

  5. 在实例数字段中,输入要在 MIG 中创建的竞价型虚拟机的数量。如果您的工作负载需要具有特定名称的虚拟机,请输入 0 以跳过此阶段的虚拟机创建。创建 MIG 后,向其中添加具有特定名称的虚拟机。

  6. 在位置部分中,指定您是要创建可用区级 MIG 还是区域级 MIG,如下所示:

    1. 如需创建可用区级 MIG,请选择单个可用区。或者,如需创建区域 MIG,请选择多个可用区。

    2. 为 MIG 选择区域和可用区。

  7. 点击创建。

gcloud

如需创建 MIG,请使用 gcloud compute instance-groups managed create 命令。

根据要创建的 MIG 类型,在命令中添加以下标志:

  • 如需创建可用区级 MIG,请添加 --zone 标志:

    gcloud compute instance-groups managed create INSTANCE_GROUP_NAME \
        --size=SIZE \
        --template=INSTANCE_TEMPLATE_URL \
        --zone=ZONE
    
  • 如需创建区域级 MIG,请添加 --region 标志:

    gcloud compute instance-groups managed create INSTANCE_GROUP_NAME \
        --size=SIZE \
        --template=INSTANCE_TEMPLATE_URL \
        --region=REGION
    

替换以下内容:

  • INSTANCE_GROUP_NAME:MIG 的名称。

  • INSTANCE_TEMPLATE_URL:您在上一部分中创建的实例模板的网址。网址可以包含实例模板的 ID 或名称。请指定以下某个值:

    • 对于区域级实例模板:projects/PROJECT_ID/regions/REGION/instanceTemplates/INSTANCE_TEMPLATE_ID

    • 对于全球实例模板:INSTANCE_TEMPLATE_ID

  • SIZE:要在 MIG 中创建的 Spot 虚拟机数量。如果您的工作负载需要特定的虚拟机名称,请指定 0 以跳过在此阶段创建虚拟机。创建 MIG 后,向其中添加具有特定名称的虚拟机。

  • ZONE:要用于创建可用区级 MIG 的可用区。如果您使用区域级实例模板创建 MIG,则必须指定与该模板位于同一区域内的可用区。

  • REGION:要创建区域级 MIG 的区域。 如果您使用区域级实例模板创建 MIG,则必须指定与模板的区域相同的区域。

REST

如需创建 MIG,请向以下方法之一发出 POST 请求:

  • 如需创建可用区级 MIG,请向 instanceGroupManagers.insert 方法发出 POST 请求:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers
    
    {
      "name": "INSTANCE_GROUP_NAME",
      "versions": [
        {
          "instanceTemplate": "INSTANCE_TEMPLATE_URL"
        }
      ],
      "targetSize": SIZE
    }
    
  • 如需创建区域级 MIG,请向 regionInstanceGroupManagers.insert 方法发出 POST 请求:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers
    
    {
      "name": "INSTANCE_GROUP_NAME",
      "instanceTemplate": "INSTANCE_TEMPLATE_URL",
      "targetSize": SIZE
    }
    

替换以下内容:

  • PROJECT_ID:要创建区域级或可用区级 MIG 的项目的 ID。

  • ZONE:要用于创建可用区级 MIG 的可用区。如果您使用区域级实例模板创建 MIG,则必须指定与该模板位于同一区域内的可用区。

  • REGION:要创建区域级 MIG 的区域。 如果您使用区域级实例模板创建 MIG,则必须指定与模板的区域相同的区域。

  • INSTANCE_GROUP_NAME:MIG 的名称。

  • INSTANCE_TEMPLATE_URL:您在上一部分中创建的实例模板的网址。网址可以包含实例模板的 ID 或名称。请指定以下某个值:

    • 对于区域级实例模板:projects/PROJECT_ID/regions/REGION/instanceTemplates/INSTANCE_TEMPLATE_ID

    • 对于全球实例模板:INSTANCE_TEMPLATE_ID

  • SIZE:要在 MIG 中创建的 Spot 虚拟机数量。如果您的工作负载需要特定的虚拟机名称,请指定 0 以跳过在此阶段创建虚拟机。创建 MIG 后,向其中添加具有特定名称的虚拟机。

创建 MIG 后,您可以查看 MIG 的详细信息以查看其属性。

后续步骤