本頁說明如何建立及管理Spot VM,包括:
- 如何建立、啟動及識別 Spot VM
- 如何偵測、處理及測試 Spot VM 先占
- Spot VM 最佳做法
Spot VM 是使用Spot 佈建模型的虛擬機器 (VM) 執行個體。 Spot VM 的折扣最多可達標準 VM 隨選價格的 91%。 詳情請參閱定價頁面。 不過,Compute Engine 可能會隨時先占 Spot VM,以取回資源。建議只將 Spot VM 用於容錯工作負載,且能承受 VM 先占的影響。
事前準備
- 請參閱 Spot VM 相關說明,特別是限制。
- 確認您有足夠的配額,可供要求使用的資源。詳情請參閱「分配配額」。
- 為避免 Spot VM 耗用標準 VM 的 CPU、GPU 和磁碟配額,建議您為 Spot VM 申請先占配額。
-
如果尚未設定驗證,請先完成設定。
驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:
選取這個頁面上範例的預計用途分頁:
控制台
使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,不需要設定驗證。
gcloud
-
安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:
gcloud init如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
- 設定預設區域和可用區。
-
安裝 Google Cloud CLI。
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如果您使用本機殼層,請為使用者帳戶建立本機驗證憑證:
gcloud auth application-default login
如果您使用 Cloud Shell,則不需要執行這項操作。
如果系統傳回驗證錯誤,且您使用外部識別資訊提供者 (IdP),請確認您已 使用聯合身分登入 gcloud CLI。
Terraform
如要在本機開發環境中使用本頁的 Terraform 範例,請安裝並初始化 gcloud CLI,然後使用使用者憑證設定應用程式預設憑證。
詳情請參閱「 設定本機開發環境的驗證機制」。
REST
如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。
安裝 Google Cloud CLI。
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」。
必要的角色
如要取得建立 Spot VM 所需的權限,請要求管理員授予您專案的 Compute 執行個體管理員 (v1) (roles/compute.instanceAdmin.v1) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
這個預先定義的角色具備建立 Spot VM 所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:
所需權限
如要建立 Spot VM,您必須具備下列權限:
-
專案有
compute.instances.create -
如要使用自訂映像檔建立 VM,請按照下列步驟操作:
compute.images.useReadOnly在映像檔上 -
如要使用快照建立 VM,請按照下列步驟操作:
compute.snapshots.useReadOnly在快照上 -
如要使用執行個體範本建立 VM,請按照下列步驟操作:
compute.instanceTemplates.useReadOnly在執行個體範本上 -
如要為 VM 指定子網路:
compute.subnetworks.use在專案或所選子網路上 -
如要為 VM 指定靜態 IP 位址:
compute.addresses.use在專案中 -
使用虛擬私有雲網路時,如要為 VM 指派外部 IP 位址,請在專案或所選子網路上執行下列步驟:
compute.subnetworks.useExternalIp -
如要將舊版網路指派給 VM,請按照下列步驟操作:
compute.networks.use在專案中 -
使用舊版網路時,如要為 VM 指派外部 IP 位址,請執行下列步驟:
compute.networks.useExternalIp專案 -
如要為 VM 設定 VM 執行個體中繼資料,請在專案中執行下列步驟:
compute.instances.setMetadata -
如要為 VM 設定標記,請按照下列步驟操作:
compute.instances.setTags在 VM 上 -
如要為 VM 設定標籤,請按照下列步驟操作:
compute.instances.setLabels在 VM 上 -
如要設定 VM 使用的服務帳戶:
compute.instances.setServiceAccount在 VM 上 -
為 VM 建立新磁碟:
compute.disks.create專案 -
如要以唯讀或讀寫模式連結現有磁碟:
compute.disks.use在磁碟上 -
如要以唯讀模式連接現有磁碟:
compute.disks.useReadOnly磁碟
準備建立 Spot VM
為工作負載建立 Spot VM 前,請先完成下列步驟:
設定工作負載來管理搶占。具體來說,建議您準備一個處理搶占的指令碼,該指令碼會以工作負載的一部分執行,或是您可以在 VM 中繼資料中新增該指令碼,以便在關機時執行。如需操作說明,請參閱「管理 Spot VM 先占」。
強烈建議您查看 Spot VM 的資料,協助選擇機型和位置。 選取資源可用性較高的機型和位置,有助於避免資源可用性錯誤,並在搶占前延長正常運作時間。
如要查看歷來先占和定價資料 (規劃長期工作負載時特別實用),請參閱「查看 Spot VM 的先占率和定價資料」。
如要查看目前的可用性資料 (特別是在為短期工作負載建立 Spot VM 之前),請參閱「查看 Spot VM 的可用性」。
選取建立 Spot VM 的方法。建議您選取下列方法:
如果您先前未建立過 Spot VM,或是工作負載較小且短期,請參閱「建立 Spot VM」。
如果您先前已建立 Spot VM,且想建立多個 Spot VM (例如用於大型長期工作負載),請參閱「建立使用 Spot VM 的代管執行個體群組 (MIG)」。
如要建立及管理搭載 TPU 的 Spot VM,請參閱「要求 TPU Spot VM」。
如要進一步瞭解建立 Spot VM 的最佳化建議,請參閱最佳做法。
建立 Spot VM
準備好建立 Spot VM 後,即可使用下列任一方法建立 Spot VM。
控制台
前往 Google Cloud 控制台的「建立執行個體」頁面。
在預設開啟的「機器設定」窗格中,完成下列步驟:
- 在「佈建模型」部分,從「VM 佈建模型」清單中選取「Spot」。「VM 佈建模式進階設定」部分會展開。
在「Preemption notice duration」(搶占通知時間長度) 清單中,根據搶占處理方式選取選項。
如果選取 120 秒,請務必在建立 Spot VM 前,處理工作負載中的先占作業。舉例來說,請確認工作負載包含儲存進度的指令碼,且該指令碼會等到系統偵測到搶占作業時才執行。
如果選取「0 秒 (預設)」,請務必使用關機指令碼處理搶占。建立 Spot VM 前,請先建立包含關機指令碼的檔案,在因搶占而關機時儲存進度。如後續步驟所述,附加這個關機指令碼。
選用步驟:如要選擇 Compute Engine 搶占 VM 時執行的終止動作,請在「On VM termination」(在 VM 終止時) 清單中,選取下列其中一個選項:
- 如要在先占期間停止 VM,請選取「停止」 (預設)。
- 如要在先占期間刪除 VM,請選取「刪除」。
如要新增關機指令碼,請完成下列步驟。如果為「搶占通知時間長度」選取「0 秒 (預設)」,則必須執行這個步驟來處理搶占。否則,如果您選取「120 秒」,這個步驟就是選用。
- 按一下導覽選單中的「進階」。
- 在「中繼資料」部分,按一下 「新增項目」。
- 在「Key」欄位中,輸入中繼資料鍵的
shutdown-script。 - 在「Value」(值) 欄位中,新增可處理搶占的關機指令碼內容。如需關機指令碼範例,請參閱本文的「處理搶占的範例」。
視需要指定其他設定選項。詳情請參閱「建立執行個體時的設定選項」。
如要建立並啟動 VM,請按一下 [Create] (建立)。
gcloud
如要使用 gcloud CLI 建立 VM,請使用 gcloud compute instances create 指令。建立 VM 時,建議您指定機型、位置和 OS 映像檔。
如要建立 Spot VM,請加入 --provisioning-model=SPOT 旗標。
如要指定搶占通知時間長度,請加入 --preemption-notice-duration 旗標,並視需要加入關機指令碼。您也可以一併加入 --instance-termination-action 旗標,為 Spot VM 指定終止動作。
gcloud compute instances create VM_NAME \
--machine-type=MACHINE_TYPE \
--zone=ZONE \
--image-family=IMAGE_FAMILY \
--image-project=IMAGE_PROJECT \
--provisioning-model=SPOT \
--instance-termination-action=TERMINATION_ACTION \
--preemption-notice-duration=PREEMPTION_NOTICE_DURATION \
--metadata shutdown-script=SHUTDOWN_SCRIPT
更改下列內容:
VM_NAME:新 VM 的名稱。ZONE:要建立 VM 的可用區。此外,可用區也必須支援新 VM 使用的機型。IMAGE_FAMILY:映像檔系列。這會指定最新的非已淘汰 OS 映像檔。舉例來說,如果您指定debian-13,系統會使用 Debian 13 映像檔系列中的最新版本。如要進一步瞭解如何使用映像檔系列,請參閱「映像檔系列最佳做法」。IMAGE_PROJECT:包含圖片的專案。舉例來說,如果將debian-13指定為圖片系列,請將debian-cloud指定為圖片專案。TERMINATION_ACTION:選用:指定 Compute Engine 先占 VM 時要採取的終止動作,可以是STOP(預設行為) 或DELETE。PREEMPTION_NOTICE_DURATION:是否啟用搶占通知時間長度。如果是 gcloud CLI,值必須是120s或0s。如果您指定
120s,請在工作負載中處理搶占作業。(您也可以視需要指定關機指令碼)。如果您指定
0s(預設),請在關機指令碼中處理搶占。
SHUTDOWN_SCRIPT:關機指令碼。如果將
PREEMPTION_NOTICE_DURATION設為0s(預設值),則必須指定關機指令碼來處理搶占。如要進一步瞭解如何格式化及指定關機指令碼,請參閱「執行關機指令碼」。否則,如不想指定關機指令碼,可以移除
--metadata shutdown-script旗標。
Terraform
。您可以使用 Terraform 資源,透過 scheduling 區塊建立 Spot VM,如下列範例所示。
如要新增關機指令碼來處理搶占,請一併新增 metadata 區塊,如「執行關機指令碼」所示。如需關機指令碼範例,請參閱本文的「處理搶占」一節。
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
REST
如要使用 Compute Engine API 建立 VM,請使用 instances.insert 方法。建立 VM 時,建議您指定機型、位置和 OS 映像檔。
如要建立 Spot VM,您必須加入 "provisioningModel": "SPOT" 欄位。如要指定先占通知時長,請加入 preemptionNoticeDuration 欄位。您也可以選擇加入 instanceTerminationAction 欄位,為 Spot VM 指定終止動作。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances { "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE", "name": "VM_NAME", "disks": [ { "initializeParams": { "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE" }, "boot": true } ], "scheduling": { "provisioningModel": "SPOT", "instanceTerminationAction": "TERMINATION_ACTION", "preemptionNoticeDuration": { "seconds": PREEMPTION_NOTICE_DURATION } }, "metadata": { "items": [ { "key": "shutdown-script", "value": "SHUTDOWN_SCRIPT" } ] } }
更改下列內容:
PROJECT_ID:要在其中建立 VM 的專案的專案 ID。ZONE:要建立 VM 的可用區。此外,可用區也必須支援新 VM 使用的機型。MACHINE_TYPE:新 VM 的預先定義或自訂機型。VM_NAME:新 VM 的名稱。IMAGE_PROJECT:包含圖片的專案。舉例來說,如果將family/debian-13指定為圖片系列,請將debian-cloud指定為圖片專案。IMAGE:指定下列其中一個值:- 公開映像檔的特定版本。舉例來說,特定圖片為
"sourceImage": "projects/debian-cloud/global/images/debian-13-trixie-v20260908",其中debian-cloud是IMAGE_PROJECT。 - 映像檔系列。
系統會使用最新的非已淘汰 OS 映像檔建立 VM。
舉例來說,如果您指定
"sourceImage": "projects/debian-cloud/global/images/family/debian-13",其中debian-cloud是IMAGE_PROJECT,Compute Engine 會從 Debian 13 映像檔系列的最新 OS 映像檔版本建立 VM。
- 公開映像檔的特定版本。舉例來說,特定圖片為
TERMINATION_ACTION:選用:指定 Compute Engine 先占 VM 時要採取的終止動作,可以是STOP(預設行為) 或DELETE。PREEMPTION_NOTICE_DURATION:是否啟用搶占通知時間長度。如果是 REST,值必須是120或0。如果您指定
120,請在工作負載中處理搶占作業。(您也可以視需要指定關機指令碼)。如果您指定
0(預設),請在關機指令碼中處理搶占。
SHUTDOWN_SCRIPT:關機指令碼。
如要進一步瞭解建立 VM 時可指定的選項,請參閱「建立執行個體時的設定選項」。
啟動 Spot VM
與其他 VM 相同,Spot VM 會在建立時啟動。同樣地,如果 Spot VM 停止運作,您可以重新啟動 VM,恢復 RUNNING 狀態。只要有資源,您就能視需要多次停止及重新啟動遭先占的 Spot VM。詳情請參閱「VM 執行個體生命週期」。
如果 Compute Engine 停止自動調度資源代管執行個體群組 (MIG) 或 Google Kubernetes Engine (GKE) 叢集中的一或多個 Spot VM,當資源再次可用時,群組會重新啟動 VM。
找出 VM 的佈建模型和終止動作
找出 VM 的佈建模式,確認是標準 VM、Spot VM 還是先占 VM。如果是 Spot VM,您也可以識別終止動作。 您可以使用Google Cloud 控制台、gcloud CLI 或 Compute Engine API,識別 VM 的佈建模型和終止動作。
控制台
前往「VM instances」(VM 執行個體) 頁面。
按一下要識別的 VM「名稱」。「VM 執行個體詳細資料」頁面隨即開啟。
前往頁面底部的「管理」部分。在「可用性政策」子部分中,勾選下列選項:
- 如果「VM 佈建模型」設為「Spot」,則 VM 為 Spot VM。
- 「VM 終止時」:指出 Compute Engine 先占 VM 時要採取的動作,可選擇「停止」或「刪除」VM。
- 否則,如果「VM 佈建模式」設為「標準」或「—」:
- 如果「Preemptibility」(先佔功能) 選項設為「On」(開啟),則 VM 為先占 VM。
- 否則,VM 就是標準 VM。
- 如果「VM 佈建模型」設為「Spot」,則 VM 為 Spot VM。
gcloud
如要透過 gcloud CLI 說明 VM,請使用 gcloud compute instances describe 指令:
gcloud compute instances describe VM_NAME
其中 VM_NAME 是要檢查的 VM 名稱。
在輸出內容中,查看 scheduling 欄位,找出 VM:
如果輸出內容包含設為
SPOT的provisioningModel欄位 (如下所示),表示 VM 是 Spot VM。... scheduling: ... provisioningModel: SPOT instanceTerminationAction: TERMINATION_ACTION ...
其中
TERMINATION_ACTION表示 Compute Engine 先占 VM 時要採取的動作,也就是停止 (STOP) 或刪除 (DELETE) VM。如果缺少instanceTerminationAction欄位,預設值為STOP。否則,如果輸出內容包含設為
standard的provisioningModel欄位,或輸出內容省略provisioningModel欄位:- 如果輸出內容包含設為
true的preemptible欄位,表示 VM 是先占 VM。 - 否則,VM 就是標準 VM。
- 如果輸出內容包含設為
REST
如要透過 Compute Engine API 說明 VM,請使用 instances.get 方法:
GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
更改下列內容:
在輸出內容中,查看 scheduling 欄位,找出 VM:
如果輸出內容包含設為
SPOT的provisioningModel欄位 (如下所示),表示 VM 是 Spot VM。{ ... "scheduling": { ... "provisioningModel": "SPOT", "instanceTerminationAction": "TERMINATION_ACTION" ... }, ... }其中
TERMINATION_ACTION表示 Compute Engine 先占 VM 時要採取的動作,也就是停止 (STOP) 或刪除 (DELETE) VM。如果缺少instanceTerminationAction欄位,預設值為STOP。否則,如果輸出內容包含設為
standard的provisioningModel欄位,或輸出內容省略provisioningModel欄位:- 如果輸出內容包含設為
true的preemptible欄位,表示 VM 是先占 VM。 - 否則,VM 就是標準 VM。
- 如果輸出內容包含設為
Go
Java
Python
管理 Spot VM 先占
如要瞭解如何管理 Spot VM 先占,請參閱下列章節:
處理先占
當 Compute Engine 開始先占 Spot VM 時,您可以在 VM 關機前執行清除作業。處理搶占作業可能包括正常停止執行中的程序,以及轉移工作負載的狀態。
您可以使用下列方法處理 Spot VM 的搶占作業。如要進一步瞭解如何選擇工作負載的搶占處理位置,請參閱搶占通知時間長度的定義。
- 在工作負載中處理搶占作業。如果 Spot VM 的搶占通知時間為 120 秒,建議使用這個方法。具體來說,請在工作負載中設定程式碼,以處理搶占作業,並等待搶占作業開始執行,如「在 VM 中偵測搶占作業」一文所述。接著,系統會在先占通知時長內,執行處理先占的程式碼。(視需要,這些 VM 也可以指定關機指令碼,在關機期間執行。)
- 在關機指令碼中處理先占。如果 Spot VM 沒有搶占通知時間長度 (這是預設設定),建議採用這個方法。具體來說,請在關機指令碼中設定程式碼,以處理先占,如下列範例所示。在任何類型的關機程序中,系統都會在盡力而為的關機期間自動執行關機指令碼,最多 30 秒。因此,您可能需要設定程式碼來處理搶占作業,確保程式碼只在 VM 遭到搶占時執行,如「在 VM 中偵測搶占作業」一文所述。
處理優先權示例
以下範例指令碼說明如何將檢查點檔案上傳至 Cloud Storage bucket,藉此處理搶占問題。您可以在工作負載中執行這項指令碼,也可以將其設定為關機指令碼。腳本會先正常停止指定程式,然後將檢查點檔案平行上傳至 Cloud Storage bucket。指令碼完成或逾時後,作業系統的正常 kill
指令會停止所有剩餘程序。
#!/bin/bash
MY_PROGRAM="PROGRAM_NAME" # For example, "apache2" or "nginx"
MY_USER="LOCAL_USER"
CHECKPOINT="/home/$MY_USER/checkpoint.out"
BUCKET_NAME="BUCKET_NAME" # For example, "my-checkpoint-files" (without gs://)
echo "Shutting down! Seeing if ${MY_PROGRAM} is running."
# Find the newest copy of $MY_PROGRAM
PID="$(pgrep -n "$MY_PROGRAM")"
if [[ "$?" -ne 0 ]]; then
echo "${MY_PROGRAM} not running, shutting down immediately."
exit 0
fi
echo "Sending SIGINT to $PID"
kill -2 "$PID"
# Portable waitpid equivalent
while kill -0 "$PID"; do
sleep 1
done
echo "$PID is done, copying ${CHECKPOINT} to gs://${BUCKET_NAME} as ${MY_USER}"
su "${MY_USER}" -c "gcloud storage cp $CHECKPOINT gs://${BUCKET_NAME}/"
echo "Done uploading, shutting down."
這段指令碼假設您已完成下列事項:
建立 VM 時,至少具備 Cloud Storage 的讀取或寫入權限。 如要瞭解如何建立具有適當範圍的 VM,請參閱驗證說明文件。
您有現成的 Cloud Storage bucket,且具備寫入權限。
如要將這個指令碼新增至 VM,請設定指令碼,使其能與 VM 上的工作負載搭配運作,然後將指令碼新增至工作負載或 VM 的中繼資料。
複製或下載範例指令碼:
複製上述指令碼,並替換下列項目:
PROGRAM_NAME:要關閉的程序或程式名稱。例如:apache2或nginx。LOCAL_USER:登入虛擬機器的使用者名稱。BUCKET_NAME:要儲存程式檢查點檔案的 Cloud Storage bucket 名稱。請注意,在本範例中,bucket 名稱開頭並非gs://。
將範例指令碼下載至本機工作站。然後,在檔案中替換下列變數:
PROGRAM_NAME:要關閉的程序或程式名稱。例如:apache2或nginx。LOCAL_USER:登入虛擬機器的使用者名稱。BUCKET_NAME:要儲存程式檢查點檔案的 Cloud Storage bucket 名稱。請注意,在本範例中,bucket 名稱開頭並非gs://。
設定搶占偵測功能,並根據您打算處理搶占的位置 (工作負載內或關機指令碼內) 新增指令碼。如要進一步瞭解如何選擇處理工作負載搶占作業的位置,請參閱搶占通知時間長度的定義。
處理工作負載中的搶占:完成下列步驟。
如「在 VM 中偵測先占」一文所述,設定指令碼,等待先占開始。
將指令碼新增至工作負載。
在關機指令碼中處理搶占:完成下列步驟。
建議您將指令碼設為僅在因搶占而關機時執行,如「在 VM 中偵測搶占」一文所述。舉例來說,如果 VM 因工作負載完成而關機,您就不需要上傳檢查點檔案。
偵測 Spot VM 先占
以下各節說明如何偵測 Spot VM 的搶占情形。
- 在 VM 中偵測先占:舉例來說,您可以使用這個方法在關機指令碼中檢查先占,或為先占通知時間為 120 秒的 Spot VM 觸發先占處理程序。
- 查看先占作業:舉例來說,如要判斷 Spot VM 關機的原因,請使用這個方法。
偵測 VM 內的搶占作業
如要從 VM 內部偵測 VM 是否遭到搶占,請在 VM 的預設中繼資料中,檢查中繼資料伺服器的 preempted 值。舉例來說,您可以根據打算處理搶占的位置,使用下列一或多種方法。
如果您在關機指令碼中處理搶占,請檢查
preempted的目前值。 您可以在 VM 中執行下列curl指令,取得preempted的目前值:curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted" -H "Metadata-Flavor: Google" TRUE如果這個值為
TRUE,表示 VM 已遭 Compute Engine 先占,否則為FALSE。舉例來說,您可以在關機指令碼中使用這項指令,根據關機是否由搶占所致,執行不同的動作。如果工作負載會處理搶占作業,請等到
preempted變成TRUE。 如要等到preemptedTRUE,可以將?wait_for_change=true查詢參數附加至前一個指令的網址。使用這個查詢參數時,指令會執行暫止的 HTTP GET 要求,只有在中繼資料變更且 VM 已遭搶占時才會傳回。curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted?wait_for_change=true" -H "Metadata-Flavor: Google" TRUE如果您想在關機指令碼以外觸發搶占處理程序,這個指令就非常實用。舉例來說,您可以使用這個方法,為先占通知時間為 120 秒的 Spot VM 觸發先占處理程序。
查看搶占作業
如要查看 Compute Engine 的搶占作業,請使用Google Cloud console、gcloud CLI 或 Compute Engine API。
控制台
您可以查看系統活動記錄,確認 VM 是否遭到搶占。
前往 Google Cloud 控制台的「記錄」頁面。
選取您的專案並點選 [繼續]。
將
compute.instances.preempted新增至 [filter by label or text search] (按標籤或搜尋字詞篩選) 欄位。您也可以選擇輸入 VM 名稱,查看特定 VM 的搶占作業。
按下 Enter 鍵,套用指定篩選器。 Google Cloud 控制台會更新記錄清單,只顯示 VM 遭到搶占的作業。
在清單中選取作業,即可查看遭搶占 VM 的詳細資料。
gcloud
使用 gcloud compute operations list 指令搭配篩選參數,即可取得專案中的搶占事件清單。
gcloud compute operations list \
--filter="operationType=compute.instances.preempted"
或者,您也可以使用其他篩選參數,進一步縮小結果範圍。舉例來說,如要查看代管執行個體群組中執行個體的搶占事件,請使用下列指令:
gcloud compute operations list \
--filter="operationType=compute.instances.preempted AND targetLink:instances/BASE_INSTANCE_NAME"
其中 BASE_INSTANCE_NAME 是指定為這個受管理執行個體群組中所有 VM 名稱前置字串的基準名稱。
輸出結果會與下列內容相似:
NAME TYPE TARGET HTTP_STATUS STATUS TIMESTAMP systemevent-yyyyyyyy compute.instances.preempted us-central1-f/instances/example-instance-yyy 200 DONE 2015-04-02T12:12:10.881-07:00
如果運算類型為 compute.instances.preempted,表示 VM 執行個體遭到搶占。您可以使用 gcloud compute operations describe 指令,進一步瞭解特定搶占作業。
gcloud compute operations describe SYSTEM_EVENT \
--zone=ZONE
更改下列內容:
SYSTEM_EVENT:gcloud compute operations list指令輸出內容中的系統事件,例如systemevent-yyyyyyyy。ZONE:系統事件的時區,例如us-central1-f。
輸出結果會與下列內容相似:
... operationType: compute.instances.preempted progress: 100 selfLink: https://compute.googleapis.com/compute/v1/projects/my-project/zones/us-central1-f/operations/systemevent-yyyyyyyy startTime: '2015-04-02T12:12:10.881-07:00' status: DONE statusMessage: Instance was preempted. ...
REST
如要取得特定專案和區域的近期系統作業清單,請使用 zoneOperations.get 方法。
GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations
更改下列內容:
如要縮減回應範圍,只顯示搶占作業,可以視需要在 API 要求中新增篩選器:
operationType="compute.instances.preempted"
或者,如要查看特定 VM 的搶占作業,請在篩選條件中新增 targetLink 參數:
operationType="compute.instances.preempted" AND targetLink="https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
請替換下列項目:
+ PROJECT_ID:專案 ID。
+ ZONE:可用區。
+ VM_NAME:這個可用區和專案中特定 VM 的名稱。
回應會包含近期運算的清單。舉例來說,先占的樣子如下:
{
"kind": "compute#operation",
"id": "15041793718812375371",
"name": "systemevent-yyyyyyyy",
"zone": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-f",
"operationType": "compute.instances.preempted",
"targetLink": "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-f/instances/example-instance",
"targetId": "12820389800990687210",
"status": "DONE",
"statusMessage": "Instance was preempted.",
...
}
測試先占設定
您可以在 Spot VM 上執行模擬維護事件,強制預先終止 VM。使用這項功能測試工作負載如何偵測及處理搶占。如要瞭解如何測試執行個體上的維護事件,請參閱「模擬主機維護事件」。
最佳做法
以下列舉幾項最佳做法,協助您充分發揮 Spot VM 的效用。
查看資源可用性。建立 Spot VM 前,或嘗試建立 Spot VM 但持續遇到資源可用性錯誤時,您可以查看特定區域或可用區的機型可用性。檢查資源可用性有助於提高成功建立 Spot VM 的機率。如需操作說明,請參閱「查看 Spot VM 的可用性」。
查看歷來資料。建立 Spot VM 前,您可以查看要使用的機型歷來先占率和歷來價格。這項資訊可協助您比較及選擇最符合工作負載和成本需求的機型。如需操作說明,請參閱「查看 Spot VM 的先占率和價格」。
使用執行個體範本。您可以使用執行個體範本,一次建立多個具有相同屬性的 Spot VM,不必逐一建立。使用 MIG 時必須有執行個體範本。或者,您也可以使用大量執行個體 API 建立多個 Spot VM。
使用 MIG 提高資源可用性,並自動重新建立 Spot VM。 使用受管理執行個體群組,讓 Spot VM 上的工作負載更具彈性和復原能力。舉例來說,如要避免資源可用性錯誤,您可以允許下列事項,提高工作負載的彈性:
此外,MIG 可以自動重新建立遭先占的 Spot VM,藉此修復這些 VM。
選擇較小的機型。Spot VM 的資源來自額外及備份的 Google Cloud 容量。較小的機型通常較容易取得 Spot VM 容量,也就是具備較少 vCPU 和記憶體等資源的機型。選取較小的自訂機型,或許能取得更多 Spot VM 容量,但選取較小的預先定義機型,更有可能取得容量。舉例來說,與
n2-standard-32預先定義機型的容量相比,n2-custom-24-96自訂機型的容量較有可能,但n2-standard-16預先定義機型的容量更有可能。在離峰時段執行大型 Spot VM 叢集。 Google Cloud 資料中心的負載量會因地點和時段而異,但通常在夜間和週末最低。因此,夜間和週末是執行大型 Spot VM 叢集的最佳時機。
設計工作負載時,請確保能容錯及容許搶占。 請務必做好準備,瞭解不同時間點的搶占模式會有所變化。舉例來說,如果某個可用區發生部分中斷,系統可能會先占大量 Spot VM,以便為需要遷移的標準 VM 騰出空間,做為復原程序的一部分。在該短時間內,先占率會與其他任何一天大不相同。如果工作負載假設搶占作業一律會以小群組進行,您可能無法因應這類事件。
重新建立已遭先占的 Spot VM。 如果 Spot VM 遭到先占,請先嘗試建立一到兩次新的 Spot VM,再改用標準 VM。視需求而定,建議在叢集中同時使用標準 VM 和 Spot VM,確保工作以適當的速度進行。
儲存進度,避免搶占。 管理關機和搶占通知,方法是儲存工作負載的進度,這樣工作負載就能從中斷處繼續執行,而不是從頭開始。舉例來說,如「管理 Spot VM 先占」一文所述,每當偵測到先占時,請儲存進度。 為進一步提升韌性,建議定期儲存進度,而不只是在偵測到搶占時才儲存。
後續步驟
- 連線至 VM 執行個體。
- 瞭解關機指令碼。
- 瞭解如何限制 VM 的執行時間。
- 瞭解執行個體範本。
- 瞭解 MIG。