使用虚拟机预留确保资源可用性

本文档介绍了如何创建在预留资源上运行的作业,以及如何阻止作业使用预留。

预留是 Compute Engine 的一项功能。预留可为具有指定硬件配置的一台或多台虚拟机提供非常高的容量保障。 虚拟机的预留会产生该虚拟机的费用,从您创建预留时开始,一直到您删除预留时结束。但是,当您使用该虚拟机时,总费用相当于没有预留的虚拟机。

一般来说,当容量可用性至关重要或为了防止获取资源时出错时,预留非常有用。 对于 Batch,请考虑使用专用预留来帮助缩短作业调度时间,或者尝试在使用现有预留时使用它们。 如果您有未充分利用的预留(例如,享受 承诺使用折扣所需的预留),您 可以将作业配置为尝试在使用预留时使用它们,以 帮助优化产生的费用。或者,如果您想优先考虑项目中其他工作负载的资源可用性,可以明确阻止作业使用预留。

如需详细了解预留,请参阅 Compute Engine 文档中的预留。 如需详细了解如何为工作负载选择要使用的可获取性功能,请参阅 提高资源可获取性

准备工作

  1. 如果您之前未使用过 Batch,请查看 Batch 使用入门 ,并完成 项目和用户的前提条件以启用 Batch。
  2. 确保您拥有 创建预留查看现有预留 的权限,以便作业的虚拟机可以根据需要使用预留。
  3. 如需获得创建作业所需的权限,请让您的管理员授予您以下 IAM 角色:

    如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

    您也可以通过自定义 角色或其他预定义 角色来获取所需的权限。

限制

除了预留的 一般限制之外, Batch 还具有以下限制:

  • 如果作业的虚拟机或预留指定了 紧凑布置政策,则作业的虚拟机无法使用预留。
  • 如果您使用 Google Cloud 控制台创建作业,则其虚拟机将自动 使用匹配的预留。如需使用特定预留或阻止虚拟机使用预留,您必须在使用 gcloud CLI 或 Batch API 创建作业时定义 reservation 字段。

要求

本部分总结了作业的虚拟机使用预留的要求。 如需详细了解所有要求,请参阅 Compute Engine 文档中 预留的一般要求 ,以及本文档后面 规划配置的步骤

  • 如需让作业的虚拟机通常能够使用预留,必须满足以下所有条件:

    • 作业和预留必须指定完全匹配的虚拟机属性。

    • 您必须遵守本文档中的所有限制以及预留的所有其他一般要求。

  • 如需让作业的每个虚拟机都能成功使用预留,预留必须在虚拟机的运行时具有可用的未使用容量。

    预留的未使用容量是指其虚拟机数量与当前使用它的虚拟机数量之间的差值。 只要您有未使用的预留容量,虚拟机就会尝试使用预留。因此,虚拟机可以在创建时或在运行时稍后开始使用预留。在虚拟机停止运行或预留被删除之前,虚拟机不会停止使用预留。

    根据您未使用的预留总容量,作业的虚拟机可能不会使用任何预留、使用部分预留或使用所有预留,并且预留的虚拟机数量可能会在作业的整个运行时发生变化。

