Spot VM

本頁面說明什麼是 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 節點類似,但無法保證可用性。如果執行標準 VM 需要 Spot VM 使用的資源,Compute Engine 會終止這些 Spot VM,將資源用於其他用途。

終止及正常關機 Spot VM

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

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

您可以選擇將正常終止期間延長至 120 秒。設定這段時間目前為搶先版,且叢集的控制層必須執行 GKE 1.35.0-gke.1171000 以上版本。您可以自訂節點系統設定,為特定標準節點集區設定值,藉此延長時間。詳情請參閱「在 GKE 中正常終止 Spot VM」。此方法僅支援標準模式。

根據預設,叢集會使用安全節點關機,在終止通知和關機之間預設有 30 秒的間隔。一般 Pod 有 15 秒的關機時間,之後系統 Pod (具有 system-cluster-criticalsystem-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=truecloud.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 將 Pod 排程至 Spot VM,請同時使用容許條件和 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 的節點集區,以及使用標準 Compute Engine VM 的節點集區。
  • 新增使用 Spot VM 的 GPU 節點集區前,請先確認叢集至少有一個使用標準 VM 的非 GPU 節點集區。
  • 雖然節點重建時節點名稱通常不會變更,但 Spot VM 使用的內部和外部 IP 位址可能會在重建後變更。
  • 使用節點 taint 和容許條件,確保重要 Pod 不會排程到使用 Spot VM 的節點集區。
  • 如要在 Spot VM 上執行具狀態的工作負載,請先進行測試,確保工作負載能在關機後 25 秒內安全終止,盡量降低永久磁碟區資料損毀的風險。
  • 請遵循 Kubernetes Pod 終止最佳做法

後續步驟