Incident Library
Applied filters Root causeSoftware defectComponentKubernetes API serverClear allEvery case under the filters, with no sentence; newest first.
Suggested filters Search, and the values found in your words appear here.

Graph

  • Root cause
  • Component
  • Symptom
  • Contributing factor
  • Case

Cases5 cases

1 to 5 of 5

  1. Symptoms

    Every service in the homelab Kubernetes cluster stopped answering: the V-Rising server, Grafana, Jellyfin and Linkding were all unreachable, and the Kubernetes API was down, so the cluster could not be managed at all. The outage was found by hand, about 3 hours after it began, when someone tried to use the services.

    Trigger

    A power outage forced the Kubernetes master node to reboot.

    Root cause
    Component
    Contributing factor
    Detection

    Manually, when someone tried to access the services; there were no automated alerts.

    Remediation
    • Connected a monitor to the master node and read the boot logs, which showed the kernel panic
    • Booted the previous kernel version, which brought the system back
    • Removed the broken Nvidia packages with sudo apt-get remove --purge '^nvidia-.*' and ran sudo dpkg --configure -a
    • Found remaining broken packages with dpkg -l | grep -v ^ii and removed them by hand
    • Ran sudo apt-get install -f and reinstalled linux-headers-$(uname -r)
    • Rebooted and confirmed the kernel panic was gone
    Action items
    • Make sure GPU driver installations fully succeed, or revert immediately when they fail
    • Move the cluster to a high-availability control plane
    • Expose the Kubernetes API through a load balancer in the HA setup
    • Set up a ticketing system to record incidents and their resolution
    • Write predefined troubleshooting workflows to shorten response time
    • Add infrastructure monitoring such as Prometheus and Grafana
    • Add blackbox HTTP and TCP checks from outside the cluster for critical services
    Lessons

    A driver installation that fails half-way can leave kernel packages broken without any visible effect until the next reboot, which may come weeks later and at the worst time. A failed DKMS build should be fixed or reverted at once. With a single master node and no monitoring from outside the cluster, one unbootable machine meant a total outage that nobody was told about; the fix itself was simple once the boot logs were seen.

  2. Symptoms

    A production EKS cluster on Kubernetes 1.30 went into read-only mode: the API server rejected every request that would change an object, such as creating pods or scaling deployments, and deleting objects to free space did not work either.

    Trigger

    Kyverno 1.12 kept creating ephemeralreports objects that piled up in etcd until the database passed EKS's size limit.

    Root cause
    Component
    Contributing factor
    Detection

    The cluster rejected writes; the audit logs carried the "etcdserver: mvcc: database space exceeded" error.

    Remediation
    • AWS raised the etcd storage limit from 8/10GB to 12GB to unlock writes
    • an AWS engineer deleted the leaked Kyverno ephemeralreports objects directly from etcd
    Action items
    • Monitor the etcd database size with apiserver_storage_size_bytes and never let it reach 8GB
    • Upgrade Kyverno 1.12 to 1.12.4, which fixes the ephemeralreports pile-up, or disable reporting for admission events and tune --aggregationWorkers
    Lessons

    On EKS, once etcd hits its size limit the cluster becomes read-only and only AWS can clean it up, so cleanup scripts must run before the limit is reached. Watch the etcd database size and object counts per resource, especially for controllers that create report objects.

  3. Symptoms

    Fewer than 20% of the nodes in one Zalando cluster were available. Most nodes reported NotReady at the same moment, and only a handful stayed Ready.

    Root cause
    Component
    Contributing factor
    Remediation
    • none; the nodes recovered on their own after about 15 minutes
  4. Symptoms

    A user reported that pods were starting up and then vanishing. When the cluster operators looked, kubectl get pods and kubectl get nodes returned two different sets of data that alternated back and forth, as if there were two opinions of the cluster's state.

    Trigger

    etcd write latency rose far above the healthy single-digit milliseconds; the speakers say trouble starts once the database sync time crosses double digits or several hundred milliseconds.

    Root cause
    Component
    Contributing factor
    Detection

    A user reported pods starting up and vanishing.

    Remediation
    • restored service on a replacement cluster
    • freed persistent volumes from the old cluster one by one so they could bind in the new cluster
    • updated DNS records that pointed at the old cluster's load balancer names
    Action items
    • Make the Kubernetes API server request quorum reads from etcd
    Lessons

    etcd is extremely sensitive to write latency; once the database sync time crosses double digits of milliseconds, stale reads or badly degraded performance follow. Without quorum reads, a consistent store can still hand out stale data. Documentation for a fast-moving system changes, so read it again regularly. Moving workloads to a new cluster is hard when they hold persistent volumes or when DNS records point at generated load balancer names.

  5. Symptoms

    At 14:10 an engineer deployed a change to a service that Monzo's current account needs to process payments, and every request to that service started to fail. Current account customers saw payment failures; the prepaid card was not affected at first because it does not use that service. The change was rolled back at 14:12, but the errors continued.

    Trigger

    At 14:10 an engineer deployed a change to a service needed to process current account payments. Two weeks earlier the etcd cluster had been upgraded and grown from three to nine nodes, and one day earlier another team had scaled a new service down to zero replicas while leaving its Kubernetes service in place.

    Root cause
    Component
    Contributing factor
    Detection

    Payment failures began right after the 14:10 deploy. The team rolled back at 14:12 and declared an outage internally at 14:16. At 15:13, when no service could serve requests, practically all automated alerts fired.

    Remediation
    • Rolled back the payments service change (the errors continued)
    • Activated internal backup processes so most customers could still use their card
    • Restarted all linkerd instances (this made the outage worse)
    • Restarted the three Kubernetes API server processes so replacement linkerd instances could start
    • Began deploying a newer linkerd version with the fix for empty services
    • Deleted the Kubernetes service that had no endpoints, which let linkerd load service discovery again
    Action items
    • Fix the bug in Kubernetes that can trigger timeouts after a cluster reconfiguration
    • Roll out a new version of linkerd that fixes the parsing error
    • Create better health checks, dashboards and alerts for the affected components so they give clearer signals about what is wrong and prevent human error
    • Improve procedures to communicate outages internally and externally as clearly and quickly as possible
    Lessons

    A large failure in a distributed system can be very hard to understand, and well-meant human action can compound it, as restarting every linkerd instance did here by exposing a second incompatibility. Because Monzo deploys often and its network changes constantly, the deployment and request-routing systems have to be trustworthy. Monzo committed to publishing a similar post-mortem for any incident of this severity.

Check your cluster for this

These 5 cases involve Kubernetes API server 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 cause1