When a “simple” Redis disk resize in Kubernetes turns into a VPN incident: a post-mortem

TL;DR: the short version

On the 2nd of December, 2025 we got an alert that a critical system component (Redis) was running out of disk space. Fixing the capacity issue itself was straightforward. The real trouble started when we tried to “clean things up” afterwards and make the configuration match reality.

Because this component runs in Kubernetes and is set up in a way that doesn’t allow straightforward resource adjustment, we attempted a safe-looking workaround: recreate the controller object without deleting the actual running pods. Kubernetes interpreted that change differently than we expected and restarted the whole Redis cluster. The restart process wasn’t “cautious” enough, it moved too fast and caused the cluster to come back partially degraded. While we were repairing the degraded nodes, a backend service got overwhelmed by reconnect traffic and started failing with out-of-memory errors. After scaling and tuning, the service recovered. Total downtime was ~50 minutes.

What happened

We received an alert that several instances of the Redis cluster were running out of free disk space. But increasing the disk space in our case is associated with certain problems. The thing is, in Kubernetes things such as Redis are usually created via a StatefulSet. It’s specifically designed for workloads that need stable identities and storage.

However, some parts of the StatefulSet are locked, and it can be a problem. StatefulSets define storage via volumeClaimTemplates. Important details:

  • the storage template is effectively locked once created
  • you can’t simply edit it in place to increase disk size

So even if you know exactly what you want, Kubernetes won’t let you change that specific field in the StatefulSet spec.

The immediate fix: increase capacity without restarts

Our storage backend supports online volume expansion. That means we can increase disk capacity underneath a running pod without restarting it.

So we resized the PersistentVolumeClaims (PVCs) directly. This resolved the disk pressure quickly and safely.

But it created a new problem:

  • the declarative configuration (Git + StatefulSet template) was still describing the old disk size
  • the actual PVC/PV state in the cluster now reflected the new disk size

This mismatch is a classic “configuration drift.”

The “cleanup” attempt: make the code match reality

Because the StatefulSet storage template is immutable, the only straightforward way to align the declared state with the real state is to:

  1. Delete the StatefulSet object
  2. Recreate it with the updated storage template

Of course, deleting the StatefulSet normally results in deleting child resources. So we used a Kubernetes trick:

Orphan deletion: “fire the manager, keep the factory running”

We deleted the StatefulSet using orphan / non-cascading deletion. The idea was:

  • Kubernetes forgets the “manager” object…
  • …but the pods (and their disks) stay alive

Then we recreated the StatefulSet so Git and the cluster would be consistent again.

This looked safe — but Kubernetes had a different interpretation.

The unexpected part: Kubernetes restarted the entire Redis cluster

After recreating the StatefulSet, Kubernetes reconciled the workload based on the new spec. Even though the actual disks were already resized, Kubernetes “didn’t know” that all changes had already been applied, so it started the reconciliation process, which resulted in a full Redis cluster restart.

A distributed database/cache cluster can survive a restart sequence, but only if the restart is performed cautiously.

That brings us to the biggest amplifier in this incident.

Why it escalated: restarts were too optimistic

Our restart behavior was not defensive enough:

  • no startup and readiness probes
  • a pod being just “running” was treated as “good enough” (but in reality it still couldn’t handle the actual requests load)
  • Kubernetes proceeded to the next pod too quickly

In plain language: we had a restart process that didn’t really wait for Redis to be healthy before moving on.

At first, this still didn’t look catastrophic: the backend service complained about Redis connections, but overall service graphs didn’t immediately collapse.

Degraded Redis cluster: replicas got “stuck” to old masters

When the dust settled, the Redis cluster came up partially degraded:

  • some replica nodes couldn’t reattach properly
  • they retained stale information about which master they belonged to

At that point, recovery required manual Redis Cluster operations:

  • forgetting obsolete node identities on masters
  • resetting affected replicas
  • re-joining them to the cluster and waiting for the replication catch-up

This procedure took longer than expected. And while it was still in progress, we hit the second-stage failure.

Secondary impact: backend service overload and out-of-memory failures

While Redis nodes were rejoining and syncing, the backend service faced reconnect storms and elevated load. This turned into cascading out-of-memory failures.

