Cases2 cases
1 to 2 of 2
IL-0191A label selector accidentally added to the Loki distributor Service matched only the new pods of a rollout, which took all write traffic, were OOM-killed and stalled the rolloutGrafana Labs2022- Symptoms
During a rollout of the Grafana Loki distributor Deployment in one Grafana Cloud Logs environment, the write path went down for about 25 minutes. The newly started distributor pods were OOM-killed over and over, never passed their health and readiness checks, and the rollout stopped making progress.
- Trigger
Step 1 of moving the Loki ring off a separately deployed key-value store onto embedded memberlist added a new label, gossip_ring_member: 'true', to the distributor pods and Service, together with a small config change, and the change required a rollout of the distributors.
- Root cause
- Component
- Contributing factor
- Detection
The first clue was kubectl get pods and the kube_deployment_status_replicas_updated metric showing that only 16 of 140 distributor pods had been updated.
- Remediation
- scaled the distributor Deployment out horizontally so the load spread over more pods with the new label and the rollout could continue
- reverted the migration step to end the outage
- set service_ignored_labels:: [$._config.gossip_member_label] and passed it to k.util.serviceFor so the label is no longer copied into the Service selector
- Action items
- Update the function that generates a Service from a Deployment or StatefulSet to handle edge cases, including this one
- Lessons
A Service whose selector is built by copying every label of a workload changes which pods it matches as soon as a new label is added. During a rollout it then matches only the new pods, which receive all the traffic before there are enough of them. A few errors during a rollout in other environments hid the problem, because those environments gave distributors more memory and could absorb the shift. Manifest diffs kept for every pull request made it possible to see that the Service selector had changed.
IL-0004A new default pod priority let a new Cortex cluster preempt every production ingester in a cascade, taking Grafana Cloud Hosted Prometheus downGrafana Labs2019- Symptoms
On Friday 19 July 2019 the Grafana Cloud Hosted Prometheus service, which is built on the Cortex project, was down for 26 minutes. New error-budget-based Prometheus alerts paged the on-call engineer within 4 minutes of the start.
- Trigger
An engineer created a new dedicated Cortex cluster for a large customer. Its configuration did not include the new pod priorities, so all its pods got the default medium priority, and the Kubernetes cluster did not have enough free resources to fit it.
- Root cause
- Component
- Contributing factor
- Detection
New error-budget-based Prometheus alerts paged the on-call engineer within 4 minutes of the start of the outage.
- Remediation
- Scaled up the underlying Kubernetes cluster to fit both the new and the production Cortex clusters
- Diagnosed and fixed the out-of-memory errors in the authenticating reverse proxies in front of Cortex
- Action items
- Give the production ingesters the high priority class, which should have been done before medium became the default
- Have more people review changes to configuration that is global to the cluster
- Require a design document for every configuration change outside a namespace
- Automate the sizing of the frontend authenticating reverse proxy so it does not run out of memory under overload
- Investigate the default backoff and scaling behaviour of Prometheus to prevent a stampeding herd of retries
- Lessons
Medium should not have become the default priority until the production ingesters had the high priority, and that designation should have reached production sooner. The change was considered too minor for a design document and was only discussed in a GitHub issue; cluster-global configuration needs more scrutiny. On the positive side, once Cortex had enough capacity it recovered by itself, and Grafana Loki helped confirm that the ingesters exited gracefully.
These 2 cases involve Configuration templating and Container memory limit. 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
Configuration change2 cases
- Component
- Contributing factor
- Organisation
IL-0191A label selector accidentally added to the Loki distributor Service matched only the new pods of a rollout, which took all write traffic, were OOM-killed and stalled the rolloutGrafana Labs2022IL-0004A new default pod priority let a new Cortex cluster preempt every production ingester in a cascade, taking Grafana Cloud Hosted Prometheus downGrafana Labs2019