Cases2 cases
1 to 2 of 2
IL-0190Cortex distributors kept a stuck connection to a dead etcd leader after a Kubernetes upgrade terminated its node, failing writes to Hosted Prometheus for 12 minutesGrafana Labs2020- Symptoms
About a minute after the etcd leader changed, two replicas of the Cortex distributor started logging "context deadline exceeded" when they tried to read keys from etcd. Writes from some customers that landed on those two replicas failed, while the other distributor replicas kept working, so the service saw an error rate of about 20% on writes to the London region of Hosted Prometheus.
- Trigger
A scheduled Kubernetes version upgrade abruptly terminated the node that ran the etcd leader at 11:19:00 UTC.
- Root cause
- Component
- Contributing factor
- Detection
An SLO-based alert paged the on-call engineer at 11:31, 11 minutes after the errors started. At a 20% error rate the monthly SLA would have taken about 18 hours to breach.
- Remediation
- Restarted the two affected Cortex distributor replicas at 11:32, which stopped the errors
- Action items
- Enable gRPC keepalive probes in the Cortex etcd client (DialKeepAliveTime 10s, DialKeepAliveTimeout, PermitWithoutStream)
- Make the Kubernetes upgrade process terminate pods and machines gracefully, including the etcd pods managed by the etcd operator
- Lessons
When a node dies abruptly, clients holding TCP connections to it are not told; without keepalive probes an etcd client can keep sending requests into a dead connection long after a new leader exists. A failover that works on the server side still needs clients that detect the dead peer. Node replacement during cluster upgrades should drain pods gracefully, including pods owned by operators that the upgrade scripts do not know about, and should give instances enough time to shut down.
IL-0072High etcd write latency made the API servers return stale data, and the production cluster flipped between two views of its stateNordstrom2017- 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.
These 2 cases involve etcd and Ingress controller. 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
Software defect2 cases
- Component
- Contributing factor
- Organisation
IL-0190Cortex distributors kept a stuck connection to a dead etcd leader after a Kubernetes upgrade terminated its node, failing writes to Hosted Prometheus for 12 minutesGrafana Labs2020IL-0072High etcd write latency made the API servers return stale data, and the production cluster flipped between two views of its stateNordstrom2017