Two things made this worse:

  • we initially misattributed which component was actually OOMing
  • scaling the backend service was delayed due to limited spare capacity under current resource constraints

Once the failed component was correctly identified, we stabilized the system by:

  • scaling the backend service
  • increasing memory limits for the affected component
  • …and temporarily relaxing probes to let instances enter the service immediately to smooth the recovery — otherwise it had a cascade effect: once the pod check says that a pod is “ready,” it quickly becomes overloaded with traffic and goes back to “not ready” again. This increases the load on the next pod, the situation repeats, and so on.

After that, the service gradually recovered and the clients’ traffic returned back to normal. Total downtime was appr. 50 minutes: 8:10 UTC - 09:00 UTC

Events timeline

7:00 UTC: disk size was increased in Git
7:05 UTC: the disk size was manually updated for all PVCs in the cluster
7:10 UTC: all pods have finished online disk resizing
8:10 UTC: sts orphan deletion and recreation were performed
8:10-8:15 UTC: Kubernetes quickly performed a full StatefulSet restart. At this moment problems started to appear
8:15-8:35 UTC: manual cluster restoration — replicas recreation & reallocation
8:35-8:50 UTC: dealing with application OOM-errors. Once these problems were mitigated, the service was restored with some limitations (i.e. slow responses)
10:00 UTC: temporary workarounds used for the emergency relaunch of the service were reverted. The service is fully restored and operational now

Lessons learnt

1) It wasn’t disk resize that caused the incident
The capacity fix was straightforward. The incident started with the state alignment step and the controller recreation.

2) Immutable fields push you toward risky workflows
When the system won’t let you edit a field, the workaround often involves replacement — and that replacement can trigger wide reconciliation behavior.

3) Startup probes and strict readiness are not just “nice to have”
They’re the brakes on a rolling restart. Without them, distributed systems restart in the most fragile way possible. This is the worst part of this incident — having probes would have not allowed Kubernetes to restart the next pod until the current one is really ready.

4) Recovery plans must assume slow cluster healing
Rejoins and replication catch-ups take time. Dependent services need to be designed to degrade gracefully during that window.

What are we going to do?

1) Implement missing startup probes
Simple startup probes like “do not mark the pod as ‘ready’ until the dataset is loaded” will prevent this situation from happening again.

2) Make our own “control plane” for Redis
This is a more complex thing, but it is very helpful in a situation when a restarted pod is “stuck” to an old master IP address.

3) Decrease dependency on this Redis cluster
As of now, it looks like Redis-cluster is the SPOF (single point of failure) for the whole service, so we are planning to migrate some important information to other data sources — like a separate Redis cluster for each server. We also plan to start using Kafka for some of the backend’s components.

இந்த பதிவை பிடித்தீர்களா?
9,332 9332 பயனர் மதிப்புரைகள்
அருமை!

AdGuard VPN Windows க்கு

எந்தவொரு உலாவி அல்லது பயன்பாட்டையும் பயன்படுத்தவும், AdGuard VPN உடன் உங்கள் அநாமதேயத்தைப் பற்றி ஒருபோதும் கவலைப்பட வேண்டாம்.
பதிவிறக்குக
நிரலைப் பதிவிறக்குவதன் மூலம் உரிம ஒப்பந்தம் விதிமுறைகளை ஏற்றுக்கொள்கிறீர்கள்
மேலும் அறிக
செயலில் உள்ள VPN இணைப்புடன் Windows-க்கான AdGuard VPN-இன் முதன்மைத் திரை.
துண்டிக்கப்பட்ட நிலையைக் காட்டும் Windows-க்கான AdGuard VPN-இன் முதன்மைத் திரை.
VPN-ஐப் பயன்படுத்தாத இணையதளங்களின் பட்டியலுடன் கூடிய விலக்குகள் திரை.
9,332 9332 பயனர் மதிப்புரைகள்
அருமை!

AdGuard VPN Mac க்கு

