The B2B Podcast Index
Index
All categories
MarketingSalesSaaSFinanceHROpsLeadershipCustomer SuccessAI & DataProductStartups & FoundersRevOpsEngineering & DevTools
MethodologySubmit
Best of:MarketingSalesSaaSFinanceHROpsLeadershipCustomer SuccessAI & DataProductStartups & FoundersRevOpsEngineering & DevTools
An independent project byFame
SearchBest episodesGuestsInsightsMethodologySubmit a podcast
Index/Engineering & DevTools/DevOps Daily with Fexingo
DevOps Daily with Fexingo artwork

How Kubernetes PodDisruptionBudgets Cause Rollout Stalls

DevOps Daily with Fexingo · 2026-06-30 · 9 min

0:00--:--

Key moments - from our scoring

Substance score

72 / 100

Five dimensions, 20 points each

Insight Density16 / 20
Originality13 / 20
Guest Caliber14 / 20
Specificity & Evidence15 / 20
Conversational Craft14 / 20

Lucas and Luna explore how PodDisruptionBudgets - a Kubernetes feature meant to prevent service disruption during voluntary node drains - can paradoxically block deployments during rolling updates. The core issue: when a deployment evicts an old pod and spawns a new one that isn't ready yet, the PDB sees two unavailable pods and prevents further evictions, freezing the rollout. This is especially problematic for two-replica setups with maxUnavailable: 1, common in cost-constrained environments. The conversation covers multiple mitigation strategies: scaling to three or more replicas (the safest approach), switching to minAvailable semantics, tuning startup probes, and using maxSurge: 1 with maxUnavailable: 0 to maintain constant pod availability. The episode also discusses monitoring via kube_poddisruptionbudget_status_current_healthy metrics and the DisruptionAllowed condition (available since Kubernetes 1.26) to catch PDB-induced stalls. The hosts emphasize that PDBs are best-practice Kubernetes policy objects, but their interaction with rolling updates and node drains is subtle and requires testing in staging before production deployment.

Key takeaways

  • →PodDisruptionBudgets with maxUnavailable: 1 on two-replica deployments block rolling updates because the PDB counts both the terminating old pod and the not-yet-ready new pod as unavailable.
  • →The minimum safe replica count for rolling updates with maxUnavailable: 1 is three replicas, not two, ensuring one pod can be unavailable while two continue serving traffic.
  • →Using maxSurge: 1 with maxUnavailable: 0 is the recommended approach for critical services, allowing new pods to start before old ones terminate and guaranteeing no downtime during updates.
  • →Monitor PDB health using kube_poddisruptionbudget_status_current_healthy metrics and the DisruptionAllowed condition to catch stalled rollouts early rather than discovering them during incidents.
  • →PDBs interact unpredictably with deployment controller and node drains, making testing in staging with actual rollout and drain workflows essential before relying on them in production.

Guests

Luna

Topics in this episode

Pod anti-affinityKubernetes PodDisruptionBudgetmaxUnavailableminAvailablemaxSurgerolling updatesnode drainskube_poddisruptionbudget_status_current_healthy metricDisruptionAllowed conditionstartup probesrollout stallkube-scheduler pod disruption budgetmaxunavailable vs minavailablekubernetes node drain pod disruption

Questions this episode answers

Why does my Kubernetes rollout stall even though my PodDisruptionBudget looks correctly configured?

During a rolling update, Kubernetes evicts an old pod and spawns a new one, but the new pod may not be ready immediately. If your PDB counts both the terminating old pod and the not-yet-ready new pod as unavailable, it blocks further evictions, freezing the rollout. This commonly happens with two replicas and maxUnavailable: 1, where the deployment controller gets stuck.

What replica count do I need for a PodDisruptionBudget with maxUnavailable: 1 during rolling updates?

You need at least three replicas. With three replicas, you can have one terminating, one starting, and one serving traffic, satisfying the maxUnavailable: 1 constraint. Two replicas is insufficient because both may be counted as unavailable during the rollout.

Is minAvailable: 1 safer than maxUnavailable: 1 for rolling updates?

minAvailable: 1 uses slightly different controller semantics and is somewhat safer for rolling updates, but it can still cause issues if both replicas land on the same node during a node drain. It's better paired with tuned startup probes or increased replica counts.

How can I monitor if a PodDisruptionBudget is blocking my rollout?

Monitor the kube_poddisruptionbudget_status_current_healthy metric and check the DisruptionAllowed condition on the PDB object (available since Kubernetes 1.26). If DisruptionAllowed is false and persists during a rollout, the PDB is likely blocking progress. Set up alerts on stalled deployments that don't complete within a reasonable time window.

