Cases2 cases
1 to 2 of 2
IL-0063VPN outage after recreating a Redis StatefulSet restarted the whole Redis cluster without readiness checksAdGuard VPN2025- Symptoms
The day began with an alert that several instances of the Redis cluster were running out of disk space. That part was fixed quickly. The outage came an hour later: right after the Redis StatefulSet was deleted and recreated at 8:10 UTC, Kubernetes restarted every Redis pod within about five minutes, and problems started to appear.
- Trigger
To make Git match the volumes that had been resized by hand, the Redis StatefulSet was deleted with orphan (non-cascading) deletion and recreated with the new storage template; Kubernetes reconciled the new spec by restarting the entire Redis cluster.
- Root cause
- Component
- Contributing factor
- Detection
An alert about Redis instances running out of disk space started the work; the outage itself showed up as backend errors about Redis connections right after the StatefulSet was recreated.
- Remediation
- made the Redis masters forget obsolete node identities, reset the affected replicas and rejoined them, then waited for replication to catch up
- identified the component that was actually running out of memory, scaled the backend service and raised memory limits for that component
- temporarily relaxed probes so backend instances took traffic immediately instead of flapping between ready and not ready
- reverted the temporary workarounds at 10:00 UTC
- Action items
- Add startup probes so a Redis pod is not marked ready until its dataset is loaded
- Build an own control plane for Redis that handles restarted pods stuck to an old master address
- Reduce dependence on the single Redis cluster: move some important data to other stores, such as a separate Redis cluster per server, and use Kafka for some backend components
- Lessons
The disk resize was not the problem; the cleanup afterwards was. An immutable field pushes operators toward deleting and recreating the controller, and that can set off a full reconcile. Startup and readiness probes are what slow a rolling restart down to a safe pace; without them a distributed store restarts in the most fragile way. Recovery plans must expect a cluster to heal slowly, and dependent services need to degrade gracefully while it does.
IL-0059Single-master Kubernetes control plane kept dying because the kubelet restarted a healthy etcd on a failing kubeadm liveness probeNRE Labs2018- Symptoms
The daily NRE Labs statistics showed lesson activity collapsing, and kubectl could not reach the cluster: `The connection to the server 1.2.3.4:6443 was refused - did you specify the right host or port?`
- Trigger
Unknown. The liveness probe that kubeadm writes into the etcd static pod manifest (an `etcdctl get foo` against 127.0.0.1:2379, failureThreshold 8, timeoutSeconds 15) started failing. The author first suspected GCP maintenance the night before, but could not reproduce the probe failure by hand and does not know why it began.
- Root cause
- Component
- Contributing factor
- Detection
The author saw lesson activity drop in the daily NRE Labs statistics during his morning routine.
- Remediation
- removed the liveness probe section from the kubeadm-generated etcd static pod manifest and applied it between etcd restarts
- Action items
- Add monitoring, especially for the single-node master
- Run a basic "down for maintenance" page in Google Cloud Functions that points to Twitter for updates, to redirect to during outages
- Lessons
Because all of the infrastructure is managed as code, the cluster could be rebuilt quickly, but destroying it before finding the cause also destroyed the evidence. Monitoring matters, especially with a single-node master. Read the restart counts in kubectl output, not just the Running status. Remember the fundamentals instead of expecting the issue to be more complicated than it is, and do not let the urgency of an outage push you into hasty decisions. Put up a maintenance page instead of leaving the site failing halfway.
These 2 cases involve In-memory cache and etcd. kubegap audits a Kubernetes cluster for gaps like these, read-only, from Claude Code or Codex; its checks cite public reports like the ones in this library.
By root cause2
Configuration change1 case
- Contributing factor
- Organisation
unknown1 case
- Component
- Contributing factor
- Organisation