Spot VM

本文說明 Spot VM 的定義,以及這類 VM 在 Google Kubernetes Engine (GKE) 中的運作方式。如要進一步瞭解如何使用 Spot VM,請參閱下列文章:

在 Standard 和 Autopilot 模式中,您都可以使用 ComputeClasses 或節點選取器,為工作負載要求 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 有許多共同優點,包括:

Spot VM 還有下列優點:

  • 先占 VM 會在 24 小時後過期,但 Spot VM 沒有到期時間。只有在 Compute Engine 需要其他資源時,才會先占 Spot VM。
  • 使用 Spot VM 時,您可以查看即時可用性和預期正常運作時間,決定要在何處及如何佈建資源。詳情請參閱「查看 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 Pod 時,Autopilot 會自動佈建 Spot VM、新增汙點和容許度,並管理自動調度資源和排程。

終止 Spot VM 和正常關機

當 Compute Engine 需要回收 Spot VM 使用的資源時,系統會將先占通知傳送至 GKE。傳送先占通知後,Compute Engine 會傳送 ACPI G2 Soft Off 信號,開始 VM 的關機程序。

根據預設,GKE 叢集會在收到搶占通知後,為 Pod 提供 30 秒的正常終止時間。這段時間會分成兩部分,Pod 有 15 秒的時間關機,之後重要系統 Pod 也有 15 秒的時間關機。

您可以選擇將正常終止期間延長至 120 秒。設定這段時間的方式取決於您是手動建立節點集區,還是使用自訂 ComputeClass,如下所示:

  • 標準節點集區:如要為標準節點集區設定這段時間,叢集的控制層必須執行 GKE 1.35.0-gke.1171000 以上版本。您可以自訂節點系統設定,為特定標準節點集區設定值,藉此延長時間。如要進一步瞭解特定欄位,請參閱「在 GKE 中正常終止 Spot VM」。

    您可以透過下列任一方式設定這段時間:

    • 新的標準節點集區:使用Google Cloud 控制台或 Google Cloud CLI 建立叢集或節點集區時,在 GKE 中佈建 Spot VM。這些值會儲存在節點系統設定中。
    • 現有 Standard 節點集區:您可以更新節點系統設定,更新現有 Standard 節點集區的正常終止期限。詳情請參閱「透過更新現有節點集區進行編輯」。
  • 自訂 ComputeClass:如要為與自訂 ComputeClass 相關聯的 Spot VM 設定這段時間,請使用 ComputeClass 規格中 kubeletConfig 物件的 shutdownGracePeriodSeconds 和 shutdownGracePeriodCriticalPodsSeconds 欄位。叢集的控制層必須執行 GKE 1.36.0-gke.3204000 以上版本。

根據預設,叢集會在終止通知和關機之間,使用 30 秒的預設時間,安全關閉節點。一般 Pod 有 15 秒的關機時間,之後系統 Pod (具有 system-cluster-critical 或 system-node-critical priorityClasses) 也有 15 秒的關機時間。您可以使用下列欄位延長寬限期:

  • shutdownGracePeriodSeconds:將 Pod 的總寬限期延長至 120 秒,或設為 0 秒 (如果不需要時間進行正常終止)。
  • shutdownGracePeriodCriticalPodsSeconds:延長重要系統 Pod 的終止寬限期。只有在您同時指定 shutdownGracePeriodSeconds 欄位時,這個欄位才會生效。這個欄位的值必須小於 shutdownGracePeriodSeconds 欄位的值。舉例來說,如果您在 shutdownGracePeriodCriticalPodsSeconds 欄位中指定 30 值,並在 shutdownGracePeriodSeconds 欄位中指定 120 值,則一般 Pod 有 90 秒的終止時間,系統 Pod 則有 30 秒的終止時間。

在安全終止期間,如果 Pod 屬於代管工作負載 (例如 Deployment),控制器會建立並排定新的 Pod,取代終止的 Pod。在 Pod 資訊清單的 terminationGracePeriodSeconds 欄位中指定的值大於設定的正常終止期限,不會延長正常終止期限。任何 Pod 的寬限期總長度上限為 120 秒。

在 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 欄位,在採用 Spot VM 的節點上排定特定 Pod。下列範例使用 cloud.google.com/gke-spot 標籤:

