本文档介绍了如何创建在预留资源上运行的作业,以及如何阻止作业使用预留。
预留是 Compute Engine 的一项功能。预留为获取具有指定硬件配置的一个或多个虚拟机的容量提供了极高保障。虚拟机预留会产生相应虚拟机的费用,从您创建预留时开始,一直到您删除预留时为止。不过,当您使用该虚拟机时,总费用相当于没有预留的虚拟机的费用。
一般来说,当容量可用性至关重要时,或者为了防止获取资源时出错,预留非常有用。对于 Batch,请考虑使用专用预留来帮助缩短作业调度时间,或者尝试在现有预留未被使用时使用它们。 如果您有未充分利用的预留(例如承诺使用折扣所需的预留),您可以配置作业,使其在预留未被使用时尝试使用这些预留,以帮助优化产生的费用。或者,如果您想优先确保项目中的其他工作负载能够使用资源,可以明确阻止某个作业使用预留。
如需详细了解预留,请参阅 Compute Engine 预留文档。
准备工作
- 如果您之前未使用过 Batch,请查看开始使用 Batch 并完成项目和用户的前提条件,以启用 Batch。
- 确保您拥有创建预留或查看现有预留的权限,以便根据需要让作业的虚拟机使用预留。
- 
  
  
  
  
  
  
  
    
    
    
    
    
    
      
      
        
        
        
        
        
      
    
      
      
        
        
        
        
        
      
    
    
    
    
    
  
  如需获得创建作业所需的权限,请让您的管理员为您授予以下 IAM 角色: - 
  
  
    
      项目的 Batch Job Editor  (roles/batch.jobsEditor)
- 
  
  
    
      作业的服务账号(默认情况下为默认 Compute Engine 服务账号)的 Service Account User (roles/iam.serviceAccountUser)
 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。 
