KubePodDisruptionBudgetBlocksEviction
A PodDisruptionBudget has allowed zero voluntary disruptions for a long time, so any kubectl drain, node upgrade or cluster autoscaler scale-down touching its pods will stall.
| Severity | info |
| Source | kube-state-metrics v2.x |
| Key metrics | kube_poddisruptionbudget_status_pod_disruptions_allowed, kube_poddisruptionbudget_status_expected_pods |
What it means
disruptionsAllowed is how many matching pods may be evicted right now. When it stays at zero for a PDB that actually covers pods, the eviction API refuses every request with a “would violate the pod’s disruption budget” error. The alert is informational: nothing is down, but maintenance is blocked.
It tends to surface at the worst time, during a node pool upgrade that hangs for hours.
Common causes
- Single-replica workload with
minAvailable: 1ormaxUnavailable: 0. minAvailableequal to the replica count (for example 3 of 3).- A replica is unhealthy, using up the only allowed disruption.
- A Helm chart default PDB applied to a workload scaled down to one pod.
- Percentage values that round to no allowed disruptions on small replica counts.
First checks
- List PDBs with no disruptions allowed:
kubectl get pdb -A | awk 'NR==1 || $5==0'kube_poddisruptionbudget_status_pod_disruptions_allowed == 0 - Compare the budget with the replica count:
kubectl -n <ns> get pdb <pdb> -o yaml | grep -E 'minAvailable|maxUnavailable|currentHealthy|desiredHealthy|expectedPods' kubectl -n <ns> get deploy,statefulset -l <selector> - Check whether a drain is already stuck on it:
kubectl get nodes | grep SchedulingDisabled - Look for unhealthy pods consuming the budget:
kubectl -n <ns> get pods -l <selector>
Fixing it
Give the workload room: run at least two replicas, or switch to maxUnavailable: 1. If a pod is unhealthy, fix it first. On Kubernetes 1.31+ (beta since 1.27), unhealthyPodEvictionPolicy: AlwaysAllow lets drains evict pods that are already not Ready. For a truly single-instance workload, accept the PDB and plan a manual failover before draining, rather than deleting the PDB mid-upgrade.
Related alerts
- KubePodDisruptionBudgetViolated: the budget is not even met.
- KubeNodeCordoned: a node left cordoned by a stalled drain.
- KubeDeploymentReplicasMismatch: missing replicas that use up the budget.