設定 Pod 優先順序
透過 Pod 優先級與搶佔機制,您可以配置優先級類別,以指定構成 Kubernetes 叢集工作負載的各 Pod 之間的相對優先級。 Kubernetes 排程器會將 Pod 的優先順序列入考量,甚至可以先占(移除)具有較低優先順序的 Pod,以便在工作者節點上騰出空間給較高優先順序的 Pod。
- 為什麼要設定 Pod 優先級?
- 身為叢集管理者,您要控制哪些 Pod 對於叢集工作負載更為重要。 優先順序等級可協助您控制 Kubernetes 排程器決策,使高優先順序 Pod 勝過低優先順序 Pod。 Kubernetes 排程器甚至可以預先終止(移除)正在執行的較低優先級 Pod,以便將待處理的較高優先級 Pod 納入排程。
藉由設定 Pod 優先順序,您可以協助防止較低優先順序的工作負載影響叢集裡的重要工作負載,尤其是在叢集開始達到其資源容量的情況下。
請確保您的叢集已配置叢集安全策略 ( 設定適當的用戶存取權限 ),如有需要,也請配置 Pod 安全策略 (PSPs)。 存取政策與 PSP 可協助防止不可信使用者部署高優先級的 Pod,以免這些 Pod 阻礙其他 Pod 的排程。
優先排程和搶占機制是如何運作的?
一般而言,具有較高優先順序的擱置中 Pod 會排程在較低優先順序 Pod 之前。 若您的工作節點中剩餘資源不足,Kubernetes 排程器可能會預先終止(移除)某些 Pod,以釋放足夠的資源,供優先級較高的 Pod 進行排程。 先占也受到溫和終止期間、Pod 中斷預算及工作者節點親緣性的影響。
若未為 Pod 部署指定優先級,預設值將設定為作為「globalDefault」所設定的優先級類別。 如果您沒有 globalDefault 優先順序等級,則所有 Pod 的預設優先順序為零 (0)。依預設,IBM Cloud Kubernetes Service 未設定 globalDefault,因此 Pod 預設優先順序為零。
要了解 pod 優先級與 Kubernetes 排程器 如何協同運作,請參考下圖所示的各種情境。 您必須在具有可用資源的工作者節點上放置已設定優先順序的 Pod。 否則,在移除現有 Pod 的同時,叢集裡的高優先順序 Pod 可能保持擱置狀態,如「情境 3」所示。
- 具有高、中、低優先順序的三個 Pod 擱置排程。 Kubernetes 排程器會尋找一個可容納這三個 Pod 的可用工作節點,並依照優先順序將它們排程,優先級最高的 Pod 會優先排程。
- 具有高、中、低優先順序的三個 Pod 擱置排程。 Kubernetes 調度程式找到了一個可用的工作節點,但該工作節點的資源僅足以支援高優先級和中優先級的 Pod。 低優先順序 Pod 未進行排程而保持擱置。
- 具有高及中優先順序的兩個 Pod 擱置排程。 可用的工作者節點上具有低優先順序的第三個 Pod。 不過,工作者節點沒有足夠的資源來進行任何擱置 Pod 的排程。 Kubernetes 排程器會預先終止(或移除)該低優先級 Pod,使該 Pod 回復至待處理狀態。 接著,Kubernetes 排程器會嘗試為該高優先級 Pod 進行排程。 然而,工作節點沒有足夠的資源來排程該高優先級 Pod,因此,Kubernetes 排程器改為排程該中等優先級 Pod。
如需更多資訊,請參閱 Kubernetes 有關 pod 優先級與預先佔用的文件。
- 我可以停用 Pod 優先級准入控制器嗎?
- 次數 若您不想使用 Pod 優先級,請勿在 Pod 部署中設定
globalDefault或包含優先級類別。 除了 IBM 使用預設優先順序等級部署的叢集重要 Pod 之外,每個 Pod 都預設為零。 因為 Pod 優先順序是相對的,所以此基本設定確保叢集重要 Pod 已針對資源設定了優先順序,並遵循您已設定的現有排程原則來排程任何其他 Pod。 - 資源配額如何影響 Pod 的優先級?
- 您可以將 Pod 優先順序與資源配額 (包括 配額範圍) 組合使用。 使用配額範圍,您可以將資源配額設為帳戶,以取得 Pod 優先順序。 較高優先順序的 Pod 會在較低優先順序的 Pod 之前,開始耗用資源配額所限制的系統資源。
瞭解預設優先順序等級
依預設,您的 IBM Cloud® Kubernetes Service 叢集具有一些優先順序等級。
請不要修改預設等級,其係用來正確管理您的叢集。 您可以在應用程式部署中使用這些等級,或建立您自己的優先順序等級。
下表說明依預設存在於您叢集裡的優先順序等級及其使用原因。
| 名稱 | 設定者 | 優先順序值 | 目的 |
|---|---|---|---|
system-node-critical |
Kubernetes | 2000001000 | 請為在建立叢集時 部署至特權系統命名空間 的 Pod 選取此優先級類別,以保護工作節點的關鍵功能,例如網路、儲存、記錄、監控及指標相關的 Pod。 |
system-cluster-critical |
Kubernetes | 2000000000 | 請針對在建立叢集時 部署至特權系統命名空間 的 Pod,使用此優先級類別來保護叢集的關鍵功能,例如網路、儲存、記錄、監控及指標相關的 Pod。 |
ibm-app-cluster-critical |
IBM | 900000000 | 請為在建立叢集時 部署至特權系統命名空間 的 Pod 選取此優先級類別,以保護應用程式的關鍵功能,例如負載平衡器 Pod。 |
您可以執行下列指令來檢查哪些 Pod 使用優先順序等級。
kubectl get pods --all-namespaces -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName
建立優先順序等級
若要設定 Pod 優先順序,您必須使用優先順序等級。
開始之前:
- 請登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。
- 請確認您已擁有
default命名空間的 作家 或 經理 IBM Cloud IAM 服務存取角色。
-
列出現有的優先順序等級。 您可以將現有的優先級類別作為新類別的範本。
kubectl get priorityclasses -
選擇您要複製的優先順序等級,並建立本端 YAML 檔案。
kubectl get priorityclass <priority_class> -o yaml > Downloads/priorityclass.yaml -
建立優先順序等級 YAML 檔案。
apiVersion: scheduling.k8s.io/v1alpha1 kind: PriorityClass metadata: name: <priority_class_name> value: <1000000> globalDefault: <false> description: "Use this class for XYZ service pods only."瞭解 YAML 檔案元件 元件 說明 name必要項目:您要建立的優先順序等級的名稱。 value必要項目:輸入小於或等於 10 億 (1000000000) 的整數。 值越高,優先順序越高。 這些值相對於叢集裡其他優先順序等級的值。 請為那些您不希望被預先終止(移除)的系統關鍵 Pod 預留非常高的數量。 舉例來說,預設的「叢集關鍵」優先級類別的數值範圍為 900000000 至 2000001000,因此為新的優先級類別設定時,請輸入小於這些數值的數值,以確保沒有任何物件的優先級高於這些 Pod。
globalDefault選用項目:將欄位設為 true,讓此優先順序等級成為廣域預設值,其將套用至每一個未使用priorityClassName值進行排程的 Pod。 您的叢集裡只有一個優先順序等級可以設為廣域預設值。 如果沒有廣域預設值,則未指定priorityClassName的 Pod 具有優先順序零 (0)。預設優先順序類別 不會設定
globalDefault。 若您在叢集中建立了其他優先級類別,可執行kubectl describe priorityclass <name>,以確認這些類別是否設定了globalDefault。description選用項目:告訴使用者為何要使用此優先順序等級。 請使用引號 ( "") 括住字串。 -
在叢集裡建立優先順序等級。
kubectl apply -f filepath/priorityclass.yaml -
驗證是否已建立優先順序等級。
kubectl get priorityclasses
太好了! 您已建立優先順序等級。 讓您的團隊瞭解優先順序等級,以及它們必須用於其 Pod 部署的優先順序等級(如果有的話)。
指派 Pod 的優先順序
在 Pod 規格中指派優先順序等級,以便在 IBM Cloud Kubernetes Service 叢集內設定 Pod 的優先順序。
開始之前:
- 請登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。
- 請確保您已在欲部署 Pod 的命名空間中擁有
[**作家** 或 **經理** IBM Cloud IAM 服務存取角色](/docs/containers?topic=containers-iam-platform-access-roles)。 - 瞭解優先順序排程的運作方式,因為優先順序可能先佔現有的 Pod,並影響叢集資源的使用。
請完成以下步驟,以檢查其他已部署 Pod 的重要性,以便您根據現有部署狀況,為您的 Pod 選擇正確的優先級類別。
-
檢視名稱空間中的其他 Pod 使用的優先順序等級。
kubectl get pods -n <namespace> -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName -
取得優先順序等級的詳細資料,並記下 value 數字。 具有較高數字的 Pod 的優先順序是在具有較低數字的 Pod 之前。 對於您想要檢閱的每一個優先順序等級重複此步驟。
kubectl describe priorityclass <priorityclass_name> -
取得您要使用的優先順序等級,或建立您自己的優先順序等級。
kubectl get priorityclasses -
在您的 Pod 規格中,把您在前一個步驟擷取的優先順序等級的名稱新增至
priorityClassName欄位中。apiVersion: apps/v1 kind: Deployment metadata: name: ibmliberty spec: replicas: 1 selector: matchLabels: app: ibmliberty template: metadata: labels: app: ibmliberty spec: containers: - name: ibmliberty image: icr.io/ibm/liberty:latest ports: - containerPort: 9080 priorityClassName: <priorityclass_name> -
在您要在其中部署的名稱空間中建立已設定優先順序的 Pod。
kubectl apply -f filepath/pod-deployment.yaml