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 StatefulSet PVC Resizing Causes Node Disk Failures

DevOps Daily with Fexingo · 2026-07-03 · 8 min

0:00--:--

Key moments - from our scoring

Substance score

74 / 100

Five dimensions, 20 points each

Insight Density17 / 20
Originality15 / 20
Guest Caliber12 / 20
Specificity & Evidence16 / 20
Conversational Craft14 / 20

Lucas details a subtle but critical failure mode in Kubernetes 1.24+ where resizing PersistentVolumeClaims in a StatefulSet template causes the StatefulSet controller to fire concurrent resize operations across all replicas simultaneously. This stampede of requests hits storage backends (EBS, GCE Persistent Disk, Rook Ceph, or other CSI drivers) at their rate limits, causing some resizes to fail while PVC objects remain marked as 'expanding' in etcd. The kubelet then attempts to mount volumes in an inconsistent state, leading to mount timeouts, DiskPressure conditions, and cascading pod evictions. Luna raises the real-world context: a 30-node cluster with a 16-replica StatefulSet for message queuing that suffered three nodes entering DiskPressure after a 50GB-to-100GB resize, ultimately causing 45 minutes of cluster degradation as the autoscaler recovered. The conversation covers root causes (lack of throttling in the StatefulSet controller, race conditions in generic ephemeral volumes, and inconsistent atomic expansion across CSI drivers), current mitigations (OnDelete update strategies with manual pod deletion, checking 'FileSystemResizePending' status, storage class volume expansion policies set to 'Online'), and monitoring signals like 'kubelet_volume_stats_available_bytes' and etcd leader changes.

Key takeaways

  • →Never trigger a StatefulSet storage template change and rolling update simultaneously; either scale to zero replicas before resizing or use OnDelete strategy with manual pod deletion after confirming PVC resize completion.
  • →Concurrent PVC resize operations exceed storage backend rate limits and leave volumes in inconsistent states; the StatefulSet controller lacks built-in throttling for resize operations.
  • →Monitor 'kubelet_volume_stats_available_bytes' and 'etcd_server_leader_changes_seen_total' metrics during resize operations to detect failures within minutes.
  • →CSI drivers with 'Online' volume expansion policy support are preferable as they allow expansion while pods run, reducing the race condition window compared to 'Offline' drivers requiring pod restart.
  • →A pending KEP for a 'VolumeResize' admission plugin would add rejection of concurrent resize requests, but operational discipline (pod disruption budgets, phased rollouts, manual coordination) is currently the most reliable mitigation.

Guests

Luna

Topics in this episode

Kubernetes StatefulSetPersistentVolumeClaim resizingCSI driversRook CephAWS EBS CSI driverGCE Persistent DiskOnDelete update strategyPod disruption budgetsVolume expansion policykubelet_volume_stats_available_byteskubernetes statefulset pvc resizepvc expansion failurenode disk failure kuberneteskubernetes storage backend overloadstatefulset rolling update storage

Questions this episode answers

What causes Kubernetes StatefulSet PVC resizing to fail and trigger node disk pressure?

The StatefulSet controller fires concurrent PVC resize operations across all replicas simultaneously, overwhelming storage backend rate limits. When resizes fail, PVC objects remain marked as 'expanding' in etcd, causing the kubelet to mount volumes in an inconsistent state, triggering mount timeouts and DiskPressure conditions.

How should you safely resize a StatefulSet's storage template in production?

Use OnDelete update strategy with a pod disruption budget limiting one unavailable pod at a time, then manually delete each pod after confirming its PVC resize is complete by checking the 'FileSystemResizePending' status. Alternatively, scale the StatefulSet to zero replicas, update the template, then scale back up.

What are the key monitoring signals to watch during a PVC resize operation?

Watch 'kubelet_volume_stats_available_bytes' for unexpected drops and 'etcd_server_leader_changes_seen_total' for spikes; both metrics correlate with resize failures and typically appear within two minutes of the problem starting.

Why does the CSI driver's volume expansion policy matter for PVC resizing?

CSI drivers with 'Online' expansion policy allow volumes to resize while pods are running without remounting, reducing race conditions. Most drivers default to 'Offline' expansion, which requires pod restart and volume release, creating a window for race conditions.

