The Kubernetes Descheduler is a specialized tool designed to optimize cluster resource utilization and workload distribution by identifying and evicting pods that are scheduled on suboptimal nodes. Unlike the standard Kubernetes scheduler, which makes initial placement decisions for pending pods, the descheduler operates on already-running pods to improve their placement based on changing cluster conditions. The project is maintained as part of the Kubernetes Special Interest Group for Scheduling and is written in Go.
The descheduler addresses a fundamental challenge in dynamic Kubernetes environments where initial scheduling decisions may no longer be optimal as cluster state evolves. Nodes may become under or over-utilized, node labels and taints may change, pod or node affinity requirements may no longer be satisfied, nodes may fail causing pod migrations, or new nodes may be added to the cluster. In these scenarios, pods that were appropriately scheduled at one point in time may end up on less desirable nodes. The descheduler solves this by continuously evaluating running pods against configurable policies and evicting those that should be rescheduled, relying on the default scheduler to place the evicted pods on more suitable nodes.
The project supports multiple deployment models to fit different operational needs. Users can run the descheduler as a Kubernetes Job for one-time optimization, as a CronJob for periodic rescheduling cycles, or as a Deployment for continuous operation. The descheduler pod runs as a critical pod in the kube-system namespace to prevent it from being evicted by itself or the kubelet. Installation options include official Helm charts available since version 0.18.0 and listed on Artifact Hub, as well as Kustomize-based deployment approaches.
Configuration in the descheduler is highly flexible through its policy system, which includes top-level eviction controls and pluggable strategy and evictor components. Top-level configuration options allow operators to set constraints such as maximum pods to evict per node, per namespace, or per rescheduling cycle, node selection criteria, grace periods for pod deletion, and metrics collection settings. The descheduler supports multiple metrics providers including Kubernetes Metrics Server and Prometheus, enabling data-driven eviction decisions based on actual resource utilization. The Default Evictor plugin handles pod filtering and validation before eviction, with extensibility for custom evictor implementations.
GitGenius activity data shows the project maintains active engagement with a median issue and pull request response latency of 0.0 hours and a mean latency of 87.7 hours across 171 tracked items. The most frequently applied issue labels are lifecycle/rotten with 71 occurrences, kind/feature with 63, and kind/bug with 61, indicating ongoing feature development and bug management. The core contributor base includes ingvagabund with 174 tracked events, a7i with 106 events, and googs1025 with 103 events. The project maintains overlapping contributor relationships with major Kubernetes ecosystem projects including kubernetes/kubernetes, kubernetes-sigs/kueue, and argoproj/argo-cd, reflecting its integration into the broader Kubernetes scheduling and workload management ecosystem.
The descheduler maintains multiple release branches with version-specific documentation, currently supporting versions from v0.30.x through v0.36.x, with the master branch representing in-development functionality. This versioning approach ensures users can access appropriate documentation for their deployed release versions while allowing the project to evolve independently.