Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

A Kubernetes node drain can wait on a single pod when safely evicting it would violate a PodDisruptionBudget (PDB). That is a strong possibility—not a confirmed explanation for this two-day delay without the cluster’s events, logs, and configuration. Check the pod’s owner and readiness, then inspect the matching PDB and the eviction response before changing workload scale or disruption policy.

Why one pod can hold up a node drain

kubectl drain uses the Kubernetes Eviction API to remove eligible pods while honoring graceful termination and applicable PDBs. A PDB sets the voluntary disruption level a workload can tolerate. If evicting a selected pod would leave fewer healthy replicas than the budget allows, Kubernetes can reject the eviction, leaving the drain unable to complete. See Kubernetes’ node drain guidance and PDB documentation.

A PDB that permits zero voluntary disruptions can therefore block a drain if the node holds one of the protected workload’s pods. For example, setting minAvailable equal to the replica count, or setting maxUnavailable to zero, leaves no room to evict a healthy replica voluntarily.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

This mechanism makes a PDB blockage plausible, but the title alone does not establish that it caused this particular two-day wait. A slow graceful shutdown, a replacement pod that cannot be scheduled, storage handling, or a managed provider’s upgrade policy can also prolong maintenance.

How to find out what is blocking the eviction

  1. Identify the pod and its workload. Record its namespace and owner, then check whether it is Ready and whether its controller can create a replacement. A pod’s owner and health help establish which availability policy applies.
  2. Find the PDB that selects the pod. List budgets with kubectl get pdb --all-namespaces. Inspect the matching budget using kubectl get poddisruptionbudgets <name> -n <namespace> -o yaml. Kubernetes documents these inspection commands in its PDB guide.
  3. Read the PDB’s live status. Check disruptionsAllowed, currentHealthy, and desiredHealthy. If disruptionsAllowed is zero, the budget currently permits no voluntary disruption. Confirm that the budget’s selector actually matches the pod and that the workload’s healthy replica count is what you expect.
  4. Inspect the eviction failure, not just the wait. An HTTP 429 response can mean the PDB denied the eviction, but Kubernetes also documents 429 as a possible API rate-limit response. Look at the response details and relevant events or provider audit logs to distinguish them. The API-initiated Eviction documentation explains these responses.
  5. Check whether the pod can finish and be replaced. Review its terminationGracePeriodSeconds, scheduling constraints such as node affinity, available cluster capacity, and any persistent-volume attachment or detachment work. A budget may not be the cause if termination or rescheduling is what is taking time.
  6. Check the managed provider’s upgrade records. Provider workflows and time limits are not universal Kubernetes behavior. For example, Microsoft’s AKS guidance for PDB-related UpgradeFailed errors describes a provider-specific failure path. Use the provider’s upgrade readiness checks and logs for the cluster in question.

How to unblock the drain without guessing

Choose a change only after establishing how many healthy instances the application needs during maintenance. For a quorum-based or stateful service, calculate the safe replica floor and account for storage and recovery behavior before scaling or changing the budget.

Option When it may help Trade-off or check
Restore healthy replica headroom The workload can safely run more replicas, and the PDB has no disruption allowance because too few replicas are healthy. Confirm the new replicas can become Ready and that the application supports the added instances. Google Cloud recommends scaling a Deployment or HPA to permit draining while still respecting its PDB in its GKE upgrade guidance.
Correct an over-restrictive PDB The configured minAvailable or maxUnavailable does not reflect the service’s actual availability requirement. Set the budget to match the disruption the application can tolerate; do not loosen it solely to make maintenance proceed.
Use unhealthyPodEvictionPolicy: AlwaysAllow A running but unhealthy pod is preventing eviction, and the cluster version supports the policy. This allows eviction even when PDB criteria are unmet, so the pod may be removed before it has another chance to recover. Kubernetes documents this policy as stable since version 1.31; verify version context for older clusters in the PDB guide.
Pause the automated upgrade and investigate The eviction remains stuck and the reason or application impact is not yet clear. Kubernetes advises pausing and investigating before restarting the operation. Direct pod deletion is a distinct, more forceful action than eviction; assess application safety and consequences before considering it. See the Eviction API guidance.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Other reasons an upgrade can wait for hours or days

A PDB is only one possible blocker. Google Cloud’s GKE troubleshooting documentation identifies several other upgrade-delay causes; these examples describe GKE and should not be treated as universal timing rules.

  • Long graceful shutdown: Kubernetes waits for the pod’s configured terminationGracePeriodSeconds, which can extend the drain if it is unusually long.
  • Replacement pods cannot be scheduled: Restrictive node affinity or insufficient suitable capacity can prevent a replacement from landing, including during surge upgrades.
  • Persistent-volume lifecycle work: Attached volumes can add time while their lifecycle is managed.
  • GKE-specific upgrade behavior: Google Cloud says certain GKE short-lived upgrade strategy cases can take up to seven days, and GKE Autopilot extended-duration pods may be protected from GKE-initiated eviction for up to seven days. These are GKE-specific cases, not expected durations for Kubernetes upgrades generally.

GKE’s troubleshooting guide gives the example audit-log message “Cannot evict pod as it would violate the pod’s disruption budget.” Treat that as a diagnostic example; it does not establish that this cluster produced the message. The same guide explains how to search GKE audit logs and inspect PDBs: Troubleshoot cluster upgrades.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.