Cannot evict pod: A PodDisruptionBudget is refusing to allow the eviction
Cannot evict pod as it would violate the pod's disruption budget means a PDB is doing its job — evicting this pod would take the workload below its guaranteed availability. Drains block until that changes.
Applies to: All Kubernetes versions
What it means
A PodDisruptionBudget declares how much of a workload may be voluntarily disrupted at once, through minAvailable or maxUnavailable. The eviction API — which kubectl drain uses — checks the budget and refuses evictions that would breach it. A blocked drain is therefore usually correct behaviour, and the right response is to make the budget satisfiable rather than to bypass it. It becomes a genuine deadlock in a few specific configurations: a single-replica workload with minAvailable: 1 can never be evicted, and neither can a workload whose pods are already unhealthy, since evicting one would drop available replicas below the floor.
Most common causes
- A single-replica workload with
minAvailable: 1, which permits no disruption at all. - Pods that are not Ready, so the workload is already at or below its budget.
maxUnavailable: 0, which forbids all voluntary disruption.- Several drains at once competing for the same budget.
- A PDB whose selector matches more or fewer pods than intended.
- Replacement pods unable to schedule, so available replicas never recover.
How to diagnose it
- Read the budget's current state:
kubectl get pdb -n NAMESPACEshows allowed disruptions, which is the number that matters. - Check pod readiness:
kubectl get pods -l SELECTOR. Unready pods are the most common reason the budget has no headroom. - Check what the PDB selects:
kubectl describe pdb PDB -n NAMESPACE. - Check whether replacements can be scheduled — if not, the budget will never recover on its own.
- Check for other drains in progress against the same workload.
How to fix it
- Fix the unready pods so the budget has headroom. This is the correct fix in most cases.
- Scale the workload up temporarily so the budget permits a disruption.
- Correct a PDB that makes disruption impossible —
minAvailable: 1on a single replica is not a meaningful budget, it is a lock. - Ensure replacement pods can be scheduled somewhere, or the drain cannot make progress.
- Use
--disable-evictionon a drain only as a deliberate, understood override. It bypasses the protection entirely, which is occasionally right and usually not.
Notes
A PDB only constrains voluntary disruptions. A node that fails outright takes its pods with it regardless of any budget, so a PDB is not a guarantee of availability — it is a guarantee about the operations Kubernetes performs on your behalf.
Related
- SchedulingDisabled — The node has been cordoned
- Evicted — Pod removed because the node ran short of resources
Sources
- Kubernetes documentation — Disruptions
- Kubernetes documentation — Specifying a Disruption Budget
- Kubernetes documentation — API-initiated Eviction