本文說明如何建立在預留資源上執行的工作,以及如何禁止工作使用預留項目。
預留項目是 Compute Engine 的一項功能。預留項目可確保您取得一或多個 VM 的容量,並指定硬體設定。VM 的預留資源會從您建立預留資源開始計費,直到您刪除預留資源為止。不過,在您使用該 VM 時,總費用與沒有預留項目的 VM 相同。
一般來說,如果容量可用性至關重要,或要避免取得資源時發生錯誤,預留資源就非常實用。如果是 Batch,請考慮使用專屬預留項目,盡量縮短工作排程時間,或嘗試在現有預留項目未使用時使用。如果您有未充分使用的預訂項目 (例如承諾使用折扣所需的預訂項目),可以設定作業,在預訂項目未使用時嘗試消耗這些項目,盡量減少產生的費用。或者,如果您想優先為專案中的其他工作負載提供資源,可以明確禁止工作消耗保留項目。
如要進一步瞭解預留項目,請參閱 Compute Engine 預留項目說明文件。
事前準備
- 如果您從未使用過 Batch,請參閱「開始使用 Batch」,並完成專案和使用者的必要條件,啟用 Batch。
- 確認您有權建立預留項目或查看現有預留項目,以便工作視需要使用 VM。
-
如要取得建立作業所需的權限,請要求管理員授予下列 IAM 角色:
-
批次工作編輯者 (
roles/batch.jobsEditor
) 專案 -
服務帳戶使用者 (
roles/iam.serviceAccountUser
) 在作業的服務帳戶上,預設為預設 Compute Engine 服務帳戶
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
-
批次工作編輯者 (
限制
除了預留的一般限制,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 的工作
規劃設定。 如要確保工作和預訂項目相容,請完成下列步驟。
如要使用現有的保留項目,請建立具有對應設定的作業。否則,如要建立新的預訂,請選取偏好的設定選項。
判斷預訂屬性。由於有這些限制,分享類型必須是「單一專案」,這是預訂的預設選項。決定要用於下列預訂屬性的值:
- 消費類型*
- VM 數量†
判斷工作和預訂的 VM 屬性。 由於這些限制,工作和預留項目都無法指定密集配置政策,而這也是預留項目和工作的預設選項。判斷要用於下列 VM 屬性的值,這些值必須與預留項目和工作完全相符:
- 專案
- 區域*
- 機器類型†
- 最低 CPU 平台† (如有‡)
- GPU 類型和數量† (如有‡)
- 本機 SSD 類型和數量† (如有‡)
- 預訂相依性†#
*工作 VM 必須與預留 VM 位於相同區域。您必須在工作的
allowedLocations[]
欄位中加入這個區域,或者如果省略allowedLocations[]
欄位,則將工作地點設為包含這個區域的地區。†工作必須使用
policy
子欄位或 VM 執行個體範本,定義所有這些屬性。工作無法同時指定policy
子欄位和範本。‡ 您無法為一個資源定義選用欄位,但從另一個資源省略。定義或省略預訂和工作的選用欄位。如果作業指定 VM 執行個體範本,這也適用於指定範本的欄位。
#預留項目的消耗類型會決定工作 VM 需要的預留項目親和性,您必須在工作中指定,如下所示:
- 如果作業使用 VM 執行個體範本,範本需要設定保留項目親和性,如保留項目說明文件所述。
- 如果工作未使用範本,且明確指定保留項目,請在工作的
reservation
欄位中指定保留項目名稱。 - 否則,如果工作未使用範本,且預訂方案會自動耗用,請省略工作的
reservation
欄位。
準備預訂。如果尚未建立預留項目,請建立預留項目,供作業的 VM 使用。確認預訂項目是否具有您規劃的屬性。
建立及執行工作。您可以使用 gcloud CLI 或 Batch API,建立及執行從準備好的預留項目取用 VM 的工作:
gcloud
建立 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" }
如要使用這個值,請進行下列所有變更:
要使用執行個體範本嗎?
是:將
policy
欄位替換為instanceTemplate
欄位,並指定符合預訂項目的現有 VM 執行個體範本。舉例來說,請參閱使用 VM 執行個體範本的程式碼範例。如果保留項目使用 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
VM 保留項目,但未指定任何最低 CPU 平台、GPU 或本機 SSD。此外,您也不想指定 VM 執行個體範本。在這種情況下,您必須將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
要求,將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" }
如要使用這個值,請進行下列所有變更:
要使用執行個體範本嗎?
是:將
policy
欄位替換為instanceTemplate
欄位,並指定符合預訂項目的現有 VM 執行個體範本。舉例來說,請參閱使用 VM 執行個體範本的程式碼範例。如果保留項目使用 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
VM 保留項目,但未指定任何最低 CPU 平台、GPU 或本機 SSD。此外,您也不想指定 VM 執行個體範本。在這種情況下,您必須將VM_RESOURCES
替換為下列值:"policy": { "machineType": "n2-standard-32" }
建立及執行無法使用預留 VM 的工作
如要禁止工作使用任何預留項目,請將 reservation
欄位設為 NO_RESERVATION
。如要進一步瞭解如何避免預留資源遭到耗用,請參閱 Compute Engine 說明文件中的「避免運算執行個體耗用預留資源」。
您可以使用 gcloud CLI 或 Batch API 建立及執行工作,但工作無法使用任何預留 VM。
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"
}
}
更改下列內容: