延長 Autopilot Pod 的執行時間

本頁面說明如何要求延長 Pod 的執行時間,以免 Pod 遭到 Google Kubernetes Engine (GKE) 淘汰。

關於 GKE 啟動的 Pod 逐出作業

在 Kubernetes 上執行工作負載時,Pod 遭到驅逐是正常現象。在排定的事件 (例如自動節點升級和自動調度資源縮減) 期間,GKE 會逐出工作負載,確保節點維持在最新狀態,並充分運用資源。根據預設,事件發生後,GKE 會立即將終止訊號傳送至容器,之後容器會有一段寬限期可終止,Kubernetes 才會逐出 Pod。如果是自動節點升級,寬限期最多可達一小時。如果是縮減事件,寬限期最多可達 10 分鐘。

Kubernetes 內建容器可使用的功能,可妥善處理逐出作業,例如 PodDisruptionBudgets和正常終止期限。不過,部分工作負載 (例如批次佇列或多人遊戲伺服器) 需要較長時間才能遭驅逐。GKE 在啟動逐出作業時授予的預設寬限期,可能不足以因應這些工作負載的需求。在這些情況下,您可以告知 Autopilot 最多 7 天內不要逐出特定工作負載。

您可以為在 Autopilot 叢集中執行的工作負載,或 GKE Standard 中的 Autopilot 模式工作負載要求延長執行時間。

用途

以下列出幾種情況,您可能會希望 GKE 避免驅逐工作負載:

  • 您執行多人遊戲伺服器,如果伺服器提早終止,玩家就會遭到踢出工作階段。
  • 你執行的音訊或視訊會議軟體,會在伺服器終止時中斷進行中的會議。
  • 您執行的工作需要時間才能完成,提前終止會導致進行中的工作遺失。
  • 您執行的有狀態服務較無法容忍中斷,因此希望盡量減少中斷次數。

定價

您可以要求延長 Pod 的執行時間,不需額外付費。不過,請注意下列行為變更,這些變更可能會影響價格:

  • Autopilot 會對延長時間長度 Pod 的資源要求,強制執行較高的最小值。Autopilot 會根據執行中 Pod 的資源要求向您收費。系統不會收取系統負擔或未使用的節點容量費用。
  • 使用延長時間的 Pod 可能會增加叢集中的節點數量,進而影響 IP 位址用量和可擴充性。如果 DaemonSet 在每個節點上執行,叢集中的 DaemonSet 數量就會增加。

如需定價詳細資料,請參閱「Autopilot 定價」。

事前準備

開始之前,請務必先完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
  • 確認您有現有的 GKE 叢集。

限制

  • 您無法要求延長 Spot Pod 的執行時間。
  • 計算延長執行時間時,系統會計入圖片提取時間。
  • 每個叢集最多可有 50 個延長時間的工作負載 (具有不同的 CPU 要求)。也就是說,每個叢集最多可有 50 組不同的 CPU 要求值,在通過 Autopilot 資源下限、比率和增量大小檢查後,延長時間長度。
  • 您無法在延長時間長度的 Pod 中使用 Kubernetes Pod 間親和性。
  • GKE 會盡可能將每個延長執行時間的 Pod 放在自己的節點上。這項行為可確保節點在資源使用率偏低時縮減規模。
  • 如果 Pod 的目標是自訂運算類別,則無法要求延長執行時間。

要求延長執行時間

如要要求延長 Pod 的執行時間,請在 Pod 規格中將 Kubernetes cluster-autoscaler.kubernetes.io/safe-to-evict 註解設為 false。

  1. 將下列資訊清單儲存為 extended-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: extended-pods
      labels:
        duration: extended
    spec:
      selector:
        matchLabels:
          duration: extended
      template:
        metadata:
          annotations:
            cluster-autoscaler.kubernetes.io/safe-to-evict: "false"
          labels:
            duration: extended
        spec:
          containers:
          - name: example-container
            image: registry.k8s.io/pause
            resources:
              requests:
                cpu: 200m
    
  2. 建立 Deployment:

    kubectl create -f extended-deployment.yaml
    

Pod 會持續執行至少 7 天,之後才能縮減規模或自動升級節點。

注意事項和建議

使用這項功能時,請注意下列事項:

  • 延長時間長度的 Pod 不會受到保護,仍可能因優先順序而遭淘汰。如果您使用 Kubernetes PriorityClasses,請考慮下列方法,盡量減少因優先順序而遭到驅逐的機率:
    • 請確保延長時間長度的 Pod 使用最高優先順序的 PriorityClass,以免其他使用者 Pod 淘汰延長時間長度的 Pod。
    • 使用工作負載分離功能,將長時間執行的 Pod 與其他 Pod 分開執行。
  • 系統 Pod 會以最高優先順序執行,且一律可以驅逐長時間執行的 Pod。為盡可能降低這種情況發生的機率,GKE 會先在節點上排定系統 Pod,再排定延長時間長度的 Pod。
  • 在下列情況下,延長時間長度的 Pod 仍可能提早遭到淘汰:

    • 為優先順序較高的使用者 Pod (使用較高的 PriorityClass) 騰出空間而逐出 Pod
    • 為 Kubernetes 系統元件騰出空間而逐出 Pod
    • kubelet 記憶體不足而終止 如果 Pod 使用的記憶體超過要求量 (OOMKill)
    • Compute Engine VM 維護事件。 加速器最佳化機器類型較容易受到這些事件影響,因為這類機器不支援即時遷移。
    • 節點自動修復
    • 使用者啟動的事件,例如:

  • 您可以在 Standard 叢集中使用 cluster-autoscaler.kubernetes.io/safe-to-evict 註解,但結果並不相同。即使發生縮減事件,Pod 仍會無限期執行,導致使用率偏低的節點無法刪除,您也必須繼續支付這些節點的費用。Pod 也無法避免因節點自動升級而遭到驅逐。

後續步驟