All Products
Search
Document Center

Container Service for Kubernetes:Koordinator Descheduler and Kubernetes Descheduler

Last Updated:Jun 18, 2026

Koordinator Descheduler in the ack-koordinator add-on provides descheduling functionality that can reschedule unreasonable running Pods to another node, and extends the Kubernetes Descheduler community's Descheduling Framework with enhanced eviction control, and Koordinator Descheduler is compatible with Kubernetes Descheduler policies.

Before you begin

Familiarize yourself with the features, API attributes, and policy configurations (system, template, policy plugin, and evictor plugin) of the Kubernetes Descheduler before comparing it with Koordinator Descheduler.

Relationship between Koordinator Descheduler and Kubernetes Descheduler

Before version 0.25.0, the Kubernetes Descheduler community proposed the Descheduling Framework, a plug-in-based approach to manage the descheduling lifecycle, with two goals:

  • Transform descheduling policies and pod eviction logic into plug-ins for greater flexibility.

  • Implement a runtime that supports plug-in loading, execution, and descheduling lifecycle management.

With Kubernetes Descheduler 0.26.0, Koordinator Descheduler v1.2.0 integrated all policies and the DefaultEvictor plug-in, and added the MigrationController evictor.

Feature differences

image

Koordinator Descheduler is compatible with most Kubernetes Descheduler use cases but differs in configuration methods, descheduling policies, evictors, and eviction control.

  1. Koordinator Descheduler began developing its Descheduling Framework before Kubernetes Descheduler and uses a different configuration API: v1alpha2/DeschedulerConfiguration.

  2. Koordinator Descheduler adds the LowNodeLoad policy plug-in for hotspot-aware descheduling based on actual node utilization, providing more accurate results than the native LowNodeUtilization plug-in that uses resource allocation rates. See Use hotspot-aware descheduling.

  3. Koordinator Descheduler adds the MigrationController evictor. MigrationController offers safer and more extensive eviction control. See Evictor plug-in configuration.

Configuration examples

The following examples use the RemovePodsViolatingNodeTaints policy (RemovePodsViolatingNodeTaints) to compare the configuration formats of Kubernetes Descheduler and Koordinator Descheduler. The configuration version is defined by the apiVersion and kind fields.

Configuration version

Kubernetes Descheduler

Kubernetes Descheduler

Koordinator Descheduler

Component version

All versions

v0.27.0 and later

All versions

apiVersion

descheduler/v1alpha1

descheduler/v1alpha2

descheduler/v1alpha2

kind

DeschedulerPolicy

DeschedulerPolicy

DeschedulerConfiguration

  • Kubernetes Descheduler configuration example

    • For versions earlier than v0.27.0, the configuration version is descheduler/v1alpha1/DeschedulerPolicy.

      # API attributes.
      apiVersion: "descheduler/v1alpha1"
      kind: "DeschedulerPolicy"
      
      # System configurations.
      nodeSelector: "node=node1"
      maxNoOfPodsToEvictPerNode: 10
      maxNoOfPodsToEvictPerNamespace: 10
      
      # Eviction configurations. In the other two configuration APIs, these parameters are part of the evictor plug-in configuration.
      evictFailedBarePods: false
      evictLocalStoragePods: true
      evictSystemCriticalPods: true
      evictDaemonSetPods: false
      ignorePvcPods: false
      
      # Policy configurations. In the other two APIs, these are provided as descheduling templates and split into plug-in activation and parameter settings.
      strategies:
        "RemovePodsViolatingNodeTaints":
          enabled: true
          params:
            nodeFit: true # The nodeFit parameter must be enabled in each policy. In the other two APIs, nodeFit is part of the evictor plug-in configuration.
            excludedTaints:
              - deschedule=not-allow # Ignore nodes with the taint key="deschedule" and value="not-allow".
    • For v0.27.0 and later, the configuration version is descheduler/v1alpha2/DeschedulerPolicy.

      # API attributes.
      apiVersion: "descheduler/v1alpha2"
      kind: "DeschedulerPolicy"
      
      # System configurations.
      nodeSelector: "node=node1" 
      maxNoOfPodsToEvictPerNode: 10
      maxNoOfPodsToEvictPerNamespace: 10
      # End of system configurations.
      
      # A list of descheduling templates.
      profiles:
      - name: kubernetes-descheduler  # Specify the name of the descheduling template.
          
        # Template configurations. 
        plugins:      
          deschedule:
            enabled:
              - "RemovePodsViolatingNodeTaints" # The data type of the `enabled` field is a list of strings.
          balance:
            disabled: 
              - "*"
        # End of template configurations.         
            
        # A list of plug-in configurations.
        pluginConfig:
          
          # Configuration for the RemovePodsViolatingNodeTaints policy plug-in.    
          - name: RemovePodsViolatingNodeTaints # Node taint validation plug-in configuration.
            args:
              excludedTaints: 
              - deschedule=not-allow # Ignore nodes with the taint key="deschedule" and value="not-allow".
          
          # Configuration for the DefaultEvictor evictor plug-in.  
          - name: "DefaultEvictor"
            args:                
              evictFailedBarePods: false
              evictLocalStoragePods: true
              evictSystemCriticalPods: true
              evictDaemonSetPods: false
              ignorePvcPods: false
              nodeFit: true # The nodeFit parameter is part of the evictor plug-in configuration.
  • Koordinator Descheduler configuration example

    The configuration version is descheduler/v1alpha2/DeschedulerConfiguration.

    # API attributes.
    apiVersion: descheduler/v1alpha2
    kind: DeschedulerConfiguration
    
    # System configurations.
    dryRun: false  
    deschedulingInterval: 120s 
    nodeSelector: 
      node: node1 # The data type of nodeSelector is different from the other two configuration APIs.
    maxNoOfPodsToEvictPerNode: 10 
    maxNoOfPodsToEvictPerNamespace: 10 
    # End of system configurations.
    
    # A list of descheduling templates.            
    profiles:
    - name: koord-descheduler
      
      # Template configurations.
      plugins:
        deschedule: 
          enabled: 
            - name: RemovePodsViolatingNodeTaints # The data type of the `enabled` field is a list of structs.          
        balance: 
          disabled: 
            - name: "*" 
        evict: # Use the `evict` field to specify the evictor to use.          
          enabled:
            - name: MigrationController # MigrationController is enabled by default. 
            # - name: DefaultEvictor # Optional: DefaultEvictor. 
        filter: # Use the `filter` field to specify the eviction filter to use. 
          enabled:
            - name: MigrationController # MigrationController is enabled by default.
            # - name: DefaultEvictor # Optional: DefaultEvictor.
      # End of template configurations.
              
      # A list of plug-in configurations.
      pluginConfig:
        
        # Configuration for the RemovePodsViolatingNodeTaints policy plug-in.    
        - name: RemovePodsViolatingNodeTaints # Node taint validation plug-in configuration.
          args:
            excludedTaints: 
            - deschedule=not-allow # Ignore nodes with the taint key="deschedule" and value="not-allow".
        
        # Configuration for the DefaultEvictor evictor plug-in.  
        - name: "DefaultEvictor"
          args:                
            evictFailedBarePods: false
            evictLocalStoragePods: true
            evictSystemCriticalPods: true
            evictDaemonSetPods: false
            ignorePvcPods: false
            nodeFit: true # The nodeFit parameter is part of the evictor plug-in configuration.

