延長 Autopilot Pod 的執行時間


本頁說明如何在 Pod 遭 Google Kubernetes Engine (GKE) 驅逐前,要求延長 Pod 的執行時間。

關於 GKE 啟動的 Pod 逐出作業

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

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

用途

您可能會想告訴 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,取得最新版本。

限制

  • 您無法要求延長 Spot Pod 的執行時間。
  • 計算延長執行時間時,系統會計入圖片提取時間。
  • 每個叢集最多可有 50 個延長時數的工作負載 (具有不同的 CPU 要求)。也就是說,通過 Autopilot 資源最低限制、比例和增量大小檢查後,每個叢集最多可有 50 組不同的 CPU 要求值,且可延長持續時間。
  • 您無法在延長時間的 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 會因記憶體不足而將其逐出 (OOMKill)
    • Compute Engine VM 維護事件。加速器最佳化機器類型較容易受到這些事件影響,因為這類機器不支援即時遷移
    • 節點自動修復
    • 使用者發起的事件,例如排空節點
  • 您可以在標準叢集中使用 cluster-autoscaler.kubernetes.io/safe-to-evict 註解,但結果並不相同。即使發生縮減事件,Pod 也會無限期執行,導致系統無法刪除未充分運用的節點,而您必須繼續支付這些節點的費用。Pod 也無法避免因節點自動升級而遭到驅逐。

後續步驟