Cases2 cases
1 to 2 of 2
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.
IL-0003linkerd lost Kubernetes service discovery after an etcd reconfiguration, and restarting every linkerd instance turned failed payments into a full platform outageMonzo2017- 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.
These 2 cases involve etcd and Kubernetes API server. 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
unknown1 case
- Component
- Contributing factor
- Organisation
Software defect1 case
- Contributing factor
- Organisation