本頁面說明什麼是 Spot VM,以及 Spot VM 在 Google Kubernetes Engine (GKE) 中的運作方式。如要瞭解如何使用 Spot VM,請參閱「使用 Spot VM」。
GKE 中的 Spot VM 總覽
Spot VM 是 Compute Engine 虛擬機器 (VM) 執行個體,價格低於標準 Compute Engine VM,且不保證可用性。Spot VM 提供的機器類型和選項與標準 VM 相同。
您可以在叢集和節點集區中使用 Spot VM,執行無狀態、批次或容錯工作負載,這些工作負載可容許 Spot VM 的暫時性所導致的中斷。
在 Compute Engine 需要資源來執行標準 VM 之前,Spot VM 仍可供使用。
如要進一步瞭解 Spot VM,請參閱 Compute Engine 說明文件中的「Spot VM」。
Spot VM 的優點
Spot VM 和先占 VM 有許多共同優點,包括:
先占 VM 會在 24 小時後過期,但 Spot VM 沒有過期時間。只有在 Compute Engine 需要其他資源時,才會終止 Spot VM。
Spot VM 在 GKE 中的運作方式
使用 Spot VM 建立叢集或節點集區時,GKE 會建立基礎 Compute Engine Spot VM,這些 VM 的行為類似代管執行個體群組 (MIG)。使用 Spot VM 的節點行為與標準 GKE 節點類似,但無法保證可用性。如果需要 Spot VM 使用的資源來執行標準 VM,Compute Engine 會終止這些 Spot VM,將資源用於其他用途。
終止及按適當流程關閉 Spot VM
當 Compute Engine 需要回收 Spot VM 使用的資源時,系統會將終止通知傳送至 GKE。 Spot VM 會在收到終止通知的 30 秒後終止。
根據預設,叢集會使用安全節點關機。 kubelet 會注意到終止通知,並正常終止在節點上執行的 Pod。如果 Pod 屬於受管理的工作負載 (例如 Deployment),控制器會建立並排定新的 Pod,取代終止的 Pod。
Kubelet 會盡量為非系統 Pod 提供 15 秒的正常終止時間,之後系統 Pod (具有 system-cluster-critical
或 system-node-critical
priorityClasses) 會有 15 秒的正常終止時間。在節點正常終止期間,kubelet 會更新 Pod 的狀態,並為終止的 Pod 指派 Failed
階段和 Terminated
原因。
即使您在 Pod 資訊清單的 terminationGracePeriodSeconds
欄位中指定大於 15 秒的值,VM 仍會在終止通知傳送後 30 秒關閉。
當終止的 Pod 數量達到門檻時,垃圾收集會清除 Pod。門檻為:節點少於 100 個的叢集為 1000 個,節點數達 100 個以上的叢集為 5000 個。
您也可以使用下列指令手動刪除已終止的 Pod:
kubectl get pods --all-namespaces | grep -i NodeShutdown | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n
kubectl get pods --all-namespaces | grep -i Terminated | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n
在 Spot VM 上排定工作負載
GKE 會自動將 cloud.google.com/gke-spot=true
和 cloud.google.com/gke-provisioning=spot
(適用於執行 GKE 1.25.5-gke.2500 以上版本的節點) 標籤新增至使用 Spot VM 的節點。您可以在 Pod 規格中使用 nodeSelector 欄位,將特定 Pod 排程到使用 Spot VM 的節點。下列範例使用 cloud.google.com/gke-spot
標籤:
apiVersion: v1
kind: Pod
spec:
nodeSelector:
cloud.google.com/gke-spot: "true"
或者,您也可以使用節點親和性,指示 GKE 將 Pod 排程到 Spot VM 上,類似於下列範例:
apiVersion: v1
kind: Pod
spec:
...
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: cloud.google.com/gke-spot
operator: In
values:
- "true"
...
您也可以nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution
偏好讓 GKE 將 Pod 放置在使用 Spot VM 的節點上。不建議偏好使用 Spot VM,因為 GKE 可能會將 Pod 排程至使用標準 VM 的現有可行節點。
使用 taint 和容許條件排程
為避免系統中斷,請使用節點 taint,確保 GKE 不會將重要工作負載排程到 Spot VM 上。當您為使用 Spot VM 的節點加上 taint 時,GKE 只會將具有相應容許條件的 Pod 排程到這些節點上。
如果您使用節點汙點,請確保叢集也至少有一個節點集區使用標準 Compute Engine VM。使用標準 VM 的節點集區可為 GKE 提供可靠的排程位置,以便排程 DNS 等重要系統元件。
如要瞭解如何為 Spot VM 使用節點 taint,請參閱「為 Spot VM 使用 taint 和容許條件」。
搭配 GPU 節點集區使用 Spot VM
Spot VM 支援使用 GPU。
建立新的 GPU 節點集區時,GKE 會自動將 nvidia.com/gpu=present:NoSchedule
taint 新增至新節點。只有具備對應容許條件的 Pod 才能在這些節點上執行。GKE 會自動將這項容許條件新增至要求 GPU 的 Pod。
建立使用 Spot VM 的 GPU 節點集區前,叢集必須至少有一個使用標準 VM 的現有非 GPU 節點集區。如果叢集只有含 Spot VM 的 GPU 節點集區,GKE 不會將 nvidia.com/gpu=present:NoSchedule
taint 新增至這些節點。因此,GKE 可能會將系統工作負載排程至含有 Spot VM 的 GPU 節點集區,這可能會因 Spot VM 而導致中斷,且 GPU 節點比非 GPU 節點昂貴,因此可能會增加資源消耗量。
叢集自動調度器和節點自動佈建
您可以使用叢集自動配置器和節點自動佈建功能,根據工作負載需求自動調整叢集和節點集區的大小。叢集自動配置器和節點自動佈建功能都支援使用 Spot VM。
Spot VM 和節點自動佈建
節點自動佈建功能會自動在叢集中建立及刪除節點集區,以滿足工作負載需求。使用 nodeSelector
或節點親和性排程需要 Spot VM 的工作負載時,節點自動佈建功能會建立新的節點集區,以容納工作負載的 Pod。GKE 會自動將 cloud.google.com/gke-spot=true:NoSchedule
taint 新增至新節點集區中的節點。只有具備對應容許條件的 Pod 才能在這些節點集區的節點上執行。您必須在部署作業中新增對應的容許條件,才能讓 GKE 將 Pod 放置在 Spot VM 上:
tolerations:
- key: cloud.google.com/gke-spot
operator: Equal
value: "true"
effect: NoSchedule
如要確保 GKE 只在 Spot VM 上排定 Pod,請同時使用容許條件和 nodeSelector
或節點親和性規則,篩選出 Spot VM。
如果只使用容許度排定工作負載,GKE 可以將 Pod 排定至 Spot VM 或現有的標準 VM (具備容量)。如要排定在 Spot VM 上執行的工作負載,請使用 nodeSelector
或節點親和性,以及容許度。詳情請參閱在 Spot VM 上排定工作負載。
Spot VM 和叢集自動調度器
叢集自動配置器會根據需求,自動在節點集區中新增及移除節點。您可以設定叢集自動調度器,優先使用 Spot VM 新增節點。詳情請參閱「Spot VM 和叢集自動配置器」。
預設政策
從 GKE 1.24.1-gke.800 版起,您可以定義自動調度器位置政策。當資源可用且預設位置政策設為 ANY
時,叢集自動調度器會嘗試佈建 Spot VM 節點集區。採用這項政策後,Spot VM 遭先占的風險會降低。如果是其他 VM 類型,預設的叢集自動調度資源分配政策為 BALANCED
。
使用 Spot VM 升級標準節點集區
如果使用 Spot VM 的標準叢集節點集區設定為使用突增升級,GKE 會使用 Spot VM 建立突增節點。不過,由於 Spot VM 不保證可用性,因此 GKE 不會等待 Spot VM 準備就緒,就封鎖並排空現有節點。詳情請參閱「急升升級」。
Kubernetes 行為的修改
在 GKE 上使用 Spot VM 會修改 Kubernetes 提供的部分保證和限制,例如:
- 系統會強制回收 Spot VM,且不適用於
PodDisruptionBudgets
的保證。您可能會遇到比設定的PodDisruptionBudget
更高的無法使用率。
Spot VM 最佳做法
設計使用 Spot VM 的系統時,請遵守下列規範,避免發生重大中斷:
- Spot VM 不保證可用性,設計系統時,請假設 GKE 可能隨時回收任何或所有 Spot VM,且無法保證何時會有新的執行個體可用。
- 如要確保系統在無法使用 Spot VM 的情況下仍能處理您的工作負載和工作,請確認叢集同時具備使用 Spot VM 的節點集區,以及使用標準 Compute Engine VM 的節點集區。
- 新增使用 Spot VM 的 GPU 節點集區前,請先確認叢集至少有一個使用標準 VM 的非 GPU 節點集區。
- 雖然節點重建時節點名稱通常不會變更,但 Spot VM 使用的內部和外部 IP 位址可能會在重建後變更。
- 使用節點 taint 和容許條件,確保重要 Pod 不會排程到使用 Spot VM 的節點集區。
- 如要在 Spot VM 上執行具狀態的工作負載,請先進行測試,確保工作負載能在關機後 25 秒內安全終止,盡量降低永久磁碟區資料損毀的風險。
- 請遵循 Kubernetes Pod 終止最佳做法。
後續步驟
- 瞭解如何在節點集區中使用 Spot VM。
- 瞭解如何自動調度叢集資源。
- 瞭解如何調度已部署的應用程式資源。
- 在 Compute Engine 說明文件中進一步瞭解 Spot VM。
- 參加教學課程,瞭解如何在 GKE 中使用 Spot VM 部署批次工作負載。