本頁說明如何在 Pod 遭 Google Kubernetes Engine (GKE) 驅逐前,要求延長 Pod 的執行時間。
關於 GKE 啟動的 Pod 逐出作業
在 Kubernetes 上執行工作負載時,Pod 逐出是正常現象。 在排定的事件 (例如節點自動升級和自動調度資源縮減) 期間,GKE 會逐出工作負載,確保節點維持在最新狀態,並盡可能有效率地使用資源。根據預設,事件發生後,GKE 會立即將終止訊號傳送至容器,之後容器會有一段寬限期可終止,然後 Kubernetes 會逐出 Pod。如果是自動升級節點,寬限期最多可達一小時。如果是縮減事件,寬限期最多可達 10 分鐘。
Kubernetes 內建容器可使用的功能,可妥善處理逐出作業,例如 PodDisruptionBudgets和正常終止期限。不過,部分工作負載 (例如批次佇列或多人遊戲伺服器) 需要較長時間才能執行完畢,因此不適合遭到驅逐。GKE 在啟動逐出作業時提供的預設寬限期,可能不足以因應這些工作負載的需求。在這些情況下,您可以告知 Autopilot 最多 7 天內不要逐出特定工作負載。
您可以為在 Autopilot 叢集中執行的工作負載,或 GKE Standard 中的 Autopilot 模式工作負載,要求延長執行時間。
用途
您可能會想告訴 GKE 避免驅逐工作負載的情況包括:
- 您執行的多人遊戲伺服器會將玩家踢出工作階段 (如果伺服器提早終止)。
- 您執行的音訊或視訊會議軟體,會在伺服器終止時中斷進行中的會議。
- 您執行的工作需要時間才能完成,提早終止會導致進行中的工作遺失。
- 您執行的有狀態服務較無法容忍中斷,因此希望盡量減少中斷次數。
定價
你可以申請延長 Pods 的運作時間,不需額外付費。 不過,請注意下列行為變更可能會影響價格:
- 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 要求)。也就是說,通過 Autopilot 資源最低限制、比例和增量大小檢查後,每個叢集最多可有 50 組不同的 CPU 要求值,且可延長持續時間。
- 您無法在延長時間的 Pod 中使用 Kubernetes Pod 間親和性。
- 只要情況允許,GKE 會將每個延長執行時間的 Pod 放在自己的節點上。這項行為可確保節點在資源使用率偏低時縮減規模。
- 如果 Pod 的目標是自訂運算類別,則無法要求延長執行時間。
要求延長執行時間
如要延長 Pod 的執行時間,請在 Pod 規格中,將 Kubernetes cluster-autoscaler.kubernetes.io/safe-to-evict 註解設為 false。
將下列資訊清單儲存為
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建立 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 系統元件騰出空間而執行的驅逐作業
- kubelet 記憶體不足而終止 如果 Pod 使用的記憶體超過要求量 (OOMKill)
- Compute Engine VM 維護事件。加速器最佳化機器類型 較容易受到這些事件影響,因為這類機器不支援即時遷移。
- 節點自動修復
使用者啟動的事件,例如:
- 手動升級 Autopilot 代管節點集區。無論 Pod 執行時間長短,GKE 都會繼續執行作業。
- 正在清空節點。
您可以在標準叢集中使用
cluster-autoscaler.kubernetes.io/safe-to-evict註解,但結果並不相同。即使發生縮減事件,Pod 仍會無限期執行,導致系統無法刪除使用率偏低的節點,您也必須繼續支付這些節點的費用。Pod 也無法避免因節點自動升級而遭到驅逐。