本頁面說明如何建立及使用先占虛擬機器 (VM) 執行個體。先占 VM 的折扣最多可達標準 VM 預設價格的 91%。不過,為處理其他工作而必須取回相關資源時,Compute Engine 可能會停止 (先占) 這些 VM。先占 VM 一律會在 24 小時後停止運作。 先占 VM 僅適用於容錯應用程式,且這些應用程式能承受 VM 先占的影響。決定建立先占 VM 前,請先確認應用程式是否可處理先占作業。如要瞭解先占 VM 的風險和價值,請參閱先占 VM 執行個體說明文件。
事前準備
- 閱讀先占 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。
-
安裝 Google Cloud CLI。
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如果您使用本機殼層,請為使用者帳戶建立本機驗證憑證:
gcloud auth application-default login
如果您使用 Cloud Shell,則不需要執行這項操作。
如果系統傳回驗證錯誤,且您使用外部識別資訊提供者 (IdP),請確認您已 使用聯合身分登入 gcloud CLI。
-
安裝 Google Cloud CLI。
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如果您使用本機殼層,請為使用者帳戶建立本機驗證憑證:
gcloud auth application-default login
如果您使用 Cloud Shell,則不需要執行這項操作。
如果系統傳回驗證錯誤,且您使用外部識別資訊提供者 (IdP),請確認您已 使用聯合身分登入 gcloud CLI。
-
安裝 Google Cloud CLI。
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如果您使用本機殼層,請為使用者帳戶建立本機驗證憑證:
gcloud auth application-default login
如果您使用 Cloud Shell,則不需要執行這項操作。
如果系統傳回驗證錯誤,且您使用外部識別資訊提供者 (IdP),請確認您已 使用聯合身分登入 gcloud CLI。
Go
如要在本機開發環境中使用本頁的 Go 範例,請安裝並初始化 gcloud CLI,然後使用使用者憑證設定應用程式預設憑證。
詳情請參閱「 設定本機開發環境的驗證機制」。
Java
如要在本機開發環境中使用本頁的 Java 範例,請安裝並初始化 gcloud CLI,然後使用使用者憑證設定應用程式預設憑證。
詳情請參閱「 設定本機開發環境的驗證機制」。
Node.js
如要在本機開發環境中使用本頁的 Node.js 範例,請安裝並初始化 gcloud CLI,然後使用您的使用者憑證設定應用程式預設憑證。
詳情請參閱「 設定本機開發環境的驗證機制」。
Python
如要在本機開發環境中使用本頁的 Python 範例,請安裝並初始化 gcloud CLI,然後使用使用者憑證設定應用程式預設憑證。
詳情請參閱「 設定本機開發環境的驗證機制」。
REST
如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。
安裝 Google Cloud CLI。
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」。
建立先占 VM
使用 gcloud CLI 或 Compute Engine API 建立先占 VM。如要使用Google Cloud 控制台,請改為建立 Spot VM。
gcloud
使用 gcloud compute 時,請使用與建立一般 VM 相同的 instances create 指令,但要新增 --preemptible 標記。
gcloud compute instances create VM_NAME --preemptible
其中 VM_NAME 是 VM 的名稱。
Go
Java
Node.js
Python
REST
在 API 中,建構建立 VM 的一般要求,但請在 scheduling 下方加入 preemptible 屬性,並將其設為 true。例如:
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
{
'machineType': 'zones/ZONE/machineTypes/MACHINE_TYPE',
'name': 'INSTANCE_NAME',
'scheduling':
{
'preemptible': true
},
...
}
先占 CPU 配額
先占 VM 需要可用的 CPU 配額,與標準 VM 相同。為避免先占 VM 耗用標準 VM 的 CPU 配額,您可以申請「先占 CPU」配額。Compute Engine 在該區域授予您先占 CPU 配額後,所有先占 VM 都會計入該配額,所有標準 VM 則會繼續計入標準 CPU 配額。
在沒有先占 CPU 配額的區域,您可以使用標準 CPU 配額啟動先占 VM。此外,您也需要足夠的 IP 和磁碟配額。除非 Compute Engine 已授予配額,否則 gcloud CLI 或Google Cloud 控制台配額頁面不會顯示可搶占 CPU 配額。
如要進一步瞭解配額的相關資訊,請造訪資源配額頁面。
啟動遭預先終止的 VM
與其他 VM 相同,如果先占 VM 停止或遭到先占,您可以再次啟動 VM,讓 VM 回到 RUNNING 狀態。啟動先占 VM 會重設 24 小時計數器,但由於這仍是先占 VM,Compute Engine 可以在 24 小時前先占。先占 VM 執行期間無法轉換為標準 VM。
如果 Compute Engine 停止自動調度資源的代管執行個體群組 (MIG) 或 Google Kubernetes Engine 叢集中的先占 VM,當資源再次可用時,群組會重新啟動 VM。
使用關機指令碼處理先占
當 Compute Engine 搶占 VM 時,您可以使用關機指令碼,在 VM 遭到搶占前嘗試執行清除動作。舉例來說,您可以正常停止執行中的程序,並將檢查點檔案複製到 Cloud Storage。請注意,先占 VM 的關機時間長度上限比使用者發起的關機作業短。如要進一步瞭解先占通知的關機期限,請參閱概念說明文件中的「先占程序」。
以下是關機指令碼,您可以新增至正在執行的先占 VM,或在建立新的先占 VM 時新增。VM 開始關機時,系統會執行這段指令碼,然後作業系統的正常 kill 指令會停止所有剩餘程序。在正常停止所選程式後,指令碼會將檢查點檔案平行上傳至 Cloud Storage 值區。
#!/bin/bash
MY_PROGRAM="PROGRAM_NAME" # For example, "apache2" or "nginx"
MY_USER="LOCAL_USERNAME"
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,請設定指令碼以搭配 VM 上的應用程式運作,然後將指令碼新增至 VM 的中繼資料。
- 將關機指令碼複製或下載到本機工作站。
- 開啟檔案以編輯並變更下列變數:
PROGRAM_NAME是要關閉的程序或程式名稱。例如:apache2或nginx。LOCAL_USERNAME是您登入虛擬機器的使用者名稱。BUCKET_NAME是要儲存程式檢查點檔案的 Cloud Storage bucket 名稱。請注意,在本範例中,bucket 名稱開頭不是gs://。
- 儲存變更。
- 將關機指令碼新增至新 VM 或現有 VM。
這段指令碼假設您已完成下列事項:
建立 VM 時,至少具備 Cloud Storage 的讀寫權限。 如需瞭解如何建立具有適當範圍的 VM,請參閱驗證說明文件。
您有現成的 Cloud Storage bucket,且具備寫入權限。
找出先占 VM
如要檢查 VM 是否為先占 VM,請按照步驟找出 VM 的佈建模型和終止動作。
判斷 VM 是否遭到搶占
使用Google Cloud console、gcloud CLI 或 API,判斷 VM 是否遭到搶占。
控制台
您可以查看系統活動記錄,確認 VM 是否遭到搶占。
前往 Google Cloud 控制台的「記錄」頁面。
選取您的專案並點選 [繼續]。
將
compute.instances.preempted新增至 [filter by label or text search] (按標籤或搜尋字詞篩選) 欄位。您也可以選擇輸入 VM 名稱,查看特定 VM 的搶占作業。
按下 Enter 鍵,套用指定篩選器。 Google Cloud 控制台會更新記錄清單,只顯示 VM 遭到搶占的作業。
在清單中選取作業,即可查看遭搶占 VM 的詳細資料。
gcloud
請使用 gcloud compute operations list 指令搭配 filter 參數,取得專案的先占事件清單。
gcloud compute operations list \
--filter="operationType=compute.instances.preempted"
您可以使用 filter 參數進一步指定結果範圍。舉例來說,如要查看代管執行個體群組中 VM 的先占事件,請執行下列操作:
gcloud compute operations list \
--filter="operationType=compute.instances.preempted AND targetLink:instances/BASE_VM_NAME"
gcloud 會傳回類似以下內容的回應:
NAME TYPE TARGET HTTP_STATUS STATUS TIMESTAMP systemevent-yyyyyyyy compute.instances.preempted us-central1-f/instances/example-vm-yyy 200 DONE 2015-04-02T12:12:10.881-07:00
作業類型為 compute.instances.preempted 表示 VM 已遭到搶占。您可以使用 operations describe 指令取得特定先占作業的相關詳細資訊。
gcloud compute operations describe \
systemevent-yyyyyyyy
gcloud 會傳回類似以下內容的回應:
... operationType: compute.instances.preempted progress: 100 selfLink: https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-central1-f/operations/systemevent-yyyyyyyy startTime: '2015-04-02T12:12:10.881-07:00' status: DONE statusMessage: Instance was preempted. ...
REST
如要取得最近的系統作業清單,請傳送 GET 要求至區域作業 URI。
GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/operations
回應會包含近期作業的清單。
{
"kind": "compute#operation",
"id": "15041793718812375371",
"name": "systemevent-yyyyyyyy",
"zone": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-central1-f",
"operationType": "compute.instances.preempted",
"targetLink": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-central1-f/instances/EXAMPLE_VM",
"targetId": "12820389800990687210",
"status": "DONE",
"statusMessage": "Instance was preempted.",
...
}如要將回應範圍限制為僅顯示先占作業,您可以在 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"。
或者,您也可以從 VM 內部判斷 VM 是否遭到搶占。如果您想在關機指令碼中,以不同於正常關機的方式處理因 Compute Engine 先占而造成的關機,這項功能就很有用。如要執行這項操作,請在 VM 的預設執行個體中繼資料中,檢查中繼資料伺服器的 preempted 值。
舉例來說,您可以在 VM 中使用 curl,取得 preempted 的值:
curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted" -H "Metadata-Flavor: Google"
TRUE
如果這個值為 TRUE,表示 VM 已遭 Compute Engine 先占,否則為 FALSE。
如果您想在關閉指令碼以外的地方使用它,請將 ?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
測試先占設定
您可以在 VM 上執行模擬維護事件,強制 VM 搶占資源。使用這項功能測試應用程式如何處理可搶占 VM。請參閱測試可用性政策,瞭解如何測試 VM 的維護事件。
您也可以停止 VM,模擬 VM 先占作業,這項做法可取代模擬維護事件,且不會受到配額限制。
最佳做法
以下是可協助您善用先佔 VM 執行個體的幾個最佳做法。
使用大量執行個體 API
您可以使用大量執行個體 API,不必建立單一 VM。
挑選較小的機器類型
先占 VM 的資源來自額外及備份 Google Cloud容量。較小的機器類型通常更容易取得容量,也就是具備較少 vCPU 和記憶體等資源的機器類型。選取較小的自訂機型,或許能找到更多先占 VM 的容量,但選取較小的預先定義機型,更有可能找到容量。舉例來說,與n2-standard-32預先定義機型的容量相比,n2-custom-24-96自訂機型的容量較有可能,但n2-standard-16預先定義機型的容量更有可能。
在離峰時段執行大型先占 VM 叢集
Google Cloud 資料中心的負載量會因地點和時段而異,但通常在夜間和週末最低。因此,夜間和週末是執行大型先占 VM 叢集的最佳時機。
將應用程式設計為容錯且能承受先占
請務必做好準備,瞭解不同時間點的搶占模式會有所變化。舉例來說,如果可用區發生部分中斷,系統可能會先占大量可先占用的 VM,以便為需要遷移的標準 VM 騰出空間,做為復原程序的一部分。在該短時間內,先占率會與其他任何一天大不相同。如果應用程式假設先占作業一律會以小群組形式完成,您可能無法為這類事件做好準備。您可以停止 VM 執行個體,測試應用程式在搶占事件下的行為。
重新嘗試建立已遭先占的 VM
如果 VM 執行個體遭到先占,請先嘗試建立一到兩次新的先占 VM,再改用標準 VM。視需求而定,建議在叢集中同時使用標準 VM 和先占 VM,確保工作以適當的速度進行。
使用關閉指令碼
請使用關閉指令碼管理關閉與先占通知,該指令碼要能夠儲存工作進度以接續上次進度,而不用從頭開始。
後續步驟
- 參閱先占 VM 執行個體說明文件。
- 瞭解關閉指令碼。
- 連線至 VM。