使用 VM 預留項目確保資源可用

本文說明如何建立在預留資源上執行的工作,以及如何禁止工作使用預留項目。

預留項目是 Compute Engine 的一項功能。預留項目可確保您取得一或多個 VM 的容量,並指定硬體設定。VM 的預留資源會從您建立預留資源開始計費,直到您刪除預留資源為止。不過,在您使用該 VM 時,總費用與沒有預留項目的 VM 相同。

一般來說,如果容量可用性至關重要,或要避免取得資源時發生錯誤,預留資源就非常實用。如果是 Batch,請考慮使用專屬預留項目,盡量縮短工作排程時間,或嘗試在現有預留項目未使用時使用。如果您有未充分使用的預訂項目 (例如承諾使用折扣所需的預訂項目),可以設定作業,在預訂項目未使用時嘗試消耗這些項目,盡量減少產生的費用。或者,如果您想優先為專案中的其他工作負載提供資源,可以明確禁止工作消耗保留項目。

如要進一步瞭解預留項目,請參閱 Compute Engine 預留項目說明文件

事前準備

  1. 如果您從未使用過 Batch,請參閱「開始使用 Batch」,並完成專案和使用者的必要條件,啟用 Batch。
  2. 確認您有權建立預留項目查看現有預留項目,以便工作視需要使用 VM。
  3. 如要取得建立作業所需的權限,請要求管理員授予下列 IAM 角色:

    如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

    您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

限制

除了預留的一般限制,Batch 還有下列限制:

  • 作業的 VM 無法使用共用預留項目。
  • 如果工作和預留項目都指定密集配置政策,工作 VM 就無法使用預留項目。
  • 如果您使用 Google Cloud 控制台建立工作,VM 會自動使用相符的預留項目。如要使用特定預留項目或禁止 VM 使用預留項目,您必須改用 gcloud CLI 或 Batch API 建立工作時,定義 reservation 欄位。

需求條件

本節將概述作業 VM 使用預留資源的規定。如要進一步瞭解所有需求,請參閱 Compute Engine 說明文件中的預留資源一般需求,以及本文件稍後的規劃設定程序

  • 如要讓作業的 VM 一般都能使用預留項目,必須符合下列所有條件:

    • 工作和預留項目必須指定完全相符的 VM 屬性。

    • 你必須遵守本文件中的所有限制,以及預訂服務的所有其他一般規定。

  • 如要讓作業的每個 VM 順利使用預留項目,預留項目必須在 VM 的執行時間內有可用的未使用容量。

    預留容量的未使用容量是 VM 數量與目前使用該容量的 VM 數量之間的差異。只要有未使用的預留容量,VM 就會嘗試使用預留項目。因此,VM 可以在建立時或稍後在執行階段開始使用預留項目。VM 停止運作或預留項目遭刪除前,VM 會持續使用預留項目。

    視未使用的預留容量總量而定,作業的部分或所有 VM 可能會耗用預留容量,且預留 VM 數量可能會在作業執行期間有所不同。