What real-world incident example demonstrates the impact of concurrent StatefulSet PVC resizing?

A 30-node SaaS cluster with a 16-replica message queue StatefulSet experienced three nodes entering DiskPressure within 15 minutes of resizing PVCs from 50GB to 100GB, causing cascading evictions and 45 minutes of cluster recovery time due to autoscaler delays.

What our scoring noted

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

Insight Density

17 / 20

The episode delivers substantial technical depth on a specific, non-obvious failure mode: concurrent PVC resize operations triggering cascading node failures through storage backend rate limits and mount state inconsistencies. It moves beyond surface-level explanations to root causes, with concrete details about race conditions, CSI driver policies, and etcd state management that would be genuinely valuable to operators managing stateful Kubernetes workloads.

The StatefulSet controller, when it sees a new storage template, doesn't serialize the resize operations across replicas. It kicks off resizes for every pod that needs the new size - all at once.
The kubelet then tries to mount a PVC that's in an inconsistent state, which can lead to mount timeouts, disk errors, and eventually node pressure.

Originality

15 / 20

The episode tackles a genuinely niche failure mode that is rarely discussed in mainstream Kubernetes content. While the technical components (StatefulSets, PVCs, CSI drivers) are standard, the specific focus on concurrent resize races and their cascading effects on cluster stability represents relatively fresh thinking in the DevOps podcast space.

It's a race condition introduced by the PVC resize feature that's been stable since Kubernetes 1.24.
And the old volume mount has to be released first, which is where the race creeps in.

Guest Caliber

12 / 20

Lucas appears knowledgeable about Kubernetes internals and has clearly debugged these issues, but the transcript provides no evidence of large-scale operational credentials or current role relevance. Luna serves as an informed interlocutor but not as a co-expert. The conversation reads more as a technical explainer than a peer-to-peer discussion between senior practitioners.

One of the more famous incidents was a mid-sized SaaS company - they ran a 30-node cluster with a 16-replica StatefulSet for their message queue.
these deep dives have saved them hours of debugging.

Specificity & Evidence

16 / 20

The episode includes concrete details: a 30-node cluster with a 16-replica StatefulSet, PVC resize from 50GB to 100GB, a 45-minute recovery time, Kubernetes versions mentioned (1.24 stability, 1.23 and earlier lacked the feature), and specific monitoring metrics (kubelet_volume_stats_available_bytes, etcd_server_leader_changes_seen_total). The CSI driver implementations (AWS EBS, Rook Ceph) and policy names (Online vs Offline) are named. Some workarounds lack exact implementation detail, but the core technical evidence is solid.

they ran a 30-node cluster with a 16-replica StatefulSet for their message queue. They bumped the PVC size from 50GB to 100GB around noon, and within 15 minutes, three nodes entered DiskPressure.
the 'kubelet_volume_stats_available_bytes' - if it drops unexpectedly during a resize, that's a red flag. Second, etcd's 'etcd_server_leader_changes_seen_total' - a sudden spike often correlates with failed PVC writes.

Conversational Craft

14 / 20

Luna asks solid follow-up questions that probe root causes and practical mitigations, moving the conversation forward logically. However, the dialogue lacks pushback or genuine tension; Luna mostly validates and occasionally offers observations rather than challenging claims. The conversation is well-structured but somewhat choreographed - more a guided tour than an interrogation. The host does not press on ambiguities like 'famous incidents' or the true prevalence of this failure mode.

So you get a stampede of resize requests hitting the storage backend simultaneously?
But scaling to zero means downtime for that stateful service. Not always an option for production.

Conversation analysis

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

Most-used words

resize16lucas15luna14storage10volume10expansion8statefulset7driver7kubelet6cluster5template5update5nodes5doesn5backend5mount5

Episode notes