创建和运行可以使用预留虚拟机的作业

  1. 规划配置。 如需确保作业和预留兼容,请完成以下步骤。

    如果您想使用已有的预留,则必须创建具有相应配置的作业。否则,如果您计划创建新的预留,请选择您偏好的配置选项。

    1. 确定预留属性。由于存在限制, 共享类型必须为 单项目,这是预留的默认 选项。 确定您要用于以下预留属性的值:

      • 使用类型*
      • 虚拟机数量

      *预留的 使用类型明确定向自动使用) 决定了哪些虚拟机可以使用预留。

      虚拟机数量表示预留的总容量。 在确定此值时,请考虑 作业的虚拟机数量

    2. 确定作业和预留的虚拟机属性。 由于存在限制,作业和预留都不能指定紧凑布置政策,这是预留和作业的默认选项。 确定您要用于以下虚拟机属性的值,这些属性对于预留和作业必须 完全匹配:

      • 项目
      • 可用区*
      • 机器类型
      • 满足最低要求的 CPU 平台(如果有
      • GPU 类型和数量(如果有
      • 本地 SSD 类型和数量(如果有
      • 预留亲和性#

      *作业虚拟机必须与 预留虚拟机位于同一可用区。如果使用 allowedLocations[] 字段,您必须将此可用区包含在作业的 allowedLocations[] 字段中。否则,如果省略 allowedLocations[] 字段,您必须将作业的位置设置为包含此可用区的区域。

      作业必须使用 policy子字段或 虚拟机实例模板定义所有这些属性。 作业不能指定 policy 子字段和模板的组合。

      不能为一个资源定义可选字段,而从另一个资源中 省略该字段。为预留和作业定义或省略可选字段。如果作业指定了虚拟机实例模板,这也适用于指定模板的字段。

      #预留的 使用类型 决定了作业的虚拟机所需的预留亲和性,您必须在作业中指定该亲和性,如下所示:

      • 如果作业使用虚拟机实例模板,则模板需要 按照预留文档中的说明配置预留亲和性
      • 如果作业未使用模板且预留是 明确定向的,请在作业的 reservation 字段中指定预留的名称。
      • 否则,如果作业未使用模板且预留是 自动使用的,请省略作业的 reservation字段。
  2. 准备预留。如果您尚未创建预留,请 创建您希望作业的虚拟机使用的预留 。确保预留具有您计划的属性。

  3. 创建并运行作业。您可以使用 gcloud CLI 或 Batch API 创建和运行作业,该作业会使用准备好的预留中的虚拟机:

    gcloud

    1. 创建一个 JSON 文件,该文件指定作业的配置详细信息 ,并将 虚拟机实例资源 (instances[]) 子字段 设置为与预留的虚拟机属性完全匹配。

      例如,如需创建使用预留中的虚拟机的基本脚本作业,请创建一个包含以下内容的 JSON 文件。

      {
        "taskGroups": [
          {
            "taskSpec": {
              "runnables": [
                {
                  "script": {
                    "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                  }
                }
              ]
            },
            "taskCount": 3
          }
        ],
        "allocationPolicy": {
          "instances": [
            {
              VM_RESOURCES
            }
          ],
        },
        "logsPolicy": {
          "destination": "CLOUD_LOGGING"
        }
      }
      

      VM_RESOURCES 替换为与您希望作业使用的预留匹配的虚拟机资源,方法是指定您在之前的步骤中计划的 instances[] 子字段。

      例如,从以下 VM_RESOURCES 值开始:

      "installGpuDrivers": INSTALL_GPU_DRIVERS,
      "policy": {
        "machineType": "MACHINE_TYPE",
        "minCpuPlatform": "MIN_CPU_PLATFORM",
        "provisioningModel": "PROVISIONING_MODEL",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_URL"
      }
      

      在使用此值之前,请根据以下所有问题对其进行更新:

      1. 您是否要使用实例模板?

        • : 将 policy 字段替换为 instanceTemplate 字段,并指定与预留匹配的现有虚拟机实例模板。例如,请参阅 使用虚拟机实例模板 的说明,并通过 查看本文档中的其余问题来验证实例模板的 properties 字段。如果 预留使用 GPU 或本地 SSD,则您还需要 配置 installGpuDrivers 字段配置本地 SSD 的 volumes[] 字段 。然后,提交作业。

        • : 将 MACHINE_TYPE 替换为与预留相同的机器类型。

      2. 预留是否包含满足最低要求的 CPU 平台?

        • : 将 MIN_CPU_PLATFORM 替换为相同的满足最低要求的 CPU 平台。

        • : 移除 minCpuPlatform 字段。

      3. 预留是否包含 GPU?

        • : 完成以下步骤。

          1. 替换 INSTALL_GPU_DRIVERS 并指定此作业安装 GPU 驱动程序所需的任何其他字段。如需相关说明,请参阅 安装 GPU 驱动程序
          2. 根据您的 使用选项替换 PROVISIONING_MODEL :对于预留,使用 STANDARD(默认);对于日历模式预留,使用 RESERVATION_BOUND
          3. 根据您的 GPU 机器类型更新 accelerators[] 字段:

            • 如果您使用的是加速器优化机器类型,请移除 accelerators[] 字段。
            • 否则,如果您使用的是 N1 加速器优化机器类型,请替换 GPU_TYPEGPU_COUNT 以匹配预留。
        • : 移除 installGpuDrivers 字段、provisioningModel 字段和 accelerators[] 字段。

      4. 预留是否包含本地 SSD?

      5. 预留是否使用明确定向使用类型?

        • : 将 SPECIFIC_RESERVATION_URL 替换为以下内容:

          projects/RESERVATION_OWNER_PROJECT_ID/reservations/RESERVATION_NAME
          

          替换以下内容:

          • RESERVATION_OWNER_PROJECT_ID 替换为预留所在项目的项目 ID。

          • RESERVATION_NAME 替换为预留的名称。

        • : 移除 reservation 字段。

      例如,假设您使用的是自动使用预留,用于不指定任何满足最低要求的 CPU 平台、GPU 或本地 SSD 的 n2-standard-32 虚拟机。此外,您不想指定虚拟机实例模板。 在这种情况下,您必须将 VM_RESOURCES 替换为以下值:

      "policy": {
        "machineType": "n2-standard-32"
      }
      
    2. 如需创建和运行作业,请使用 gcloud batch jobs submit 命令

      gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
      

      替换以下内容:

      • JOB_NAME:作业的名称。

      • LOCATION:作业的位置 。如需使用预留,作业的 Compute Engine 资源必须在与预留相同的可用区中创建。

      • JSON_CONFIGURATION_FILE:包含作业配置详细信息的 JSON 文件的路径。

    API

    jobs.create方法 发出POST请求,该方法会将 虚拟机实例资源 (instances[]) 子字段 设置为与预留的虚拟机属性完全匹配。

    例如,如需创建使用预留中的虚拟机的基本脚本作业,请发出以下请求:

    POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            VM_RESOURCES
          }
        ],
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    替换以下内容:

    • PROJECT_ID:您的项目的 项目 ID

    • LOCATION:作业的位置 。如需使用预留,作业的 Compute Engine 资源必须在与预留相同的可用区中创建。

    • JOB_NAME:作业的名称。

    • VM_RESOURCES:与您希望作业使用的预留匹配的虚拟机资源,方法是指定您在之前的步骤中计划的 instances[] 子字段。

      例如,从以下 VM_RESOURCES 值开始:

      "installGpuDrivers": INSTALL_GPU_DRIVERS,
      "policy": {
        "machineType": "MACHINE_TYPE",
        "minCpuPlatform": "MIN_CPU_PLATFORM",
        "provisioningModel": "PROVISIONING_MODEL",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_URL"
      }

      在使用此值之前,请根据以下所有问题对其进行更新:

      1. 您是否要使用实例模板?

        • : 将 policy 字段替换为 instanceTemplate 字段,并指定与预留匹配的现有虚拟机实例模板。例如,请参阅 使用虚拟机实例模板 的说明,并通过 查看本文档中的其余问题来验证实例模板的 properties 字段。如果 预留使用 GPU 或本地 SSD,则您还需要 配置 installGpuDrivers 字段配置本地 SSD 的 volumes[] 字段 。然后,提交作业。

        • : 将 MACHINE_TYPE 替换为与预留相同的机器类型。

      2. 预留是否包含满足最低要求的 CPU 平台?

        • : 将 MIN_CPU_PLATFORM 替换为相同的满足最低要求的 CPU 平台。

        • : 移除 minCpuPlatform 字段。

      3. 预留是否包含 GPU?

        • : 完成以下步骤。

          1. 替换 INSTALL_GPU_DRIVERS 并指定此作业安装 GPU 驱动程序所需的任何其他字段。如需相关说明,请参阅 安装 GPU 驱动程序
          2. 根据您的 使用选项替换 PROVISIONING_MODEL :对于预留,使用 STANDARD(默认);对于日历模式预留,使用 RESERVATION_BOUND
          3. 根据您的 GPU 机器类型更新 accelerators[] 字段:

            • 如果您使用的是加速器优化机器类型,请移除 accelerators[] 字段。
            • 否则,如果您使用的是 N1 加速器优化机器类型,请替换 GPU_TYPEGPU_COUNT 以匹配预留。
        • : 移除 installGpuDrivers 字段、provisioningModel 字段和 accelerators[] 字段。

      4. 预留是否包含本地 SSD?

        • : 替换 LOCAL_SSD_SIZELOCAL_SSD_NAME 以匹配预留, 并通过向作业添加 volumes[] 字段 来挂载本地 SSD。例如,请参阅 使用本地 SSD的代码示例。

        • : 移除 disks[] 字段。

      5. 预留是否使用明确定向使用类型?

        • : 将 SPECIFIC_RESERVATION_URL 替换为以下内容:

          projects/RESERVATION_OWNER_PROJECT_ID/reservations/RESERVATION_NAME
          

          替换以下内容:

          • RESERVATION_OWNER_PROJECT_ID 替换为预留所在项目的项目 ID。

          • RESERVATION_NAME 替换为预留的名称。

        • : 移除 reservation 字段。

      例如,假设您使用的是自动使用预留,用于不指定任何满足最低要求的 CPU 平台、GPU 或本地 SSD 的 n2-standard-32 虚拟机。此外,您不想指定虚拟机实例模板。 在这种情况下,您必须将 VM_RESOURCES 替换为以下值:

      "policy": {
        "machineType": "n2-standard-32"
      }

创建和运行无法使用预留虚拟机的作业

如需阻止作业使用任何预留,请将 reservation字段 设置为 NO_RESERVATION。如需详细了解如何阻止使用预留 ,请参阅 Compute Engine 文档中的阻止计算实例使用预留

您可以使用 gcloud CLI 或 Batch API 创建和运行无法使用任何预留虚拟机的作业。

gcloud

  1. 创建一个 JSON 文件,该文件指定作业的配置详细信息,并将 reservation 字段设置为 NO_RESERVATION

    例如,如需创建无法使用预留的基本脚本作业,请创建一个包含以下内容的 JSON 文件:

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            "policy": {
              "reservation": "NO_RESERVATION"
            }
          }
        ],
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    
  2. 如需创建和运行作业,请使用 gcloud batch jobs submit 命令

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    替换以下内容:

    • JOB_NAME:作业的名称。

    • LOCATION:作业的位置

    • JSON_CONFIGURATION_FILE:包含作业配置详细信息的 JSON 文件的路径。

API

jobs.create方法 发出POST请求,该方法会将reservation字段设置为NO_RESERVATION

例如,如需创建无法使用预留的基本脚本作业,请发出以下请求:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
            }
          }
        ]
      },
      "taskCount": 3
    }
  ],
  "allocationPolicy": {
    "instances": [
      {
        "policy": {
          "reservation": "NO_RESERVATION"
        }
      }
    ],
  },
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

替换以下内容:

  • PROJECT_ID:您的项目的 项目 ID

  • LOCATION:作业的位置

  • JOB_NAME:作业的名称。

后续步骤