建立及執行可使用預留 VM 的工作

  1. 規劃設定。 如要確保工作和預訂項目相容,請完成下列步驟。

    如要使用現有的保留項目,請建立具有對應設定的作業。否則,如要建立新的預訂,請選取偏好的設定選項。

    1. 判斷預訂屬性。由於有這些限制,分享類型必須是「單一專案」,這是預訂的預設選項。決定要用於下列預訂屬性的值:

      • 消費類型*
      • VM 數量

      *預留項目的使用類型 (明確指定自動使用) 決定哪些 VM 可以使用預留項目。

      「VM 數量」代表預留項目的總容量。決定這個值時,請考量作業的 VM 數量

    2. 判斷工作和預訂的 VM 屬性。 由於這些限制,工作和預留項目都無法指定密集配置政策,而這也是預留項目和工作的預設選項。判斷要用於下列 VM 屬性的值,這些值必須與預留項目和工作完全相符:

      • 專案
      • 區域*
      • 機器類型
      • 最低 CPU 平台 (如有)
      • GPU 類型和數量 (如有)
      • 本機 SSD 類型和數量 (如有)
      • 預訂相依性#

      *工作 VM 必須與預留 VM 位於相同區域。您必須在工作的 allowedLocations[] 欄位中加入這個區域,或者如果省略 allowedLocations[] 欄位,則將工作地點設為包含這個區域的地區。

      工作必須使用 policy 子欄位或 VM 執行個體範本,定義所有這些屬性。工作無法同時指定 policy 子欄位和範本。

      您無法為一個資源定義選用欄位,但從另一個資源省略。定義或省略預訂和工作的選用欄位。如果作業指定 VM 執行個體範本,這也適用於指定範本的欄位。

      #預留項目的消耗類型會決定工作 VM 需要的預留項目親和性,您必須在工作中指定,如下所示:

      • 如果作業使用 VM 執行個體範本,範本需要設定保留項目親和性,如保留項目說明文件所述
      • 如果工作未使用範本,且明確指定保留項目,請在工作的 reservation 欄位中指定保留項目名稱。
      • 否則,如果工作未使用範本,且預訂方案會自動耗用,請省略工作的 reservation 欄位。
  2. 準備預訂。如果尚未建立預留項目,請建立預留項目,供作業的 VM 使用。確認預訂項目是否具有您規劃的屬性。

  3. 建立及執行工作。您可以使用 gcloud CLI 或 Batch API,建立及執行從準備好的預留項目取用 VM 的工作:

    gcloud

    1. 建立 JSON 檔案,指定作業的設定詳細資料,將虛擬機器執行個體資源 (instances[]) 子欄位設為與預留項目的虛擬機器屬性完全相符。

      舉例來說,如要建立基本指令碼工作,從預訂項目取用 VM,請建立含有下列內容的 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 替換為與您要工作使用的預留項目相符的 VM 資源,方法是指定您在先前步驟中規劃的 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"
      }
      

      如要使用這個值,請進行下列所有變更:

      1. 要使用執行個體範本嗎?

        • 是:policy 欄位替換為 instanceTemplate 欄位,並指定符合預訂項目的現有 VM 執行個體範本。舉例來說,請參閱使用 VM 執行個體範本的程式碼範例。如果保留項目使用 GPU 或本機 SSD,您也需要分別設定工作的 installGpuDrivers 欄位和 volumes[] 欄位。否則請略過其餘變更。

        • 否:MACHINE_TYPE 替換為與預留項目相同的機器類型。

      2. 保留項目是否包含最低 CPU 平台?

        • 是:MIN_CPU_PLATFORM 替換為相同的最低 CPU 平台。

        • 否:移除 minCpuPlatform 欄位。

      3. 預訂項目是否包含 GPU?

        • 是:請將 INSTALL_GPU_DRIVERSGPU_TYPEGPU_COUNT 替換為預訂資訊。舉例來說,請參閱使用 GPU 的程式碼範例。

        • 否:移除 installGpuDrivers 欄位和 accelerators[] 欄位。

      4. 保留項目是否包含本機 SSD?

        • 是:取代 LOCAL_SSD_SIZELOCAL_SSD_NAME 以符合預訂項目,並透過將 volumes[] 欄位新增至工作,掛接本機 SSD。舉例來說,請參閱使用本機 SSD 的程式碼範例。

        • 否:移除 disks[] 欄位。

      5. 預留項目是否使用明確指定的消耗類型?

        • 是:SPECIFIC_RESERVATION_NAME 替換為預訂名稱。

        • 否:移除 reservation 欄位。

      舉例來說,假設您使用自動耗用的 n2-standard-32 VM 保留項目,但未指定任何最低 CPU 平台、GPU 或本機 SSD。此外,您也不想指定 VM 執行個體範本。在這種情況下,您必須將 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:工作地點。除非作業指定 allowedLocations[] 欄位,否則這必須是包含預訂方案區域的地區。

      • JSON_CONFIGURATION_FILE:JSON 檔案的路徑,內含作業的設定詳細資料。

    API

    jobs.create 方法發出 POST 要求,將VM 執行個體資源 (instances[]) 子欄位設為與預留項目的 VM 屬性完全相符。

    舉例來說,如要建立基本指令碼工作,並從預留項目取用 VM,請發出下列要求:

    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:與預留項目相符的 VM 資源,您想讓工作使用這些資源,因此請指定您在先前步驟中規劃的 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"
      }

      如要使用這個值,請進行下列所有變更:

      1. 要使用執行個體範本嗎?

        • 是:policy 欄位替換為 instanceTemplate 欄位,並指定符合預訂項目的現有 VM 執行個體範本。舉例來說,請參閱使用 VM 執行個體範本的程式碼範例。如果保留項目使用 GPU 或本機 SSD,您也需要分別設定工作的 installGpuDrivers 欄位和 volumes[] 欄位。否則請略過其餘變更。

        • 否:MACHINE_TYPE 替換為與預留項目相同的機器類型。

      2. 保留項目是否包含最低 CPU 平台?

        • 是:MIN_CPU_PLATFORM 替換為相同的最低 CPU 平台。

        • 否:移除 minCpuPlatform 欄位。

      3. 預訂項目是否包含 GPU?

        • 是:請將 INSTALL_GPU_DRIVERSGPU_TYPEGPU_COUNT 替換為預訂資訊。舉例來說,請參閱使用 GPU 的程式碼範例。

        • 否:移除 installGpuDrivers 欄位和 accelerators[] 欄位。

      4. 保留項目是否包含本機 SSD?

        • 是:取代 LOCAL_SSD_SIZELOCAL_SSD_NAME 以符合預訂項目,並透過將 volumes[] 欄位新增至工作,掛接本機 SSD。舉例來說,請參閱使用本機 SSD 的程式碼範例。

        • 否:移除 disks[] 欄位。

      5. 預留項目是否使用明確指定的消耗類型?

        • 是:SPECIFIC_RESERVATION_NAME 替換為預訂名稱。

        • 否:移除 reservation 欄位。

      舉例來說,假設您使用自動耗用的 n2-standard-32 VM 保留項目,但未指定任何最低 CPU 平台、GPU 或本機 SSD。此外,您也不想指定 VM 執行個體範本。在這種情況下,您必須將 VM_RESOURCES 替換為下列值:

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

建立及執行無法使用預留 VM 的工作

如要禁止工作使用任何預留項目,請將 reservation 欄位設為 NO_RESERVATION。如要進一步瞭解如何避免預留資源遭到耗用,請參閱 Compute Engine 說明文件中的「避免運算執行個體耗用預留資源」。

您可以使用 gcloud CLI 或 Batch API 建立及執行工作,但工作無法使用任何預留 VM。

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:作業名稱。

後續步驟