Kubernetes 1.24 introduced the ability to expand PersistentVolumeClaims for StatefulSets, but the feature has a dangerous edge case. When a StatefulSet’s storage template is updated, the controller can trigger concurrent resize operations across multiple replicas, overwhelming the underlying storage backend and causing node disk failures. In this episode, Lucas and Luna walk through a real incident at a mid-sized SaaS company where a simple PVC size bump from 50GB to 100GB caused a cascading failure across three nodes. They explain the mechanics of the resize API, the race condition in generic ephemeral volumes, and the mitigation strategies - including pod-level PDBs and phased rollouts. DevOps engineers currently running StatefulSets with expanded PVCs will walk away with a concrete checklist to avoid this silent cluster-killer. #Kubernetes #StatefulSet #PVCResize #NodeDiskFailure #PersistentVolumeClaim #DevOps #CloudNative #InfrastructureFailure #RaceCondition #ETCD #Kubelet #StorageBackend #Persistence #CascadingFailure #Technology #FexingoBusiness #BusinessPodcast #ProductionIncident Keep every episode free: buymeacoffee.com/fexingo

Full transcript

8 min

Transcribed and scored by The B2B Podcast Index.

Lucas: So you're running a StatefulSet in production - say, a Kafka cluster or a Cassandra ring - and you realize your PersistentVolumeClaims are undersized. You bump the storage template from 50 gigs to 100 gigs, roll out the update, and then watch your nodes start dropping like flies. Luna: That sounds like a nightmare. What actually goes wrong?

Lucas: It's a race condition introduced by the PVC resize feature that's been stable since Kubernetes 1.24. The StatefulSet controller, when it sees a new storage template, doesn't serialize the resize operations across replicas. It kicks off resizes for every pod that needs the new size - all at once.

Luna: So you get a stampede of resize requests hitting the storage backend simultaneously? Lucas: Exactly. And the storage backend - whether it's EBS, GCE Persistent Disk, or a CSI driver like Rook Ceph - has rate limits. When you exceed those limits, some resize calls fail, but the PVC object may already be marked as 'expanding' in etcd.

The kubelet then tries to mount a PVC that's in an inconsistent state, which can lead to mount timeouts, disk errors, and eventually node pressure. Luna: I've seen this happen. The node's kubelet starts reporting 'failed to mount volume' and the node condition flips to DiskPressure. Then pods get evicted, and the cascading effect can take down half the cluster.

Lucas: Right. One of the more famous incidents was a mid-sized SaaS company - they ran a 30-node cluster with a 16-replica StatefulSet for their message queue. They bumped the PVC size from 50GB to 100GB around noon, and within 15 minutes, three nodes entered DiskPressure. The storage backend - in that case, an older version of Rook Ceph - couldn't handle the simultaneous resize operations.

Luna: Three nodes out of thirty doesn't sound catastrophic, but I bet the impact was bigger. Lucas: Because those three nodes each hosted four or five other pods - web servers, caches, other stateful workloads. The evictions caused a thundering herd on the remaining nodes, and the cluster autoscaler took almost 10 minutes to spin up replacements. Total recovery time: about 45 minutes.

Not a full outage, but degraded performance for most of the afternoon. Luna: And the root cause was specifically the StatefulSet controller not throttling resize operations? Lucas: Partly. The controller itself doesn't have built-in throttling for PVC resizes.

But there's also a race in the generic ephemeral volume feature - when a PVC is created or resized as part of a pod template, the kubelet can attempt to mount the volume before the CSI driver finishes the expansion. If the expansion fails midway, the volume ends up in a weird state where the capacity in etcd doesn't match the actual block device size. Luna: So even if you resize one pod at a time, you could still hit issues if the CSI driver isn't atomic? Lucas: Yes.

But the biggest bang for the buck is the concurrent resize problem. Some teams work around it by using a rolling update with a custom script that updates one PVC at a time and waits for the resize to complete. But that's fragile - you have to manually coordinate with the StatefulSet's pod management policy. Luna: Are there any built-in mitigations now?

I know the CSI spec has a 'volume expansion' capability that includes a 'volume_expansion_policy' parameter. Does that help? Lucas: It does, but only if the CSI driver supports the 'Online' expansion policy. That lets the kubelet expand the volume while the pod is still running, without needing to remount.

But most drivers still default to 'Offline' - meaning you need to restart the pod to complete the resize. And the old volume mount has to be released first, which is where the race creeps in. Luna: So what's the practical advice for someone who needs to resize a StatefulSet's storage today? Lucas: First: never change the storage template and trigger a rolling update simultaneously.

