文档

Koordinator Descheduler与Kubernetes Descheduler的对比说明

更新时间:

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

功能差异

image

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中设置插件的具体配置。

相关文档