What's the safest PodDisruptionBudget configuration for critical services?

Use maxSurge: 1 with maxUnavailable: 0, which allows new pods to start before old ones terminate, ensuring you always have at least the desired number serving traffic. This requires enough cluster capacity for the temporary extra pod but eliminates rollout stalls caused by PDBs.

What our scoring noted

Our reviewer’s read on each dimension, with quotes from the episode.

Insight Density

16 / 20

The episode packs concrete technical failure modes and solutions throughout: the two-replica + PDB stall mechanism, the three-replica minimum for safe rolling updates, minAvailable vs maxUnavailable semantics, pod anti-affinity for spread, kube_state_metrics monitoring (kube_poddisruptionbudget_status_current_healthy), PDB conditions since Kubernetes 1.26, maxSurge/maxUnavailable: 0 pattern, and startup probe tuning. Most of these are non-obvious interactions that a DevOps operator wouldn't intuitively grasp. Minimal filler; the dialogue stays on track.

The deployment controller tries to bring up a new pod. It evicts an old pod. But now you have one old pod terminating, one new pod starting, and the PDB says you can only have one unavailable pod.
The minimum safe replica count for a rolling update with maxUnavailable: 1 is actually three, not two.

Originality

13 / 20

The core insight - that PDBs can block rolling updates due to unavailability counting logic - is specific and not mainstream knowledge in most DevOps discussions. However, the solutions are largely standard best practices (anti-affinity, replica scaling, monitoring metrics). The framing around a specific Black Friday scenario and the deep dive into PDB-controller interaction adds freshness, but the overall thinking stays within orthodox Kubernetes patterns rather than challenging assumptions.

The thing that was supposed to keep you safe is now the thing that's blocking you.
teams adopt PDBs because they're a best practice, but they don't think through the edge cases. The result is a system that's more fragile, not less.

Guest Caliber

14 / 20

