限制 MIG 中虚拟机的运行时间


本文档介绍如何通过指定虚拟机的时间限制来自动终止托管式实例组 (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. 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 根据模板创建虚拟机时,系统会对每个虚拟机应用时间限制

您可以指定以下两种类型的时间限制之一:

  • 作为运行时长的时间限制
  • 作为终止时间的时间限制

如需为 MIG 中的虚拟机指定时间限制,请按照以下步骤操作:

  1. 创建具有虚拟机的运行时长虚拟机的终止时间的实例模板。

  2. 使用实例模板创建 MIG更新现有 MIG

限制

  • 您必须遵守独立式虚拟机的运行时间的限制

  • 创建实例模板以指定 MIG 中虚拟机的时间限制时,存在以下限制:

    • 您不能将终止操作设置为 STOP。MIG 仅支持 DELETE
    • 您不能使用 Spot 虚拟机。
  • 您无法在使用实例模板来限制虚拟机运行时间的 MIG 中创建调整大小请求

  • 您无法在启用了 EVEN 目标分布形状和主动式实例重新分布功能的区域级 MIG 中限制虚拟机的运行时间。

为虚拟机创建具有运行时长的实例模板

如需在 MIG 中的虚拟机运行一段时间后自动终止这些虚拟机,请在实例模板中设置运行时长上限 (maxRunDuration)。

控制台

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

    转到“实例模板”

  2. 点击创建实例模板

  3. 按如下方式选择位置

    • 如果要跨区域使用实例模板,请选择全球级
    • 如果要降低跨区域依赖性,请选择区域级
  4. 如果选择区域级,则选择要在其中创建实例模板的区域

  5. 可用性政策部分中,展开虚拟机预配模型高级设置

  6. 选中为虚拟机设置时间限制复选框。

  7. 时间限制类型字段中,选择按小时(默认)以将时间限制指定为时长。在下一个字段中输入时长(以小时为单位)。

  8. 虚拟机终止时列表中,选择删除

  9. 对于其他字段,接受默认值或根据需要进行修改。

  10. 点击创建

gcloud

使用 instance-templates create 命令。如需在特定时长后自动删除虚拟机,请添加 --max-run-duration 标志并将 --instance-termination-action 标志设置为 DELETE,如下所示:

  gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
      --max-run-duration=DURATION \
      --instance-termination-action=DELETE

替换以下内容:

  • INSTANCE_TEMPLATE_NAME:实例模板的名称。
  • DURATION:您希望虚拟机运行的时长。MIG 会在指定时长后自动删除虚拟机。

    将时长格式设置为天数、小时数、分钟数和秒数,后面分别跟 dhms。例如,指定 30m 表示 30 分钟时长,指定 1d2h3m4s 表示 1 天 2 小时 3 分钟 4 秒时长。最短时长为 30 秒 (30s),最长时长为 120 天 (120d)。

Terraform

如需使用 Terraform 创建实例模板,请使用 google_compute_instance_template 资源。如需创建在特定时长后自动删除虚拟机的实例模板,您必须添加 max_run_duration 参数并将 instance_termination_action 参数设置为 DELETE

如需了解详情,请参阅 google_compute_instance_template 资源的 Terraform 文档

REST

使用 instanceTemplates.insert 方法。 如需在特定时长后自动删除虚拟机,请添加 maxRunDuration 字段并将 instanceTerminationAction 字段设置为 DELETE,如下所示:

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

{
  "name": "INSTANCE_TEMPLATE_NAME",
  "properties": {
    "machineType": "MACHINE_TYPE",
    "networkInterfaces": [
      {
        "network": "global/networks/default",
        "accessConfigs": [
          {
            "name": "external-IP",
            "type": "ONE_TO_ONE_NAT"
          }
        ]
      }
    ],
    "disks": [
      {
        "type": "PERSISTENT",
        "boot": true,
        "mode": "READ_WRITE",
        "initializeParams":
        {
          "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
        }
      }
    ]
    "scheduling": {
      "maxRunDuration":
      {
        "seconds": DURATION
      },
      "instanceTerminationAction": "DELETE"
    }
  }
}

替换以下内容:

  • PROJECT_ID:您要在其中创建实例模板的项目的 ID
  • INSTANCE_TEMPLATE_NAME:实例模板的名称。
  • MACHINE_TYPE:实例组中虚拟机的预定义自定义机器类型。
  • IMAGE_PROJECT:映像所属的映像项目;例如 debian-cloud
  • IMAGEIMAGE_FAMILY:指定以下其中一项:

    • IMAGE:操作系统映像的特定版本;例如 debian-10-buster-v20200309

    • IMAGE_FAMILY映像系列。此项指定最新的未弃用操作系统映像。例如,如果您指定 family/debian-10,则系统会使用 Debian 10 映像系列中的最新版本。

  • DURATION:您希望虚拟机运行的时长。MIG 会在指定时长后自动删除虚拟机。

    将时长格式设置为天数、小时数、分钟数和秒数,后面分别跟 dhms。例如,指定 30m 表示 30 分钟时长,指定 1d2h3m4s 表示 1 天 2 小时 3 分钟 4 秒时长。最短时长为 30 秒 (30s),最长时长为 120 天 (120d)。

创建具有虚拟机的终止时间的实例模板

如需在特定时间自动终止 MIG 中的虚拟机,请在实例模板中设置终止时间 (terminationTime)。您可以设置希望 MIG 终止虚拟机的日期和时间。

控制台

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

    转到“实例模板”

  2. 点击创建实例模板

  3. 按如下方式选择位置

    • 如果要跨区域使用实例模板,请选择全球级
    • 如果要降低跨区域依赖性,请选择区域级
  4. 如果选择区域级,则选择要在其中创建实例模板的区域

  5. 可用性政策部分中,展开虚拟机预配模型高级设置

  6. 时间限制类型字段中,选择按日期指定时间限制作为时间和日期。在下一个字段中,点击 选择日期和时间,然后选择自动终止的日期、时间和时区。

  7. 虚拟机终止时列表中,选择删除

  8. 对于其他字段,接受默认值或根据需要进行修改。

  9. 点击创建

gcloud

使用 instance-templates create 命令。如需在特定时间自动删除虚拟机,请添加 --termination-time 标志并将 --instance-termination-action 标志设置为 DELETE,如下所示:

  gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \
      --termination-time=TIME \
      --instance-termination-action=DELETE

替换以下内容:

  • INSTANCE_TEMPLATE_NAME:实例模板的名称。
  • TIME:您希望此虚拟机自动终止的时间。您指定的时间必须至少是未来 30 秒,最长是未来 120 天。将时间格式设置为 RFC 3339 时间戳

    YYYY-MM-DDTHH:MM:SSOFFSET
    

    请替换以下内容:

    • YYYY-MM-DD:采用 4 位数格式的日期,2 位数月份和 2 位数日期(用连字符分隔)。
    • HH:MM:SS:采用 24 小时制的 2 位数小时,2 位数分钟和 2 位数秒(用冒号分隔)。
    • OFFSET:采用世界协调时间 (UTC) 的偏移量格式的时区。例如,要使用太平洋标准时间 (PST),比世界协调时间 (UTC) 早 8 小时,请指定 -08:00。或者,如需不使用偏移 (UTC+0),请指定 Z

REST

使用 instanceTemplates.insert 方法。 如需在特定时间自动删除虚拟机,请添加 terminationTime 字段并将 instanceTerminationAction 字段设置为 DELETE,如下所示:

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

{
  "name": "INSTANCE_TEMPLATE_NAME",
  "properties": {
    "machineType": "MACHINE_TYPE",
    "networkInterfaces": [
      {
        "network": "global/networks/default",
        "accessConfigs": [
          {
            "name": "external-IP",
            "type": "ONE_TO_ONE_NAT"
          }
        ]
      }
    ],
    "disks": [
      {
        "type": "PERSISTENT",
        "boot": true,
        "mode": "READ_WRITE",
        "initializeParams":
        {
          "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
        }
      }
    ]
    "scheduling": {
      "terminationTime": TIME,
      "instanceTerminationAction": "DELETE"
    }
  }
}

替换以下内容:

  • PROJECT_ID:您要在其中创建实例模板的项目的 ID
  • INSTANCE_TEMPLATE_NAME:实例模板的名称。
  • MACHINE_TYPE:实例组中虚拟机的预定义自定义机器类型。
  • IMAGE_PROJECT:映像所属的映像项目;例如 debian-cloud
  • IMAGEIMAGE_FAMILY:指定以下其中一项:

    • IMAGE:操作系统映像的特定版本;例如 debian-10-buster-v20200309

    • IMAGE_FAMILY映像系列。此项指定最新的未弃用操作系统映像。例如,如果您指定 family/debian-10,则系统会使用 Debian 10 映像系列中的最新版本。

  • TIME:您希望此虚拟机自动终止的时间。您指定的时间必须至少是未来 30 秒,最长是未来 120 天。将时间格式设置为 RFC 3339 时间戳

    YYYY-MM-DDTHH:MM:SSOFFSET
    

    请替换以下内容:

    • YYYY-MM-DD:采用 4 位数格式的日期,2 位数月份和 2 位数日期(用连字符分隔)。
    • HH:MM:SS:采用 24 小时制的 2 位数小时,2 位数分钟和 2 位数秒(用冒号分隔)。
    • OFFSET:采用世界协调时间 (UTC) 的偏移量格式的时区。例如,要使用太平洋标准时间 (PST),比世界协调时间 (UTC) 早 8 小时,请指定 -08:00。或者,如需不使用偏移 (UTC+0),请指定 Z

时间限制对 MIG 中的虚拟机的工作原理

为 MIG 中的虚拟机指定时间限制时,系统会在虚拟机的终止时间戳 (terminationTimestamp) 字段中自动设置 MIG 终止虚拟机的时间。

根据您指定的时间限制类型,虚拟机的终止时间戳设置如下:

  • 作为运行时长 (maxRunDuration) 的时间限制:

    虚拟机的 terminationTimestamp = 虚拟机的最新创建或开始时间 + maxRunDuration

    指定时长时,终止时间戳根据虚拟机的最新创建或开始时间进行设置。如果重新创建、重启、恢复或替换虚拟机,则会重新计算终止时间戳。终止时间戳可能因 MIG 中的虚拟机而异,具体取决于每个虚拟机上次创建或启动的时间。例如,如果修复虚拟机,则通过将时长与修复期间重新创建虚拟机的时间相加来重新计算虚拟机的终止时间戳。

  • 作为终止时间 (terminationTime) 的时间限制:

    虚拟机的 terminationTimestamp = terminationTime

    指定时间时,终止时间戳会设置为该时间,前提是该时间是未来的时间。如果终止时间已过,则尝试创建、重启或替换虚拟机的任何 MIG 操作都将失败,并显示错误。如需解决此类错误,您必须创建一个具有未来终止时间的新实例模板,并将该模板应用于 MIG。如果您想要在新模板中使用现有模板属性,请根据现有模板创建实例模板

在虚拟机刷新期间,终止时间戳不会更改。例如,如果您将更新的中断级别设置为 REFRESH,则每当 MIG 更新虚拟机时,都会保留终止时间戳。

无论时间限制如何,当您暂停或停止 MIG 中的虚拟机时,终止时间戳都会自动清除。当您恢复或启动虚拟机时,系统会根据时间限制类型再次设置终止时间戳,如本部分前面所述。

设置时间限制后自动扩缩的工作原理

自动扩缩功能可让您的 MIG 根据负载的增减自动添加或移除虚拟机。当 MIG 删除已达到其终止时间戳的虚拟机时,MIG 会创建新虚拟机以保持自动扩缩器的建议大小。新虚拟机会在指定的时间限制内运行。如果自动扩缩器建议减少虚拟机数量,则 MIG 会在虚拟机达到时间限制之前将其删除。

如果您已配置扩缩时间表,则虚拟机仅会运行到时间表结束或虚拟机达到其终止时间戳(以先发生者为准)。

后续步骤