Note

These examples cover configuration version differences only. See System configuration, Template configuration, Policy plug-in configuration, and Evictor plug-in configuration for parameter details.

System configuration differences

  • Kubernetes Descheduler's system configuration (Top Level configuration) supports only nodeSelector, maxNoOfPodsToEvictPerNode, and maxNoOfPodsToEvictPerNamespace. Koordinator Descheduler adds dryRun and deschedulingInterval.

  • In Kubernetes Descheduler's v1alpha1/DeschedulerPolicy API, pod evictor parameters are part of the system configuration. In the other two APIs, they are in the evictor plug-in's args field.

  • In Koordinator Descheduler's v1alpha2/DeschedulerConfiguration API, the nodeSelector data type differs slightly from the other two APIs. See System configuration.

Template configuration differences

  • Kubernetes Descheduler's v1alpha1/DeschedulerPolicy does not support descheduling templates, making its configuration format significantly different from Koordinator Descheduler.

  • Kubernetes Descheduler's v1alpha2/DeschedulerPolicy and Koordinator Descheduler's v1alpha2/DeschedulerConfiguration are similar because both use descheduling templates. They differ in data types and how the evictor plug-in is enabled.

    • v1alpha2/DeschedulerPolicy uses a string list to enable or disable plug-ins, whereas v1alpha2/DeschedulerConfiguration uses a struct list under plugins.

    • v1alpha2/DeschedulerPolicy supports only DefaultEvictor (auto-enabled). v1alpha2/DeschedulerConfiguration supports both MigrationController and DefaultEvictor, where DefaultEvictor behavior matches the community version. Specify the evictor in the evict and filter template fields.

Policy plug-in configuration differences

Koordinator Descheduler supports all policies from Kubernetes Descheduler 0.26.0, but Koordinator Descheduler does not support parameters added in later versions. The following table lists the parameter differences for Koordinator Descheduler.

Policy parameter changes

Sample code

RemovePodsViolatingNodeAffinity: Supports preferredDuringSchedulingIgnoredDuringExecution in the nodeAffinityType field.

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

RemovepodsViolatingTopologySpreadConstraint:

  • Adds the constraints field.

  • Adds the topologyBalanceNodeFit field.

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

RemovePodsHavingTooManyRestarts: Adds the states field.

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

PodLifeTime:

  • The state field allows the CrashLoopBackOff value.

  • The state field allows the ImagePullBackOff value.

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

RemoveFailedPods: Adds the exitCodes field.

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

Evictor plug-in configuration differences

Koordinator Descheduler supports the DefaultEvictor from Kubernetes Descheduler 0.26.0. Parameters added to DefaultEvictor in later Kubernetes Descheduler versions are not supported in Koordinator Descheduler.

DefaultEvictor

Evictor parameter changes

Example

DefaultEvictor:

  • Adds the evictDaemonSetPods field.

  • Adds the minReplicas field.

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 also supports the MigrationController evictor plug-in, which enables multiple eviction methods.

Migrating to Koordinator Descheduler

To migrate from Kubernetes Descheduler to Koordinator Descheduler, follow these version-specific steps:

  1. Uninstall your current Kubernetes Descheduler. Running multiple deschedulers in a cluster causes unpredictable race conditions.

  2. Install and configure Koordinator Descheduler as described in Enable the descheduling feature.

    1. Configure system-level settings in Koordinator Descheduler based on System configuration differences.

    2. Create a descheduling template compatible with Koordinator Descheduler.

      • If you use Kubernetes Descheduler 0.26.0 or earlier, only the v1alpha1/DeschedulerPolicy API is supported. Complete the configuration based on Template configuration differences.

      • If you use Kubernetes Descheduler later than 0.26.0, confirm which configuration API you use.

    3. Configure plug-ins in Koordinator Descheduler based on Policy plug-in configuration differences and Evictor plug-in configuration differences.

References