Lucas and Luna present as experienced practitioners who have debugged this exact scenario in production ('I've seen this happen in production during a flash sale') and reference specific Kubernetes versions and metrics by name. They demonstrate tactical depth rather than theoretical knowledge. However, no titles, company context, or credential markers are provided, and the conversation is more of a co-hosted deep-dive than an external expert interview, which limits clarity on their scale of operations.

I've seen this happen in production during a flash sale, and the team spent an hour debugging before someone noticed the PDB was the culprit.
Since Kubernetes 1.26, the PDB object has a status field that shows if the PDB is healthy or not.

Specificity & Evidence

15 / 20

The episode includes specific configurations (maxUnavailable: 1, minAvailable: 1, maxSurge: 1, maxUnavailable: 0), named Kubernetes objects (kube_state_metrics, kube_poddisruptionbudget_status_current_healthy, DisruptionAllowed condition), version markers (Kubernetes 1.26), and concrete scenarios (two-replica checkout on Black Friday, node drain blocking). The absence of actual company names or metric screenshots is a minor gap, but the technical specificity is high throughout.

If you have three replicas and maxUnavailable: 1, then during a rolling update you can have one terminating, one starting, and one still serving - the PDB is satisfied because only one is unavailable.
You should have alerts for stalled rollouts - something that watches the deployment's progress and fires if it doesn't complete within a reasonable time.

Conversational Craft

14 / 20

Luna acts as an effective co-interlocutor who anticipates patterns ('Let me guess - the e-commerce platform with two replicas'), asks clarifying follow-ups ('And the fix? Or rather, the better configuration?'), and pushes into adjacent problems (cluster autoscaler interaction). Lucas responds with depth rather than platitudes. The dialogue has genuine pedagogical structure, moving from problem → root cause → multiple solutions. However, there's limited pushback or disagreement; Luna mostly affirms Lucas's points rather than challenging assumptions or pressing on trade-offs in detail.

Luna: Right, so the minimum safe replica count for a rolling update with maxUnavailable: 1 is actually three, not two. Lucas: That's the key takeaway.
And don't forget the PDB conditions. Since Kubernetes 1.26, the PDB object has a status field that shows if the PDB is healthy or not.

Conversation analysis

Computed from the transcript - who did the talking, and the words that came up most.

Most-used words

lucas19luna18node15replicas12maxunavailable12unavailable10drains9pods9rollout8rolling8update7replica7drain6deployment5terminating5stuck5

Episode notes

In this episode of DevOps Daily, Lucas and Luna dive into a subtle Kubernetes scheduling trap: how PodDisruptionBudgets, meant to ensure high availability during voluntary disruptions, can inadvertently cause rollout stalls in production. Using a real-world example from an e-commerce platform handling Black Friday traffic, they explain the interplay between PDBs, replica counts, and node drains. Lucas walks through the scenario where a PDB with 'maxUnavailable: 1' combined with a two-replica deployment and a rolling update leads to a complete freeze. They discuss the root cause, how the kube-scheduler and kube-controller-manager interact with PDBs, and practical mitigations like using 'minAvailable' over 'maxUnavailable', setting appropriate replica counts, and monitoring with custom alerts. Listeners walk away with a concrete debugging approach and a better understanding of why their rollouts sometimes stall for no apparent reason.

Full transcript

9 min

Transcribed and scored by The B2B Podcast Index.

Lucas: You set up a PodDisruptionBudget to protect your service during node drains. Then your next rollout stalls for forty minutes and nobody can tell you why. Luna: Right, the thing that was supposed to keep you safe is now the thing that's blocking you. Lucas: Exactly.

And it's not a bug. It's a feature working exactly as designed - just not the way you expected. So today I want to walk through a specific scenario that I've seen trip up teams, especially around peak traffic events like Black Friday. Luna: Let me guess - the e-commerce platform with two replicas and a PDB that said maxUnavailable: 1.

Lucas: You already know this story, but let's walk through it for everyone else. So picture this: you've got a deployment running two replicas of your checkout service. It's Black Friday week, traffic is spiking, and you push a critical fix. Your PDB says maxUnavailable: 1 - meaning at most one pod can be unavailable during voluntary disruptions like node drains or rolling updates.

Luna: Sounds reasonable. You don't want both pods down at the same time. Lucas: Totally reasonable. Except what happens during a rolling update?

The deployment controller tries to bring up a new pod. It evicts an old pod. But now you have one old pod terminating, one new pod starting, and the PDB says you can only have one unavailable pod. The new pod isn't ready yet - maybe it's still pulling the image or running startup probes.

So the controller sees two unavailable pods - the terminating one and the not yet ready one - and the PDB blocks further evictions. Luna: So the rollout stalls because the new pod can't become ready fast enough, and the old pod is stuck terminating. Lucas: Exactly. The deployment gets stuck.

No progress for minutes or even hours. And the worst part is, from the outside, everything looks fine. The PDB is working - it's preventing more than one unavailable pod. But the rollout is frozen.

I've seen this happen in production during a flash sale, and the team spent an hour debugging before someone noticed the PDB was the culprit. Luna: And the fix? Or rather, the better configuration? Lucas: There are a few approaches.

One is to use minAvailable instead of maxUnavailable. In this case, minAvailable: 1 means at least one pod must be available at all times. With two replicas, that still allows one pod to be unavailable - but the semantics are slightly different. The controller interprets it more conservatively during rollouts.

Another approach is to increase the replica count. If you have three replicas and maxUnavailable: 1, then during a rolling update you can have one terminating, one starting, and one still serving - the PDB is satisfied because only one is unavailable. Luna: Right, so the minimum safe replica count for a rolling update with maxUnavailable: 1 is actually three, not two. Lucas: That's the key takeaway.

And if you absolutely can't run three replicas due to resource constraints, you can tune the pod's readiness probe to be faster, or use a startup probe to give the pod more time to initialize without being considered unavailable. But the real fix is understanding that PDBs interact with the deployment controller in ways that aren't obvious. Luna: And this is just one scenario. What about node drains?

That's another common case. Lucas: Node drains are interesting because they use eviction API directly. When you drain a node, kubelet evicts pods one by one, respecting PDBs. If you have a PDB that says maxUnavailable: 1, and you try to drain a node that hosts the only two replicas of a service, the drain will get stuck because evicting the first pod makes one unavailable, and then evicting the second would make two unavailable.

So the drain waits forever - or until the PDB is deleted or modified. Luna: So you need to either scale up before the drain, or use a higher maxUnavailable, or ensure pods are spread across nodes. Lucas: Exactly. And pod anti-affinity helps with that.

If you spread pods across nodes, draining one node only affects one replica. But if you have two replicas and two nodes, draining one node still leaves one replica - so maxUnavailable: 1 works fine for drains in that case. The problem is specifically when multiple replicas land on the same node, or when the replica count is too low. Luna: So the lesson is: PDBs are not a set-and-forget configuration.

You have to think about how they interact with your rollout strategy, your replica count, and your pod scheduling. Lucas: Exactly. And this is where monitoring comes in. You should have alerts for stalled rollouts - something that watches the deployment's progress and fires if it doesn't complete within a reasonable time.

Also, you can expose PDB metrics via the kube state metrics. There's a metric called kube_poddisruptionbudget_status_current_healthy that tells you how many pods are healthy. If that drops below your desired threshold and stays there, you know something's wrong. Luna: And don't forget the PDB conditions.

Since Kubernetes 1.26, the PDB object has a status field that shows if the PDB is healthy or not. You can use that in your alerting. Lucas: Good point.

The DisruptionAllowed condition tells you whether the PDB currently allows evictions. If it's false, you know you're blocked. So you can set up an alert on that. But the tricky part is that during a rolling update, the PDB might temporarily be in a state where evictions are not allowed, and that's normal - but if it persists, it's a problem.

Luna: So what's your recommended setup for a production service that needs high availability during rollouts and node drains? Lucas: I'd say: run at least three replicas, use pod anti-affinity to spread them across nodes, and set your PDB to maxUnavailable: 1. That gives you one pod down during updates or drains while still having two serving traffic. If you need more resilience, go with five replicas and maxUnavailable: 2.

But always test your rollout with the PDB in place in a staging environment - because the behavior is subtle and you don't want to discover it during a real incident. Luna: And if you're stuck with two replicas due to cost or resource limits? Lucas: Then use minAvailable: 1 instead of maxUnavailable. That's a bit safer for rollouts, though it can still have issues during node drains if both pods are on the same node.

Better to use a startup probe that's long enough to let the new pod initialize without being marked unavailable. Also consider using a rolling update with a maxSurge of 1, so you can bring up a new pod before terminating an old one. That way you always have two pods running during the update - the old one and the new one. Luna: Right, maxSurge allows you to temporarily have more than the desired replicas, which gives you headroom.

Lucas: Exactly. And that's actually the recommended approach for critical services. Use maxSurge: 1 and maxUnavailable: 0. That ensures during a rolling update, you always have at least the desired number of pods serving traffic.

The trade-off is you need enough cluster capacity to schedule the extra pod temporarily. Luna: So the PDB itself isn't the enemy - it's the combination of configuration choices that creates the stall. Lucas: Right. And this is a pattern I see a lot: teams adopt PDBs because they're a best practice, but they don't think through the edge cases.

The result is a system that's more fragile, not less. So the takeaway for today is: know your replica count, know your PDB semantics, and always test the interaction with rolling updates and node drains before you rely on it in production. Luna: If today's tech conversation gave you something usable - maybe saved you from a future rollout stall - and you'd like to support the show staying ad-free, you can find us at buy me a coffee dot com slash fexingo. Lucas: Appreciate that.

And as we head into the summer conference season, I think we should also talk about how PDBs interact with cluster autoscaler - because that's another common pain point. Luna: Yeah, that's a good follow-up. When the autoscaler tries to scale down a node and the PDB blocks eviction, the node stays up and you waste resources. Lucas: Exactly.

So that's a perfect topic for a future episode. For now, the key thing to remember: test your PDB configuration with your actual rollout and drain workflows. Don't assume it just works. And if you find yourself stuck in a rollout stall, check your PDB status first - it might save you an hour of debugging.

Luna: Great advice. Thanks, Lucas. Lucas: Thanks, Luna. See you next time.

Related episodes across the Index

Other episodes covering the same guests and topics, from across The B2B Podcast Index.

  • How Idempotency-Key Design Prevents Payment DisastersThe Developer Tools Podcast with Fexingo · features Luna98 / 100
  • Why Pipeline Velocity Trumps Deal Size Every TimeThe Growth Operator with Fexingo · features Luna95 / 100
  • Why Enterprise Software Deals Now Include a Vendor AI Model Explainability MandateB2B SaaS Talks with Fexingo · features Luna94 / 100
  • How B2B Brands Wreck Pipeline with Unsyncroned CRM DataThe Marketing Operator Podcast with Fexingo · features Luna92 / 100
  • Why Marketing Attribution Misses the Seasonality PatternMarketing Analytics with Fexingo · features Luna91 / 100
  • How to Sell Against a Competitor Already in the BuildingSales Leadership with Fexingo · features Luna85 / 100

More from DevOps Daily with Fexingo

All episodes →
  • How Kubernetes ServiceAccount Token Expiration Breaks CI Workflows75 / 100
  • How Kubernetes StatefulSet PVC Resizing Causes Node Disk Failures94 / 100
  • How Kubernetes Topology Spread Constraints Create Scheduling Hotspots95 / 100
  • How Kubernetes CRD Versioning Breaks Controller Upgrades90 / 100
  • How Kubernetes Audit Logging Causes etcd Performance Degradation91 / 100
Explore the best B2B Engineering & DevTools podcasts →
All DevOps Daily with Fexingo episodes →