வெறும் இரண்டு கிளிக்குகளில், உலகில் எங்கிருந்தும் ஒரு நகரத்தை தேர்ந்தெடுக்கவும் — எங்களிடம் 75+ இடங்கள் உள்ளன — உங்கள் தரவு விழிப்பான கண்களுக்கு தெரியாது.
பதிவிறக்குக
நிரலைப் பதிவிறக்குவதன் மூலம் உரிம ஒப்பந்தம் விதிமுறைகளை ஏற்றுக்கொள்கிறீர்கள்
மேலும் அறிக
செயலில் உள்ள VPN இணைப்புடன் கூடிய Mac-க்கான AdGuard VPN-இன் முதன்மைத் திரை.
இணைப்பு துண்டிக்கப்பட்ட நிலையைக் காட்டும் Mac-க்கான AdGuard VPN-இன் முதன்மைத் திரை.
VPN-ஐப் பயன்படுத்தாத இணையதளங்களின் பட்டியலுடன் கூடிய விலக்குகள் திரை.
9,332 9332 பயனர் மதிப்புரைகள்
அருமை!

AdGuard VPN Android க்கு

Android-க்கான AdGuard VPN டஜன் கணக்கான வேகமான இருப்பிடங்களை வழங்குகிறது. பயணத்தின்போதும் அதிகத் தனியுரிமையுடன் இணையத்தில் உலாவுங்கள். உள்ளமைந்த டி.என்.எஸ். பாதுகாப்பைப் பயன்படுத்தி விளம்பரங்களையும் டிராக்கர்களையும் தடுக்கவும்
மேலும் அறிக
பதிவிறக்குக
நிரலைப் பதிவிறக்குவதன் மூலம் உரிம ஒப்பந்தம் விதிமுறைகளை ஏற்றுக்கொள்கிறீர்கள்
Google Play
நிரலைப் பதிவிறக்குவதன் மூலம் உரிம ஒப்பந்தம் விதிமுறைகளை ஏற்றுக்கொள்கிறீர்கள்
செயலில் உள்ள VPN இணைப்புடன் Android-க்கான AdGuard VPN-இன் முதன்மைத் திரை.
துண்டிக்கப்பட்ட நிலையைக் காட்டும் Android-க்கான AdGuard VPN-இன் முதன்மைத் திரை.
கிடைக்கக்கூடிய அதிவேகச் சேவையகங்களைக் காட்டும் இருப்பிடங்கள் திரை.
VPN-ஐப் பயன்படுத்தாத இணையதளங்களின் பட்டியலுடன் கூடிய விலக்குகள் திரை.
AdGuard VPN-ஐ நிறுவுவதற்கான QR குறியீடு கொண்ட திரை.
9,332 9332 பயனர் மதிப்புரைகள்
அருமை!

AdGuard VPN iOS க்கு

உங்கள் தனியுரிமையைப் பாதுகாத்து, iOS-க்கான AdGuard VPN மூலம் உங்களுக்குப் பிடித்த நிகழ்ச்சிகளை அநாமதேயமாக ஸ்ட்ரீம் செய்யுங்கள். உள்ளமைக்கப்பட்ட டி.என்.எஸ். பாதுகாப்பு மூலம் விளம்பரங்களைத் தடுக்கவும்
மேலும் அறிக
App Store
நிரலைப் பதிவிறக்குவதன் மூலம் உரிம ஒப்பந்தம் விதிமுறைகளை ஏற்றுக்கொள்கிறீர்கள்
செயலில் உள்ள VPN இணைப்புடன் iOS-க்கான AdGuard VPN-இன் முதன்மைத் திரை.
துண்டிக்கப்பட்ட நிலையைக் காட்டும் iOS-க்கான AdGuard VPN-இன் முதன்மைத் திரை.
கிடைக்கக்கூடிய அதிவேகச் சேவையகங்களைக் காட்டும் இருப்பிடங்கள் திரை.
VPN-ஐப் பயன்படுத்தாத இணையதளங்களின் பட்டியலுடன் கூடிய விலக்குகள் திரை.
AdGuard VPN-ஐ நிறுவுவதற்கான QR குறியீடு கொண்ட திரை.
9,332 9332 பயனர் மதிப்புரைகள்
அருமை!

AdGuard VPN Android TV க்கு

