本頁說明如何在 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
,取得最新版本。
- 確認您有執行 1.27 以上版本的 Autopilot 叢集。
限制
- 您無法要求延長 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 系統元件騰出空間而執行的驅逐作業
- 如果 Pod 使用的記憶體超過要求量,kubelet 會因記憶體不足而將其逐出 (OOMKill)
- Compute Engine VM 維護事件。加速器最佳化機器類型較容易受到這些事件影響,因為這類機器不支援即時遷移。
- 節點自動修復
- 使用者發起的事件,例如排空節點
- 您可以在標準叢集中使用
cluster-autoscaler.kubernetes.io/safe-to-evict
註解,但結果並不相同。即使發生縮減事件,Pod 也會無限期執行,導致系統無法刪除未充分運用的節點,而您必須繼續支付這些節點的費用。Pod 也無法避免因節點自動升級而遭到驅逐。