创建使用 Spot 虚拟机的 MIG

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

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

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

准备工作

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

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

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

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

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

    控制台

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

    gcloud

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

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

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

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

    如需了解详情,请参阅 Cloud de Confiance 身份验证文档中的使用 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. 在 Cloud de Confiance 控制台中,转到实例模板页面。

    转到“实例模板”

  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. 在 Cloud de Confiance 控制台中,前往实例群组页面。

    进入“实例组”

  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 的详细信息以查看其属性。

后续步骤