設定 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 優先級情境。
Pod 優先級情境

  1. 具有高、中、低優先順序的三個 Pod 擱置排程。 Kubernetes 排程器會尋找一個可容納這三個 Pod 的可用工作節點,並依照優先順序將它們排程,優先級最高的 Pod 會優先排程。
  2. 具有高、中、低優先順序的三個 Pod 擱置排程。 Kubernetes 調度程式找到了一個可用的工作節點,但該工作節點的資源僅足以支援高優先級和中優先級的 Pod。 低優先順序 Pod 未進行排程而保持擱置。
  3. 具有高及中優先順序的兩個 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 優先順序,您必須使用優先順序等級。

開始之前:

  1. 列出現有的優先順序等級。 您可以將現有的優先級類別作為新類別的範本。

    kubectl get priorityclasses
    
  2. 選擇您要複製的優先順序等級,並建立本端 YAML 檔案。

    kubectl get priorityclass <priority_class> -o yaml > Downloads/priorityclass.yaml
    
  3. 建立優先順序等級 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 選用項目:告訴使用者為何要使用此優先順序等級。 請使用引號 ("") 括住字串。
  4. 在叢集裡建立優先順序等級。

    kubectl apply -f filepath/priorityclass.yaml
    
  5. 驗證是否已建立優先順序等級。

    kubectl get priorityclasses
    

太好了! 您已建立優先順序等級。 讓您的團隊瞭解優先順序等級,以及它們必須用於其 Pod 部署的優先順序等級(如果有的話)。

指派 Pod 的優先順序

在 Pod 規格中指派優先順序等級,以便在 IBM Cloud Kubernetes Service 叢集內設定 Pod 的優先順序。

開始之前:

請完成以下步驟,以檢查其他已部署 Pod 的重要性,以便您根據現有部署狀況,為您的 Pod 選擇正確的優先級類別。

  1. 檢視名稱空間中的其他 Pod 使用的優先順序等級。

    kubectl get pods -n <namespace> -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName
    
  2. 取得優先順序等級的詳細資料,並記下 value 數字。 具有較高數字的 Pod 的優先順序是在具有較低數字的 Pod 之前。 對於您想要檢閱的每一個優先順序等級重複此步驟。

    kubectl describe priorityclass <priorityclass_name>
    
  3. 取得您要使用的優先順序等級,或建立您自己的優先順序等級

    kubectl get priorityclasses
    
  4. 在您的 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>
    
  5. 在您要在其中部署的名稱空間中建立已設定優先順序的 Pod。

    kubectl apply -f filepath/pod-deployment.yaml