How to fix Descheduler error in Kubernetes

KubernetesADVANCEDMEDIUMUpdated Dec 6, 2025ยท 108 views

The Descheduler fails to evict Pods based on scheduling policies. This occurs when eviction rules conflict with Pod Disruption Budgets, node affinity requirements, or resource constraints. Resolve by reviewing descheduler strategies, PDB settings, and cluster topology.

Quick fix

Fixes Descheduler error

kubectl get pod -n kube-system -l app=descheduler
kubectl logs -n kube-system -l app=descheduler --tail=100
  1. Check descheduler Pod status
  2. Review descheduler configuration
  3. Check Pod Disruption Budgets
  4. Review Pod constraints
kubernetes โ€” error
kubectl get pod -n kube-system -l app=descheduler
kubectl logs -n kube-system -l app=descheduler --tail=100
Descheduler error

What this error means

The Descheduler is a Kubernetes component that identifies and evicts Pods from nodes based on policies to balance the cluster. When it encounters errors, it may fail to evict underutilized Pods, leading to suboptimal resource distribution. Errors can stem from permission issues, conflicting constraints, or misconfigured policies.

Typical symptoms

  • Descheduler Pod logs show eviction failure errors
  • Pods remain on overutilized nodes despite descheduler running
  • Descheduler Pod restarts repeatedly
  • Metrics show no evictions happening when expected
  • Events show "FailedEviction" with policy violations
  • Descheduler creates eviction requests but kubelet rejects them
  • Application Pods are not migrating to balance load

Common causes

  1. Pod has PodDisruptionBudget (PDB) that prevents eviction
  2. Pod has local storage (emptyDir) that cannot be migrated
  3. Pod is owned by DaemonSet or StaticPod that cannot be evicted
  4. Node affinity or topology spread constraints conflict with rebalancing
  5. Descheduler RBAC permissions are insufficient
  6. Descheduler policies are too conservative or misconfigured
  7. Cluster topology changed, making current placement impossible

How to fix "Descheduler error"

1Check descheduler Pod status

Verify the descheduler is running and check its logs:

bash
kubectl get pod -n kube-system -l app=descheduler
kubectl logs -n kube-system -l app=descheduler --tail=100
2Review descheduler configuration

Check the descheduler policy and strategies:

bash
kubectl get configmap -n kube-system descheduler-policy -o yaml
kubectl get deschedulerpolicy -o yaml

Ensure policies are not too restrictive or conflicting.

3Check Pod Disruption Budgets

List PDBs that may prevent eviction:

bash
kubectl get pdb -A
kubectl describe pdb <name> -n <namespace>

Verify minAvailable/maxUnavailable settings allow some disruption.

4Review Pod constraints

Check target Pods for constraints preventing eviction:

bash
kubectl get pod <pod-name> -o yaml | grep -E "affinity|topologySpreadConstraints|nodeSelector"

Loosen constraints if they conflict with rebalancing goals.

5Verify descheduler RBAC permissions

Check if descheduler has eviction permissions:

bash
kubectl get clusterrole descheduler -o yaml
kubectl get clusterrolebinding descheduler -o yaml

Ensure the role includes "evict" verb on Pods.

6Check node topology and resource balance

Assess current cluster balance:

bash
kubectl top nodes
kubectl top pods -A
kubectl describe nodes | grep -A5 "Allocated resources"
7Adjust descheduler strategies

Update descheduler ConfigMap or DeschedulerPolicy:

yaml
apiVersion: descheduler.x-k8s.io/v1alpha1
kind: DeschedulerPolicy
strategies:
  - name: "RemovePodsViolatingNodeAffinity"
    params:
      nodeAffinityType:
      - requiredDuringSchedulingIgnoredDuringExecution
  - name: "RemovePodsViolatingInterPodAntiAffinity"

Re-deploy descheduler after changes.

8Monitor eviction success rate

Watch descheduler metrics to verify fixes:

bash
kubectl logs -n kube-system -l app=descheduler -f
grep -i "evict" /var/log/pods/kube-system_descheduler-*/descheduler.log

Verify evictions complete successfully.

Advanced notes

Descheduler works with the kube-scheduler, not against it. If you see persistent eviction failures, check both components. The eviction process respects graceful termination periods (terminationGracePeriodSeconds), so very large values may cause timeouts. In production clusters, use multiple descheduler replicas with leader election to avoid conflicts. Monitor descheduler CPU/memory usage as it scans all Pods and Nodes during each run.

Frequently asked questions

What does "Descheduler error" mean?
The Descheduler is a Kubernetes component that identifies and evicts Pods from nodes based on policies to balance the cluster. When it encounters errors, it may fail to evict underutilized Pods, leading to suboptimal resource distribution. Errors can stem from permission issues, conflicting constraints, or misconfigured policies.
How do I fix "Descheduler error"?
The Descheduler fails to evict Pods based on scheduling policies. This occurs when eviction rules conflict with Pod Disruption Budgets, node affinity requirements, or resource constraints. Resolve by reviewing descheduler strategies, PDB settings, and cluster topology.
What causes "Descheduler error"?
Pod has PodDisruptionBudget (PDB) that prevents eviction Pod has local storage (emptyDir) that cannot be migrated Pod is owned by DaemonSet or StaticPod that cannot be evicted
Is the "Descheduler error" error serious?
It is a medium-severity error โ€” more of a blocker than a risk. The steps above resolve it.

Official resources & further reading