全部產品
Search
文件中心

Container Service for Kubernetes:使用ack-descheduler組件對Pod進行調度最佳化(停止維護)

更新時間:Jun 28, 2024

為瞭解決實際運行中叢集資源無法充分利用或浪費的問題,可以使用ack-descheduler組件對叢集的Pod進行調度最佳化,使部分不合理的Pod能夠重新調度到合適的節點上。本文介紹如何使用ack-descheduler組件最佳化Pod調度。

重要

ack-descheduler已停止維護,建議您遷移至當前維護的組件模組Koordinator Descheduler更多資訊,請參見【組件公告】ack-descheduler組件遷移公告

前提條件

安裝ack-descheduler組件

  1. 登入Container Service管理主控台

  2. 在控制台左側導覽列,選擇市場 > 應用市場

  3. 應用市場頁面單擊應用目錄頁簽,選中ack-descheduler

  4. ack-descheduler頁面,單擊一鍵部署

  5. 建立面板中,選擇叢集和命名空間,然後單擊下一步

  6. 參數配置頁面,設定相應參數,然後單擊確定

    安裝完成後,預設會在kube-system的命名空間下部署執行循環為兩分鐘的CronJob。建立成功後,會自動跳轉到目的地組群的ack-descheduler-default頁面,檢查安裝結果。若下圖中所有資源建立成功,則說明組件安裝成功。ack-descheduler.png

通過ack-descheduler最佳化Pod調度

  1. 執行以下命令查看配置項(ConfigMap)檔案,確認當前的調度策略(DeschedulerPolicy)。

    kubectl describe cm ack-descheduler-default -n kube-system

    預期輸出:

    展開查看預期輸出

    Name:         descheduler
    Namespace:    kube-system
    Labels:       app.kubernetes.io/instance=descheduler
                  app.kubernetes.io/managed-by=Helm
                  app.kuberne
    
    
    tes.io/name=descheduler
                  app.kubernetes.io/version=0.20.0
                  helm.sh/chart=descheduler-0.20.0
    Annotations:  meta.helm.sh/release-name: descheduler
                  meta.helm.sh/release-namespace: kube-system
    Data
    ====
    policy.yaml:
    ----
    apiVersion: "descheduler/v1alpha1"
    kind: "DeschedulerPolicy"
    strategies:
      "RemoveDuplicates":  
         enabled: true
      "RemovePodsViolatingInterPodAntiAffinity": 
         enabled: true
      "LowNodeUtilization": 
         enabled: true
         params:
           nodeResourceUtilizationThresholds:
             thresholds:
               "cpu" : 20
               "memory": 20
               "pods": 20
             targetThresholds:
               "cpu" : 50
               "memory": 50
               "pods": 50
      "RemovePodsHavingTooManyRestarts":
         enabled: true
         params:
           podsHavingTooManyRestarts:
             podRestartThreshold: 100
             includingInitContainers: true
    Events:  <none>

    當前的調度策略如下表所示。關於strategies中策略的更多資訊,請參見Descheduler

    策略

    描述

    RemoveDuplicates

    重複資料刪除的Pod,確保只有一個Pod與同一節點上啟動並執行ReplicaSet、Replication Controller、StatefulSet或者Job關聯。

    RemovePodsViolatingInterPodAntiAffinity

    此策略可確保從節點中刪除違反Pod間反親和性的Pod。

    LowNodeUtilization

    此策略會找到未充分利用的節點,並儘可能從其他節點上驅逐Pod,以便ack-descheduler重新將這些被驅逐的Pod調度到未充分利用的節點上。該策略的參數可以通過nodeResourceUtilizationThresholds欄位進行配置。

    RemovePodsHavingTooManyRestarts

    此策略可確保從節點中刪除重啟次數過多的Pod。

  2. 查看調度策略修改前的調度效果。

    1. 部署測試Deployment。

      nginx.yaml的命令樣本如下所示。

      apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
      kind: Deployment
      metadata:
        name: nginx-deployment-basic
        labels:
          app: nginx
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx:1.7.9 #替換為實際的容器鏡像,格式為:<image_name:tags>。
              ports:
              - containerPort: 80

      執行以下命令,部署Deployment nginx.yaml

      kubectl apply -f nginx.yaml

      預期輸出:

      deployment.apps/nginx-deployment-basic created
    2. 等待兩分鐘後,執行以下命令,查看Pod分布節點。

      kubectl get pod -o wide | grep nginx

      預期輸出:

      NAME                          READY   STATUS     RESTARTS   AGE    IP               NODE                         NOMINATED NODE   READINESS GATES
      nginx-deployment-basic-**1    1/1     Running    0          36s    172.25.XXX.XX1   cn-hangzhou.172.16.XXX.XX2   <none>           <none>
      nginx-deployment-basic-**2    1/1     Running    0          11s    172.25.XXX.XX2   cn-hangzhou.172.16.XXX.XX3   <none>           <none>
      nginx-deployment-basic-**3    1/1     Running    0          36s    172.25.XXX.XX3   cn-hangzhou.172.16.XXX.XX3   <none>           <none>

      從以上預期輸出可以得出,nginx-deployment-basic-**2nginx-deployment-basic-**3都被調度到cn-hangzhou.172.16.XXX.XX3節點。

      說明

      預設ConfigMap配置下的調度結果取決於實際的叢集環境,此處的結果為多種情況之一,僅作樣本。

  3. 修改調度策略。

    為了防止多個調度策略影響調度效果,修改步驟1中的ConfigMap,只保留RemoveDuplicates策略。

    說明

    RemoveDuplicates策略是指儘可能保障有副本控制器的Pod,可以水平分布到不同的節點上。

    修改後的ConfigMap檔案命名為newPolicy.yaml,內容樣本如下所示。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: descheduler
      namespace: kube-system
      labels:
        app.kubernetes.io/instance: descheduler
        app.kubernetes.io/managed-by: Helm
        app.kubernetes.io/name: descheduler
        app.kubernetes.io/version: 0.20.0
        helm.sh/chart: descheduler-0.20.0  
      annotations:
        meta.helm.sh/release-name: descheduler
        meta.helm.sh/release-namespace: kube-system
    data: 
      policy.yaml: |-
        apiVersion: "descheduler/v1alpha1"
        kind: "DeschedulerPolicy"
        strategies:
          "RemoveDuplicates": #僅保留removeDuplicates策略。
             enabled: true
  4. 查看調度策略修改後的調度效果。

    1. 執行以下命令,部署新的調度策略。

      kubectl apply -f newPolicy.yaml

      預期輸出:

      configmap/descheduler created
    2. 等待兩分鐘後,執行以下命令,查看Pod分布節點。

      kubectl get pod -o wide | grep nginx

      預期輸出:

      NAME                          READY   STATUS     RESTARTS   AGE      IP               NODE                         NOMINATED NODE   READINESS GATES
      nginx-deployment-basic-**1    1/1     Running    0          8m26s    172.25.XXX.XX1   cn-hangzhou.172.16.XXX.XX2   <none>           <none>
      nginx-deployment-basic-**2    1/1     Running    0          8m1s     172.25.XXX.XX2   cn-hangzhou.172.16.XXX.XX1   <none>           <none>
      nginx-deployment-basic-**3    1/1     Running    0          8m26s    172.25.XXX.XX3   cn-hangzhou.172.16.XXX.XX3   <none>           <none>

      從以上預期輸出可以得出,nginx-deployment-basic-**2被ack-descheduler重新調度到cn-hangzhou.172.16.XXX.XX1節點,三個Pod被分散到三個不同節點上,實現了副本之間在不同節點的均衡分布。