apiVersion: v1
kind: Pod
spec:
  nodeSelector:
    cloud.google.com/gke-spot: "true"

或者,您也可以使用節點親和性,指示 GKE 在 Spot VM 上排定 Pod,類似於下列範例:

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 和容許條件排程

為避免系統中斷,請使用節點汙點,確保 GKE 不會將重要工作負載排程至 Spot VM。如果您為使用 Spot VM 的節點設定 taint,GKE 只會將具有相應容許條件的 Pod 排程至這些節點。

如果您使用節點汙點,請確保叢集也至少有一個節點集區使用標準 Compute Engine VM。使用標準 VM 的節點集區可為 GKE 提供可靠的排程位置,以便排程 DNS 等重要系統元件。

如要瞭解如何為 Spot VM 使用節點汙點,請參閱「為 Spot VM 使用汙點和容許度」。

搭配 GPU 節點集區使用 Spot VM

Spot VM 支援使用 GPU。 建立新的 GPU 節點集區時,GKE 會自動將 nvidia.com/gpu=present:NoSchedule 汙點新增至新節點。只有具備對應容許條件的 Pod 才能在這些節點上執行。GKE 會自動將這項容許條件新增至要求 GPU 的 Pod。

建立使用 Spot VM 的 GPU 節點集區前,叢集必須至少有一個使用標準 VM 的現有非 GPU 節點集區。如果叢集只有含 Spot VM 的 GPU 節點集區,GKE 不會將 nvidia.com/gpu=present:NoSchedule 汙點新增至這些節點。因此,GKE 可能會將系統工作負載排程至含有 Spot VM 的 GPU 節點集區,這可能會因 Spot VM 而導致中斷,且 GPU 節點比非 GPU 節點更昂貴,因此可能會增加資源耗用量。

叢集自動調度器和自動佈建節點

您可以透過叢集自動調度器和自動佈建節點功能,依據工作負載需求自動調度叢集和節點集區資源。叢集自動調度器和自動佈建節點功能都支援使用 Spot VM。

Spot VM 和自動佈建節點

自動佈建節點功能會自動在叢集中建立及刪除節點集區,以滿足工作負載需求。使用 nodeSelector 或節點親和性排定需要 Spot VM 的工作負載時,自動佈建節點功能會建立新的節點集區,以容納工作負載的 Pod。GKE 會自動將 cloud.google.com/gke-spot=true:NoSchedule 汙點新增至新節點集區中的節點。只有具備對應容許條件的 Pod,才能在這些節點集區的節點上執行。您必須在 Deployment 中新增對應的容許條件,才能讓 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 準備就緒,就直接封鎖並排空現有節點。詳情請參閱「升級 Surge」。

修改 Kubernetes 行為

在 GKE 上使用 Spot VM 會修改 Kubernetes 提供的一些保證和限制,例如:

  • 系統會強制回收 Spot VM,且不適用於PodDisruptionBudgets的保證。您可能會遇到比設定 PodDisruptionBudget 更高的無法使用率。

Spot VM 最佳做法

設計使用 Spot VM 的系統時,請遵守下列規範,避免發生重大中斷:

  • Spot VM 不保證可用性,設計系統時,請假設 GKE 可能隨時回收任何或所有 Spot VM,且無法保證何時會有新執行個體可用。
  • 建立 Spot VM 前,建議您採取下列做法。 這些動作可確保您想讓 Spot VM 使用的機型可用,且符合工作負載和成本需求。
  • 為確保工作負載和作業即使在沒有 Spot VM 可用的情況下也能處理,請確認叢集混合使用 Spot VM 的節點集區,以及使用標準 Compute Engine VM 的節點集區。
  • 請先確認叢集至少有一個使用標準 VM 的非 GPU 節點集區,再新增使用 Spot VM 的 GPU 節點集區。
  • 節點名稱通常不會在節點重建後變更,但 Spot VM 使用的內部和外部 IP 位址可能會在重建後變更。
  • 使用節點 taint 和容許條件,確保重要 Pod 不會排程到使用 Spot VM 的節點集區。
  • 如要在 Spot VM 上執行具狀態的工作負載,請先進行測試,確保工作負載能在關機後 25 秒內安全終止,盡量降低永久磁碟區資料損毀的風險。
  • 遵循 Kubernetes Pod 終止最佳做法。

後續步驟