- 
  
  
    
      项目的 Batch Job Editor  (
限制
除了预留的一般限制之外,Batch 还具有以下限制:
- 作业的虚拟机无法使用共享预留。
- 如果作业的虚拟机和预留都指定了紧凑布置政策,则作业的虚拟机无法使用预留。
- 如果您使用 Google Cloud 控制台创建作业,则该作业的虚拟机将自动使用匹配的预留。如需使用特定预留或阻止虚拟机使用预留,您必须在使用 gcloud CLI 或 Batch API 创建作业时定义 reservation字段。
要求
本部分总结了作业的虚拟机使用预留的相关要求。 如需详细了解所有要求,请参阅 Compute Engine 文档中的预留的一般要求以及本文档后面的配置规划流程。
- 如需使作业的虚拟机能够普遍使用预留,必须满足以下所有条件: - 作业和预留必须指定完全匹配的虚拟机属性。 
- 您必须遵守本文档中的所有限制以及与预留相关的所有其他一般要求。 
 
- 为了让作业的每个虚拟机都能成功使用预留,预留必须在虚拟机的运行时间内有可用的未使用容量。 - 预留的未使用容量是指其虚拟机数量与当前使用该预留的虚拟机数量之间的差值。只要有未使用的预留容量,虚拟机就会尝试使用预留。因此,虚拟机可以在创建时或稍后在其运行时开始使用预留。在虚拟机停止运行或预留被删除之前,虚拟机不会停止使用预留。 - 根据未使用的预留容量总数,作业的部分或全部虚拟机可能会使用预留,也可能不使用预留;并且在作业的整个运行时间内,预留的虚拟机数量可能会有所不同。 
创建并运行可使用预留虚拟机的作业
- 规划配置。 为确保作业和预留兼容,请完成以下步骤。 - 如果您想使用已有的预留,必须创建具有相应配置的作业。否则,如果您计划创建新的预留,请选择您偏好的配置选项。 - 确定预留属性。由于存在这些限制,共享类型必须为单项目,这是预留的默认选项。 确定您要用于以下预留属性的值: - 使用类型*
- 虚拟机数量†
 
- 确定作业和预留的虚拟机属性。 由于存在这些限制,作业和预留都无法指定紧凑布置政策,而紧凑布置政策是预留和作业的默认选项。 确定您要用于以下虚拟机属性的值,这些值必须与预留和作业的 完全一致: - 项目
- 可用区*
- 机器类型†
- 满足最低 CPU 要求的平台†(如果有‡)
- GPU 类型和数量†(如有‡)
- 本地 SSD 类型和数量†(如有‡)
- 预留亲和性†#
 - *作业虚拟机必须与预留虚拟机位于同一可用区。您必须将此地区包含在作业的 - allowedLocations[]字段中,或者(如果省略- allowedLocations[]字段)将作业的位置设置为包含此地区的区域。- †作业必须使用 - policy子字段或虚拟机实例模板定义所有这些属性。作业不能同时指定- policy子字段和模板。- ‡ 不能为一种资源定义可选字段,而从另一种资源中省略该字段。为预留和作业定义或省略可选字段。如果作业指定了虚拟机实例模板,则此规则也适用于指定模板的字段。 - #预留的使用类型决定了作业的虚拟机所需的预留亲和性,您必须在作业中指定该亲和性,如下所示: - 如果作业使用虚拟机实例模板,则该模板需要配置预留亲和性,如预留文档中所述。
- 如果作业未使用模板,并且预留是专门针对的,请在作业的 reservation字段中指定预留的名称。
- 否则,如果作业未使用模板且预留会自动消耗,请省略作业的 reservation字段。
 
 
- 准备预留。创建您希望作业的虚拟机使用的预留(如果尚未创建)。确保预留具有您计划的属性。 
- 创建并运行作业。您可以使用 gcloud CLI 或 Batch API 创建并运行作业,以使用已准备好的预留中的虚拟机: - gcloud- 创建一个 JSON 文件,用于指定作业的配置详细信息,该文件会将 VM 实例资源 ( - 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", "accelerators": [ { "type": "GPU_TYPE", "count": GPU_COUNT } ], "disks": [ { "newDisk": { "sizeGb": LOCAL_SSD_SIZE, "type": "local-ssd" }, "deviceName": "LOCAL_SSD_NAME" } ], "reservation": "SPECIFIC_RESERVATION_NAME" }- 如需使用此值,请做出以下所有更改: - 您是否要使用实例模板? - 是:将 - policy字段替换为- instanceTemplate字段,并指定与预留匹配的现有虚拟机实例模板。例如,请参阅使用虚拟机实例模板的代码示例。 如果预留使用 GPU 或本地 SSD,您还需要分别配置作业的- installGpuDrivers字段和- volumes[]字段。否则,请跳过其余更改。
- 否:将 - MACHINE_TYPE替换为与预留相同的机器类型。
 
- 预留是否包含满足最低要求的 CPU 平台? - 是:将 - MIN_CPU_PLATFORM替换为相同的最低要求 CPU 平台。
- 否:移除 - minCpuPlatform字段。
 
- 预留是否包含 GPU? - 是:替换 - INSTALL_GPU_DRIVERS、- GPU_TYPE和- GPU_COUNT以与预留匹配。 例如,请参阅使用 GPU 的代码示例。
- 否:移除 - installGpuDrivers字段和- accelerators[]字段。
 
- 预留是否包含本地 SSD? - 是:替换 - LOCAL_SSD_SIZE和- LOCAL_SSD_NAME以匹配预留,并通过向作业添加- volumes[]字段来装载本地 SSD。例如,请参阅使用本地 SSD 的代码示例。
- 否:移除 - disks[]字段。
 
- 预留是否采用明确定向的使用类型? - 是:将 - SPECIFIC_RESERVATION_NAME替换为预留的名称。
- 否:移除 - reservation字段。
 
 - 例如,假设您正在使用一个自动消耗的 - n2-standard-32虚拟机预留,该预留未指定任何满足最低要求的 CPU 平台、GPU 或本地 SSD。此外,您也不想指定虚拟机实例模板。在这种情况下,您必须将- VM_RESOURCES替换为以下值:- "policy": { "machineType": "n2-standard-32" }
- 如需创建并运行作业,请使用 - gcloud batch jobs submit命令:- gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE- 替换以下内容: - JOB_NAME:作业的名称。
- LOCATION:作业的位置。除非作业指定了- allowedLocations[]字段,否则此值必须是包含预留可用区的区域。
- 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:作业的位置。除非作业指定了- allowedLocations[]字段,否则此值必须是包含预留可用区的区域。
- JOB_NAME:作业的名称。
- VM_RESOURCES:与您希望作业使用的预留相匹配的虚拟机资源,通过指定您在之前步骤中规划的- instances[]子字段来设置。- 例如,从以下 - VM_RESOURCES值开始:- "installGpuDrivers": INSTALL_GPU_DRIVERS, "policy": { "machineType": "MACHINE_TYPE", "minCpuPlatform": "MIN_CPU_PLATFORM", "accelerators": [ { "type": "GPU_TYPE", "count": GPU_COUNT } ], "disks": [ { "newDisk": { "sizeGb": LOCAL_SSD_SIZE, "type": "local-ssd" }, "deviceName": "LOCAL_SSD_NAME" } ], "reservation": "SPECIFIC_RESERVATION_NAME" } - 如需使用此值,请做出以下所有更改: - 您是否要使用实例模板? - 是:将 - policy字段替换为- instanceTemplate字段,并指定与预留匹配的现有虚拟机实例模板。例如,请参阅使用虚拟机实例模板的代码示例。 如果预留使用 GPU 或本地 SSD,您还需要分别配置作业的- installGpuDrivers字段和- volumes[]字段。否则,请跳过其余更改。
- 否:将 - MACHINE_TYPE替换为与预留相同的机器类型。
 
- 预留是否包含满足最低要求的 CPU 平台? - 是:将 - MIN_CPU_PLATFORM替换为相同的最低要求 CPU 平台。
- 否:移除 - minCpuPlatform字段。
 
- 预留是否包含 GPU? - 是:替换 - INSTALL_GPU_DRIVERS、- GPU_TYPE和- GPU_COUNT以与预留匹配。 例如,请参阅使用 GPU 的代码示例。
- 否:移除 - installGpuDrivers字段和- accelerators[]字段。
 
- 预留是否包含本地 SSD? - 是:替换 - LOCAL_SSD_SIZE和- LOCAL_SSD_NAME以匹配预留,并通过向作业添加- volumes[]字段来装载本地 SSD。例如,请参阅使用本地 SSD 的代码示例。
- 否:移除 - disks[]字段。
 
- 预留是否采用明确定向的使用类型? - 是:将 - SPECIFIC_RESERVATION_NAME替换为预留的名称。
- 否:移除 - reservation字段。
 
 - 例如,假设您正在使用一个自动消耗的 - n2-standard-32虚拟机预留,该预留未指定任何满足最低要求的 CPU 平台、GPU 或本地 SSD。此外,您也不想指定虚拟机实例模板。在这种情况下,您必须将- VM_RESOURCES替换为以下值:- "policy": { "machineType": "n2-standard-32" } 
 
创建并运行无法使用预留虚拟机的作业
如需阻止作业使用任何预留,请将 reservation 字段设置为 NO_RESERVATION。如需详细了解如何防止使用预留,请参阅 Compute Engine 文档中的阻止计算实例使用预留。
您可以使用 gcloud CLI 或 Batch API 创建并运行无法使用任何预留虚拟机的作业。
gcloud
- 创建一个 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" } }
- 如需创建并运行作业,请使用 - 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"
  }
}
替换以下内容: