全部產品
Search
文件中心

Container Service for Kubernetes:Koordinator Descheduler與Kubernetes Descheduler的對比說明

更新時間:Jul 06, 2024

ack-koordinator組件中的重調度器模組Koordinator Descheduler提供了重調度功能,可以將運行中的不合理的Pod重新調度到另一個節點。Koordinator Descheduler基於Kubernetes Descheduler社區提出的Descheduling Framework重調度架構實現,並在相容社區Kubernetes Descheduler重調度策略的基礎上進行了能力增強。

閱讀前提示

本文主要面向使用社區Kubernetes Descheduler的使用者,介紹Koordinator Descheduler與Kubernetes Descheduler的關聯,並指引如何完成組件的遷移。閱讀本文前,期望您已經瞭解社區Kubernetes Descheduler的功能說明、介面屬性、策略配置(例如系統配置、模板概要配置、策略外掛程式配置、驅逐器外掛程式配置)等內容。

Koordinator Descheduler與Kubernetes Descheduler的關聯

社區Kubernetes Descheduler在發布0.25.0前設計了Descheduling Framework,支援以外掛程式式架構的方式管理重調度的工作周期。Descheduling Framework主要包含兩個核心任務:

  • 將現有的重調度策略和Pod驅逐邏輯進行外掛程式化改造,提高重調度策略的靈活性。

  • 實現一個運行時環境,支援外掛程式的載入、執行,並管理整個重調度的工作周期。

在Kubernetes Descheduler發布0.26.0版本後,Koordinator Descheduler在v1.2.0版本完成了對社區重調度器全部的策略和驅逐外掛程式DefaultEvictor的引入,並進一步提供了驅逐器外掛程式MirgrationController

功能差異

Koordinator Descheduler能夠相容Kubernetes Descheduler的絕大多數使用情境,但二者在配置方法、重調度策略、驅逐器與驅逐控制能力等方面具有一定的差異。主要如下。

  1. 由於Koordinator Descheduler在Descheduler Framework方面的研發早於Kubenetes Descheduler,所以使用了不同的配置介面v1alpha2/DeschedulerConfiguration

  2. Koordinator Descheduler中新增了感知節點真實利用率的LowNodeLoad負載熱點打散重調度策略外掛程式。Kubernetes原生的Descheduler外掛程式LowNodeUtilization根據資源分派率決定如何進行重調度,而LowNodeLoad則基於節點真實利用率,更為精準。關於LowNodeLoad外掛程式的詳細介紹,請參見使用負載熱點打散重調度

  3. Koordinator Descheduler中新增了MigrationController作為Pod驅逐器。MigrationController支援更加安全、更豐富的驅逐控制能力,請參見驅逐器外掛程式配置

配置樣本對比

下面以開啟RemovePodsViolatingNodeTaints策略(RemovePodsViolatingNodeTaints)為例,對比Kubernetes Descheduler和Koordinator Descheduler的配置格式,配置版本由apiVersionkind兩個欄位定義。各版本的組件支援情況如下。

配置版本屬性

Kubernetes Descheduler

Kubernetes Descheduler

Koordinator Descheduler

組件版本

所有版本

v0.27.0及以上

所有版本

apiVersion

descheduler/v1alpha1

descheduler/v1alpha2

descheduler/v1alpha2

kind

DeschedulerPolicy

DeschedulerPolicy

DeschedulerConfiguration

  • Kubernetes Descheduler配置樣本

    • v0.27.0以下版本,使用的配置版本為descheduler/v1alpha1/DeschedulerPolicy

      # 介面屬性。
      apiVersion: "descheduler/v1alpha1"
      kind: "DeschedulerPolicy"
      
      # 以下為系統配置。
      nodeSelector: "node=node1"
      maxNoOfPodsToEvictPerNode: 10
      maxNoOfPodsToEvictPerNamespace: 10
      
      # 以下為驅逐配置。在另外兩種配置介面中,這些參數屬於驅逐器外掛程式的配置項。
      evictFailedBarePods: false
      evictLocalStoragePods: true
      evictSystemCriticalPods: true
      evictDaemonSetPods: false
      ignorePvcPods: false
      
      # 以下為策略配置。在另外兩種配置介面中,以重調度模板的形式提供,並拆分成外掛程式啟停和外掛程式參數兩部分。
      strategies:
        "RemovePodsViolatingNodeTaints":
          enabled: true
          params:
            nodeFit: true # nodeFit需要在每個策略中開啟。在另外兩種配置介面中,nodeFit屬於驅逐器外掛程式的配置項。
            excludedTaints:
              - deschedule=not-allow # 忽略包含key為"deschedule"且value為"not-allow"的汙點的節點。
    • v0.27.0及以上版本,使用的配置版本為descheduler/v1alpha2/DeschedulerPolicy

      # 介面屬性。
      apiVersion: "descheduler/v1alpha2"
      kind: "DeschedulerPolicy"
      
      # 以下為系統配置。
      nodeSelector: "node=node1" 
      maxNoOfPodsToEvictPerNode: 10
      maxNoOfPodsToEvictPerNamespace: 10
      # 以上為系統配置。
      
      # 以下為模板列表。
      profiles:
      - name: kubernetes-descheduler  # 指定重調度模板的名稱。
          
        # 以下為模板概要配置。 
        plugins:      
          deschedule:
            enabled:
              - "RemovePodsViolatingNodeTaints" # enabled欄位的資料類型是字串列表。
          balance:
            disabled: 
              - "*"
        # 以上為模板概要配置。         
            
        # 以下為外掛程式列表。
        pluginConfig:
          
        # 以下為策略外掛程式RemovePodsViolatingNodeTaints的配置。    
        - name: RemovePodsViolatingNodeTaints # 節點汙點校正外掛程式配置。
            args:        
              excludedTaints: 
              - deschedule=not-allow # 忽略包含key為"deschedule"且value為"not-allow"的汙點的節點。
          
        # 以下為驅逐器外掛程式DefaultEvictor的配置。  
        - name: "DefaultEvictor"
          args:                
            evictFailedBarePods: false
            evictLocalStoragePods: true
            evictSystemCriticalPods: true
            evictDaemonSetPods: false
            ignorePvcPods: false
            nodeFit: true # nodeFit作為驅逐器外掛程式的配置項。               
  • Koordinator Descheduler的配置樣本

    配置版本為descheduler/v1alpha2/DeschedulerConfiguration

    # 介面屬性。
    apiVersion: descheduler/v1alpha2
    kind: DeschedulerConfiguration
    
    # 以下為系統配置。
    dryRun: false  
    deschedulingInterval: 120s 
    nodeSelector: 
      node: node1 # nodeSelector的資料類型與其他兩個配置介面不同。
    maxNoOfPodsToEvictPerNode: 10 
    maxNoOfPodsToEvictPerNamespace: 10 
    # 以上為系統配置。
    
    # 以下為模板列表。            
    profiles:
    - name: koord-descheduler
      
      # 以下為模板概要配置。
      plugins:
        deschedule: 
          enabled: 
            - name: RemovePodsViolatingNodeTaints # enabled欄位的資料類型是結構體列表。          
        balance: 
          disabled: 
            - name: "*" 
        evict: # 支援通過evict欄位配置需要使用的驅逐器。          
          enabled:
            - name: MigrationController # 預設開啟MigrationController。 
            # - name: DefaultEvictor # 可選DefaultEvictor。 
        filter: # 支援通過filter欄位配置需要使用的驅逐篩選策略。 
          enabled:
            - name: MigrationController # 預設開啟MigrationController。
            # - name: DefaultEvictor # 可選DefaultEvictor。
      # 以上為模板概要配置。
              
      # 以下為外掛程式列表。
      pluginConfig:
        
      # 以下為策略外掛程式RemovePodsViolatingNodeTaints的配置。    
      - name: RemovePodsViolatingNodeTaints # 節點汙點校正外掛程式配置。
          args:        
            excludedTaints: 
            - deschedule=not-allow # 忽略包含key為"deschedule"且value為"not-allow"的汙點的節點。
        
      # 以下為驅逐器外掛程式DefaultEvictor的配置。  
      - name: "DefaultEvictor"
        args:                
          evictFailedBarePods: false
          evictLocalStoragePods: true
          evictSystemCriticalPods: true
          evictDaemonSetPods: false
          ignorePvcPods: false
          nodeFit: true # nodeFit作為驅逐器外掛程式的配置項。    

說明

以下僅根據配置樣本介紹不同配置版本之間的差異,不介紹具體配置參數的詳細說明。詳細說明,請參見系統配置模板概要配置策略外掛程式配置驅逐器外掛程式配置

系統配置差異

  • Kubernetes Descheduler的系統配置(Top Level configuration)中僅支援nodeSelectormaxNoOfPodsToEvictPerNodemaxNoOfPodsToEvictPerNamespace三個參數。在此基礎上,Koordinator Descheduler的系統配置中新增了dryRundeschedulingInterval參數。

  • Kubernetes Descheduler的v1alpha1/DeschedulerPolicy介面在系統配置中配置Pod驅逐器的參數,在其他兩個配置介面中,這些參數作為驅逐器外掛程式的配置項在args欄位中提供。

  • Koordinator Descheduler的v1alpha2/DeschedulerConfiguration配置介面中,nodeSelector的資料類型與其他兩個配置介面略有不同,具體請參見系統配置

模板概要配置差異

  • Kubernetes Descheduler的v1alpha1/DeschedulerPolicy配置版本不支援重調度模板,與當前Koordinator Descheduler的配置格式差異較大。

  • Kubernetes Descheduler的v1alpha2/DeschedulerPolicy配置版本與Koordinator Deschedulerv1alpha2/DeschedulerConfiguration類似,都使用重調度模板的配置形式。二者僅在模板概要配置中的資料類型以及驅逐外掛程式的開啟方法上有一定差異。

    • v1alpha2/DeschedulerPolicy使用字串列表開啟或禁用多個外掛程式;v1alpha2/DeschedulerConfiguration使用plugins結構體列表進行配置。

    • v1alpha2/DeschedulerPolicy僅支援DefaultEvictor驅逐器外掛程式,無需手動開啟;v1alpha2/DeschedulerConfiguration支援MigrationController和DefaultEvictor兩種驅逐器外掛程式,其中DefaultEvictor的行為與社區版本一致。您可以在模板概要配置的evictfilter欄位中指定需要開啟的驅逐器外掛程式。

策略外掛程式配置差異

Koordinator Descheduler適配了Kubernetes Descheduler 0.26.0版本中的全部重調度策略。在Kubernetes Descheduler 0.26.0以上的版本中,某些重調度策略外掛程式新增的配置參數無法在Koordinator Descheduler中使用。請參見下表瞭解相較於Kubernetes Descheduler 0.26.0以上版本,Koordinator Descheduler的重調度策略的配置參數變更。

策略外掛程式的參數變更說明

範例程式碼

RemovePodsViolatingNodeAffinity:支援在nodeAffinityType欄位中使用preferredDuringSchedulingIgnoredDuringExecution

apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
  - name: ProfileName
    pluginConfig:
    - name: "RemovePodsViolatingNodeAffinity"
      args:
        nodeAffinityType:
        - "preferredDuringSchedulingIgnoredDuringExecution"
    plugins:
      deschedule:
        enabled:
          - "RemovePodsViolatingNodeAffinity"

RemovepodsViolatingTopologySpreadConstraint

  • 新增constraints欄位。

  • 新增topologyBalanceNodeFit欄位。

apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
  - name: ProfileName
    pluginConfig:
    - name: "RemovePodsViolatingTopologySpreadConstraint"
      args:
        constraints:
          - DoNotSchedule
        topologyBalanceNodeFit: false  
    plugins:
      balance:
        enabled:
          - "RemovePodsViolatingTopologySpreadConstraint"

RemovePodsHavingTooManyRestarts:新增states欄位。

apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
  - name: ProfileName
    pluginConfig:
    - name: "RemovePodsHavingTooManyRestarts"
      args:
        states:
        - "CrashLoopBackOff"
    plugins:
      deschedule:
        enabled:
          - "RemovePodsHavingTooManyRestarts"

PodLifeTime

  • state欄位允許配置CrashLoopBackOff

  • state欄位允許配置ImagePullBackOff

apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
  - name: ProfileName
    pluginConfig:
    - name: "PodLifeTime"
      args:
        states:
        - "CrashLoopBackOff"
        - "ImagePullBackOff"
    plugins:
      deschedule:
        enabled:
          - "PodLifeTime"

RemoveFailedPods:新增exitCodes欄位。

apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
  - name: ProfileName
    pluginConfig:
    - name: "RemoveFailedPods"
      args:
        exitCodes:
        - 1
    plugins:
      deschedule:
        enabled:
          - "RemoveFailedPods"

驅逐器外掛程式配置差異

Koordinator Descheduler適配了Kubernetes Descheduler 0.26.0版本中的Pod驅逐器DefaultEvictor。但對於Kubernetes Descheduler 0.26.0以上的版本DefaultEvictor的新增參數,Koordinator Descheduler無法使用。

Default Evictor

驅逐外掛程式的參數變更說明

範例

DefaultEvictor

  • 新增evictDaemonSetPods欄位

  • 新增minReplicas欄位

apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
  - name: ProfileName
    pluginConfig:
    - name: "DefaultEvictor"
      args:
        evictDaemonSetPods: false
        minReplicas: 2
    - name: "PodLifeTime"
      args:
        maxPodLifeTimeSeconds: 86400
    plugins:
      deschedule:
        enabled:
          - "PodLifeTime"

MigrationController

Koordinator Descheduler額外支援了MigrationController驅逐器外掛程式,支援多種驅逐方法。詳細介紹,請參見MigrationController

遷移Kubernetes Descheduler至Koordinator Descheduler

不同版本的Kubernetes Descheduler遷移至Koordinator Descheduler的方式有所不同。遷移流程如下。

  1. 卸載正在使用的Kubernetes Descheduler。叢集中存在多個重調度器可能會導致出現不可預知的競態條件。

  2. 參見啟用重調度功能,對Koordinator Descheduler進行安裝與配置。

    1. 參見系統配置差異,在Koordinator Descheduler中配置您需要使用的系統級配置。

    2. 編寫與Koordinator Descheduler適配的重調度模板。

      • 若您當前使用0.26.0版本及之前的Kubernetes Descheduler,該版本僅支援使用v1alpha1/DeschedulerPolicy配置介面。請參見模板概要配置差異完成配置。

      • 若您當前使用大於0.26.0版本的Kubernetes Descheduler,請進一步確認您所使用的配置介面。

        • 若配置介面為v1alpha1/DeschedulerPolicy,請參見模板概要配置差異,編寫與Koordinator Descheduler適配的重調度模板。

        • 若介面配置為v1alpha2/DeschedulerPolicy,請參見模板概要配置差異,修改Koordinator Descheduler中的部分配置欄位。

    3. 請參見策略外掛程式配置差異驅逐器外掛程式配置差異,在Koordinator Descheduler中設定外掛程式的具體配置。

相關文檔