Instead, manually scale down the StatefulSet to zero replicas, update the template, then scale back up. That way, each PVC resize is isolated to the pod creation sequence. Luna: But scaling to zero means downtime for that stateful service. Not always an option for production.

Lucas: Right. So the next best approach is to use a pod disruption budget that allows only one pod to be unavailable at a time, combined with a phased rollout using the 'OnDelete' update strategy. You manually delete each pod after confirming its PVC resize has completed - using 'kubectl get pvc' and checking the status field for 'FileSystemResizePending' or 'true'. Luna: And you can also set a resource quota on the storage backend's API calls?

I've seen teams throttle CSI requests via a sidecar. Lucas: That's clever. Some CSI drivers, like the AWS EBS CSI driver, now support a ' - kubelet registration path' flag that can control concurrency. But it's not widely documented.

The most reliable fix is actually in the Kubernetes scheduler itself - there's an open KEP to add a 'VolumeResize' admission plugin that would reject concurrent resize requests for the same storage class. It hasn't graduated yet. Luna: So for now, it's mostly operational discipline. But this is exactly the kind of edge case that makes me appreciate the depth of the Kubernetes codebase - every new feature seems to introduce a subtle failure mode.

Lucas: And that's why shows like this exist - to surface those failure modes before they hit your cluster. Speaking of which, a couple of dollars a month from listeners genuinely makes it possible for us to keep digging into these incidents. If today's conversation gave you something actionable, buy me a coffee dot com slash fexingo helps keep the show ad-free and independent. Luna: Yeah, it's a small thing that adds up.

We've heard from a lot of folks who say these deep dives have saved them hours of debugging. Lucas: Exactly. So back to the issue: another mitigation worth considering is using a storage class with a volume expansion policy set to 'Online' if your CSI driver supports it. That at least allows the expansion to happen while the pod is running, reducing the window for race conditions.

Luna: And for teams that can't change their driver, what's the monitoring signal they should watch for? Lucas: There are two key metrics. First, the 'kubelet_volume_stats_available_bytes' - if it drops unexpectedly during a resize, that's a red flag. Second, etcd's 'etcd_server_leader_changes_seen_total' - a sudden spike often correlates with failed PVC writes.

In the incident I mentioned, both metrics went off within two minutes of the resize trigger. Luna: So the lesson is: PVC resizing is not a fire and forget operation. You need to plan the rollout, monitor the backend, and have a rollback plan. Lucas: Exactly.

And if you're on an older Kubernetes version - say 1.23 or earlier - this whole class of failure doesn't exist because PVC expansion was still alpha. But as we move forward, these failure modes become more common. Knowing how to handle them is part of the job now.

Related episodes across the Index

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

  • How B2B Brands Wreck Pipeline with Unsyncroned CRM DataThe Marketing Operator Podcast with Fexingo · features Luna92 / 100
  • Why API Webhook Payloads Should Be Signed Not VerifiedThe Developer Tools Podcast with Fexingo · features Luna90 / 100
  • How Incrementality Reveals True Marketing ImpactMarketing Analytics with Fexingo · features Luna90 / 100
  • How to Sell Against a Competitor Already in the BuildingSales Leadership with Fexingo · features Luna85 / 100
  • Why B2B Brands Are Using AI for Account PrioritizationThe Growth Operator with Fexingo · features Luna84 / 100
  • Enterprise Software Buyers Now Demand a Vendor Data Portability GuaranteeB2B SaaS Talks with Fexingo · features Luna82 / 100

More from DevOps Daily with Fexingo

All episodes →
  • How Kubernetes Namespace Quotas Trigger Unexpected Failures58 / 100
  • Why Your Kubernetes Cost Reports Are Lying To You
  • How Kubernetes Node Pools Can Cost You More Than You Think
  • How Kubernetes Pod Overhead Changes Node Capacity Calculations
  • How Kubernetes Pod Security Admission Blocks Risky Workloads
Explore the best B2B Engineering & DevTools podcasts →
All DevOps Daily with Fexingo episodes →