Android TV க்கான AdGuard VPN யை கண்டறியுங்கள்! தடையற்ற ஸ்ட்ரீமிங், மேம்பட்ட பாதுகாப்பு மற்றும் எளிதான ஒழுங்கமைப்பை அனுபவிக்கவும்.
பதிவிறக்குக
நிரலைப் பதிவிறக்குவதன் மூலம் உரிம ஒப்பந்தம் விதிமுறைகளை ஏற்றுக்கொள்கிறீர்கள்
Google Play
நிரலைப் பதிவிறக்குவதன் மூலம் உரிம ஒப்பந்தம் விதிமுறைகளை ஏற்றுக்கொள்கிறீர்கள்
மேலும் அறிக
பின்லாந்தின் ஹெல்சிங்கியில் உள்ள ஒரு சேவையகத்துடன் செயலில் உள்ள VPN இணைப்பைக் கொண்ட Android TV-க்கான AdGuard VPN-இன் முதன்மைத் திரை.
9,332 9332 பயனர் மதிப்புரைகள்
அருமை!

AdGuard VPN Chrome க்கு

AdGuard VPN Edge க்கு

AdGuard VPN Firefox க்கு

AdGuard VPN Opera க்காக

உங்கள் உண்மையான இடத்தை மறைத்து, உலகின் வேறு இடத்தில் இருந்து வெளிப்படுங்கள் — எந்த உள்ளடக்கத்துக்கும் வேகக் கட்டுப்பாடுகளில்லாமல் அணுகவும், உங்கள் web அநாமதேயத்தைப் பாதுகாக்கவும்.
ஒரே கிளிக்கில் வேறொரு இடத்திற்குச் சென்று, உங்கள் IP-ஐ மறைத்து, உங்கள் web உலாவலை பாதுகாப்பானதும் அநாமதேயமானதும் ஆக்குங்கள்.
உங்கள் தனியுரிமையைப் பாதுகாத்து, உங்கள் உண்மையான இடத்தை மறைக்கவும். எந்த இடத்தில் VPN தேவை, எந்த இடத்தில் வேண்டாம் என்பதை நீங்களே தீர்மானிக்கவும்!
உங்கள் Opera உலாவியில் நிஞ்சாவாக இருங்கள்: உலகின் எந்த பகுதியிலும் விரைவாக நகர்ந்து கவனிக்கப்படாமலும் இருங்கள்.
நிறுவு
நிரலைப் பதிவிறக்குவதன் மூலம் உரிம ஒப்பந்தம் விதிமுறைகளை ஏற்றுக்கொள்கிறீர்கள்
மேலும் அறிக
நிறுவு
நிரலைப் பதிவிறக்குவதன் மூலம் உரிம ஒப்பந்தம் விதிமுறைகளை ஏற்றுக்கொள்கிறீர்கள்
மேலும் அறிக
நிறுவு
நிரலைப் பதிவிறக்குவதன் மூலம் உரிம ஒப்பந்தம் விதிமுறைகளை ஏற்றுக்கொள்கிறீர்கள்
மேலும் அறிக
நிறுவு
நிரலைப் பதிவிறக்குவதன் மூலம் உரிம ஒப்பந்தம் விதிமுறைகளை ஏற்றுக்கொள்கிறீர்கள்
மேலும் அறிக
செயலில் உள்ள VPN இணைப்புடன் கூடிய AdGuard VPN உலாவி நீட்டிப்பின் முதன்மைத் திரை.
கிடைக்கக்கூடிய அதிவேகச் சேவையகங்களைக் காட்டும் இருப்பிடங்கள் திரை.
9,332 9332 பயனர் மதிப்புரைகள்
அருமை!

AdGuard VPN ரௌட்டர்களுக்கு

உங்கள் முழு நெட்வொர்க்கையும் பாதுகாக்க உங்கள் ரவுடரில் AdGuard VPN ஐ நிறுவவும். எந்தச் சாதனங்களை எப்போது பாதுகாக்க வேண்டும் என்பதை முடிவுசெய்யுங்கள்
இந்த விருப்பம் AdGuard VPN சந்தாவுடன் மட்டுமே கிடைக்கும்
சாவித் துளை கேடய ஐகானைக் கொண்ட ஒரு திசைவி.
9,332 9332 பயனர் மதிப்புரைகள்
அருமை!

AdGuard VPN Linux க்காக

