設定 Pod 優先順序
透過 Pod 優先順序和優先佔用權,您可以設定優先順序等級,以顯示組成 Red Hat OpenShift 群集工作負載的 Pod 的相對優先順序。 Red Hat OpenShift 控制器會考量 Pod 的優先級,甚至可以預先終止(移除)優先級較低的 Pod,以便在工作節點上為優先級較高的 Pod 騰出空間。 如需詳細資訊,請參閱 Red Hat OpenShift 文件。
- 為什麼要設定 Pod 優先級?
- 身為叢集管理者,您要控制哪些 Pod 對於叢集工作負載更為重要。 優先級類別可協助您控制 Red Hat OpenShift 控制器,使其在決策時優先處理優先級較高的 Pod,而非優先級較低的 Pod。 Red Hat OpenShift 控制器甚至可以預先終止(移除)正在執行的較低優先級 Pod,以便將待處理的較高優先級 Pod 納入排程。
藉由設定 Pod 優先順序,您可以協助防止較低優先順序的工作負載影響叢集裡的重要工作負載,尤其是在叢集開始達到其資源容量的情況下。
請確定您已 設定適當的使用者存取權 來存取叢集,並在適用時,設定 安全環境定義限制(SCC)。 存取政策和 SCC 可協助防止未經信任的使用者部署高優先級的 Pod,以免這些 Pod 阻礙其他 Pod 的調度。
優先排程與搶占機制是如何運作的?
一般而言,具有較高優先順序的擱置中 Pod 會排程在較低優先順序 Pod 之前。 若您的工作節點中剩餘資源不足,Red Hat OpenShift 控制器可能會預先終止(移除)Pod,以釋放足夠的資源,讓優先級較高的 Pod 得以排程。 先占也受到溫和終止期間、Pod 中斷預算及工作者節點親緣性的影響。
若您未為 Pod 部署指定優先級,預設值將設定為作為「globalDefault」所設定的優先級類別。 如果您沒有 globalDefault 優先順序等級,則所有 Pod 的預設優先順序為零 (0)。依預設,Red Hat OpenShift on IBM Cloud 未設定 globalDefault,因此 Pod 預設優先順序為零。
要了解 Pod 優先級與 Red Hat OpenShift 控制器如何協同運作,請參考下圖所示的各種情境。 您必須在具有可用資源的工作者節點上放置已設定優先順序的 Pod。 否則,在移除現有 Pod 的同時,叢集裡的高優先順序 Pod 可能保持擱置狀態,如「情境 3」所示。
- 具有高、中、低優先順序的三個 Pod 擱置排程。 Red Hat OpenShift 控制器會尋找一個可用的工作節點,該節點需有足夠空間容納這三個 Pod,並根據優先順序將它們排程,優先順序最高的 Pod 會優先被排程。
- 具有高、中、低優先順序的三個 Pod 擱置排程。 Red Hat OpenShift 控制器找到了一個可用的工作節點,但該工作節點的資源僅足以支援高優先級和中優先級的 Pod。 低優先順序 Pod 未進行排程而保持擱置。
- 具有高及中優先順序的兩個 Pod 擱置排程。 可用的工作者節點上具有低優先順序的第三個 Pod。 不過,工作者節點沒有足夠的資源來進行任何擱置 Pod 的排程。 Red Hat OpenShift 控制器會預先終止(或移除)該低優先級 Pod,使該 Pod 恢復至待處理狀態。 接著,Red Hat OpenShift 控制器會嘗試排程該高優先級的 Pod。 然而,工作節點沒有足夠的資源來調度該高優先級 Pod,因此「Red Hat OpenShift」控制器轉而調度了中等優先級的 Pod。
如需更多資訊,請參閱 Kubernetes 網站上關於 Pod 優先級與預先佔用的文件。
- 我可以停用 Pod 優先級准入控制器嗎?
- 次數 若您不想使用 Pod 優先級,請勿在 Pod 部署中設定
globalDefault或包含優先級類別。 除了 IBM 使用預設優先順序等級部署的叢集重要 Pod 之外,每個 Pod 都預設為零。 因為 Pod 優先順序是相對的,所以此基本設定確保叢集重要 Pod 已針對資源設定了優先順序,並遵循您已設定的現有排程原則來排程任何其他 Pod。
瞭解預設優先順序等級
依預設,您的 Red Hat® OpenShift® on IBM Cloud® 叢集具有一些優先順序等級。
請不要修改預設等級,其係用來正確管理您的叢集。 您可以在應用程式部署中使用這些等級,或建立您自己的優先順序等級。
下表說明依預設存在於您叢集裡的優先順序等級及其使用原因。
| 名稱 | 設定者 | 優先順序值 | 目的 |
|---|---|---|---|
system-node-critical |
Kubernetes | 2000001000 | 請為在建立叢集時 部署至特權系統命名空間 的 Pod 選取此優先級類別,以保護工作節點的關鍵功能,例如網路、儲存、記錄、監控及指標相關的 Pod。 |
system-cluster-critical |
Kubernetes | 2000000000 | 請為在建立叢集時 部署至特權系統命名空間 的 Pod 選取此優先級類別,以保護叢集的關鍵功能,例如網路、儲存、記錄、監控及指標相關的 Pod。 |
ibm-app-cluster-critical |
IBM | 900000000 | 請為在建立叢集時 部署至特權系統命名空間 的 Pod 選取此優先級類別,以保護應用程式的關鍵功能,例如負載平衡器 Pod。 |
您可以執行下列指令來檢查哪些 Pod 使用優先順序等級。
oc get pods --all-namespaces -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName
建立優先順序等級
若要設定 Pod 優先順序,您必須使用優先順序等級。
開始之前:
- 存取您的 Red Hat OpenShift 叢集。
- 請確認您已擁有
default命名空間的 作家 或 經理 IBM Cloud IAM 服務存取角色。
-
列出現有的優先順序等級。 您可以將現有的優先級類別作為新類別的範本。
oc get priorityclasses -
選擇您要複製的優先順序等級,並建立本端 YAML 檔案。
oc 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。 若您在叢集中建立了其他優先級類別,可執行oc describe priorityclass <name>,以確認這些類別是否設定了globalDefault。description選用項目:告訴使用者為何要使用此優先順序等級。 請使用引號 ( "") 括住字串。 -
在叢集裡建立優先順序等級。
oc apply -f filepath/priorityclass.yaml -
驗證是否已建立優先順序等級。
oc get priorityclasses
太好了! 您已建立優先順序等級。 讓您的團隊瞭解優先順序等級,以及它們必須用於其 Pod 部署的優先順序等級(如果有的話)。
指派 Pod 的優先順序
在 Pod 規格中指派優先順序等級,以便在 Red Hat OpenShift on IBM Cloud 叢集內設定 Pod 的優先順序。
開始之前:
- 存取您的 Red Hat OpenShift 叢集。
- 請確保您已在欲部署 Pod 的命名空間中建立 作家 或 經理 IBM Cloud IAM 服務存取角色。
- 瞭解優先順序排程的運作方式,因為優先順序可能先佔現有的 Pod,並影響叢集資源的使用。
請完成以下步驟,以確認其他已部署 Pod 的重要性,從而根據現有部署狀況,為您的 Pod 選擇正確的優先級類別。
-
檢視名稱空間中的其他 Pod 使用的優先順序等級。
oc get pods -n <namespace> -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName -
取得優先順序等級的詳細資料,並記下 value 數字。 具有較高數字的 Pod 的優先順序是在具有較低數字的 Pod 之前。 對於您想要檢閱的每一個優先順序等級重複此步驟。
oc describe priorityclass <priorityclass_name> -
取得您要使用的優先順序等級,或建立您自己的優先順序等級。
oc 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。
oc apply -f filepath/pod-deployment.yaml