Linux க்கான சிறந்த இலவச VPN ஐப் பெற்றுக் கொண்டு தண்ணியளவு web உலாவல், மேம்படுத்தப்பட்ட பாதுகாப்பு, இணைய போக்குவரத்து குறியாக்கம் மற்றும் DNS ற் சோர்வு பாதுகாப்பை அனுபவியுங்கள். பல VPN சேவையகங்களில் இருந்து தேர்வு செய்து, நீங்கள் விரும்பும் இருப்பிடங்களை அணுகுங்கள்
AdGuard VPN-இன் சின்னமான டெங்கு, புதர்களில் அமர்ந்திருக்கும் லினக்ஸ் பென்குயினான டக்ஸுடன் உள்ளது.
9,332 9332 பயனர் மதிப்புரைகள்
அருமை!

AdGuard VPN Apple TV க்கான

Apple TV க்காக AdGuard VPN ஐ கண்டறியுங்கள்! தடையற்ற ஸ்ட்ரீமிங், மேம்பட்ட பாதுகாப்பு மற்றும் எளிதான அமைப்பை அனுபவிக்கவும்
இந்த விருப்பம் AdGuard VPN சந்தாவுடன் மட்டுமே கிடைக்கும்
AdGuard VPN லோகோவுடன் கூடிய Apple TV ஸ்ட்ரீமிங் சாதனம்.
9,332 9332 பயனர் மதிப்புரைகள்
அருமை!

AdGuard VPN Xbox க்கு

AdGuard VPN மூலம் உங்கள் Xbox-ஐப் பாதுகாத்து, தடையற்ற ஆன்லைன் கேமிங், மேம்பட்ட பாதுகாப்பு மற்றும் எளிதான அமைப்பை அனுபவிக்கவும்
இந்த விருப்பம் AdGuard VPN சந்தாவுடன் மட்டுமே கிடைக்கும்
AdGuard VPN லோகோவுடன் ஒரு Microsoft Xbox கன்சோலும் கன்ட்ரோலரும்.
9,332 9332 பயனர் மதிப்புரைகள்
அருமை!

AdGuard VPN PS4/PS5 க்காக

உங்கள் பிளேஸ்டேஷனை AdGuard VPN மூலம் பாதுகாத்து, தடையற்ற ஆன்லைன் கேமிங், மேம்பட்ட பாதுகாப்பு மற்றும் எளிதான அமைப்பை அனுபவிக்கவும். பல VPN சேவையகங்களிலிருந்து தேர்வுசெய்து நீங்கள் விரும்பும் இடங்களை அணுகவும்
இந்த அம்சம் AdGuard VPN சந்தாவுடன் மட்டுமே கிடைக்கும்
இந்த விருப்பம் AdGuard VPN சந்தாவுடன் மட்டுமே கிடைக்கும்
AdGuard VPN இலச்சினையுடன் கூடிய Sony PlayStation கன்சோலும் கட்டுப்படுத்தியும்.
9,332 9332 பயனர் மதிப்புரைகள்
அருமை!

Chromecast க்கானAdGuard VPN 

உங்கள் Google TV (Chromecast Gen 4) இல் அல்லது உங்கள் நெட்வொர்க் ரவுடரில் (Chromecast Gen 3) AdGuard VPN ஐ நிறுவி, Chromecast மூலம் உள்ளடக்கங்களை ஸ்ட்ரீம் செய்து ஆன்லைனில் அநாமதேயமாக இருப்பதோடு எந்த இடத்திலிருந்தும் உள்ளடக்கத்தை அணுகுங்கள். Chromecast Gen 3 உடன் இணைக்க, உங்களுக்கு ஒரு AdGuard VPN சந்தா தேவை.
இந்த விருப்பம் AdGuard VPN சந்தாவுடன் மட்டுமே கிடைக்கும்
சாவித்துளை கொண்ட கேடய ஐகானுடன் கூடிய Google Chromecast ஸ்ட்ரீமிங் சாதனம்.
AdGuard VPN
பதிவிறக்கம் தொடங்கியிருக்கிறது
நிறுவலைத் தொடங்க, அம்பு காட்டும் பொத்தானை கிளிக் செய்யவும்.
உங்கள் மொபைல் சாதனத்தில் AdGuard VPN ஐ நிறுவ ஸ்கேன் செய்யவும்
AdGuard VPN-ஐ நிறுவுவதற்கான QR குறியீடு கொண்ட திரை.