Cases5 cases
1 to 5 of 5
IL-0435Error rates rose as Aurora MySQL killed connections and declined queries to avoid OOM while load metrics stayed flatCyberAgent2026- Symptoms
An alert fired one day because an application's error rate had suddenly risen. The error log of the Aurora MySQL RDS instance for that time showed Aurora killing connections and declining queries to avoid running out of memory. The killed queries also made application latency worse.
- Trigger
An application release added a batch job run every minute by a Kubernetes CronJob. Each run's short-lived pod connected to the database from a new pod IP.
- Root cause
- Component
- Contributing factor
- Detection
An alert fired on the application's error rate.
- Remediation
- Set performance_schema to manual management and capped two related Performance Schema parameters, unlimited by default, at 100 in the parameter group, then restarted the RDS instance
- Lessons
When system alerts fire but the database's load metrics look calm, Performance Schema growth is worth suspecting. The two parameters that were capped are unlimited by default, so connections from ever-changing source addresses keep adding to the records. Capping them has a cost: once the cap is exceeded, per-host figures in Performance Insights are missing. Putting RDS Proxy between the application and Aurora MySQL to keep source hosts stable is another possible measure.
IL-0095An engineer deleted the prod namespace of the LEAP JupyterHub while believing the kubeconfig pointed at a new cluster, and the hub was down for about an hour2i2c2025- Symptoms
At 5:00 PM BST on 12 August 2025 a 2i2c engineer declared an incident. While deploying a new cluster called temple and running into NFS issues, the engineer had deleted the prod namespace; the deletion hung, and listing the pods showed many users from a different cluster. The engineer's first message suggested that the kubeconfig had somehow been mutated or corrupted and that some other cluster was being torn down.
- Trigger
While working around a bug in the NFS deployment process for a new hub, an engineer ran a delete of the prod namespace with the kubeconfig context pointing at the LEAP cluster.
- Root cause
- Component
- Contributing factor
- Detection
The engineer who ran the deletion noticed when it hung and the pod list showed users of another cluster, and declared the incident at 5:00 PM BST, before the uptime check on leap.2i2c.cloud failed at 5:32 PM.
- Remediation
- deleted the single remaining user pod in prod so the namespace deletion completed
- killed the nfs-share-creator job that was blocking the deployment
- redeployed the prod hub with the updated NFS server IP address
- deleted the prod ingress during the deployment so that users could not start servers mid-deployment
- Action items
- Write an incident report
- Write a short incident response document for the case "I deleted prod, what next?"
- Upgrade jupyterhub-home-nfs and remove the nfs-share-creator job
- Add opt-in hardening against nested kubeconfig contexts to the deployer system
- Change the engineer's shell configuration to show distinct kubeconfig contexts more clearly
- Lessons
Provisioning persistent storage outside Kubernetes with Terraform meant a deleted namespace cost an hour of downtime and no data. The engineer had no visible cue for which kubeconfig context was active, which turned a workaround on a new cluster into a deletion on a production one. The engineer knew the fix but did not feel confident redeploying without first confirming with the tech lead, in another time zone, that there was no risk of losing persistent data, and reaching the tech lead took time.
- Symptoms
At 05:01 UTC on 9 October 2024 a page fired for GatewayBackendErrorsHigh, elevated 5xx errors from page-analytics_cluster in codfw, followed by a growing number of KubernetesCalicoDown alerts for WikiKube nodes not running the calico-node pod and by MediaWikiMemcachedHighErrorRate. For about an hour uncached MediaWiki requests, such as those of logged-in users, edits and API calls, saw high latency or errors.
- Trigger
An operator used the new mwscript-k8s utility to run a batch of video transcode maintenance, the TimedMediaHandler requeueTranscodes.php script. mwscript-k8s deploys a whole helm release for every script invocation, so the batch created close to 2k Calico NetworkPolicies along with many other resources over several hours.
- Root cause
- Component
- Contributing factor
- Detection
Automated monitoring detected the issue and paged the on-call SRE: GatewayBackendErrorsHigh at 05:01:36 UTC, 16 KubernetesCalicoDown alerts at 05:03:32 UTC and MediaWikiMemcachedHighErrorRate at 05:04:15 UTC.
- Remediation
- Raised the resource limits of the Calico and Typha pods and applied the change with helmfile, which redeployed all Calico pods
- Action items
- Stop mwscript-k8s from creating so many resources
- Lessons
The incident came close to a full outage. Automated monitoring caught it and many responders found the cause, but end users were affected and responders were unsure whether they could switch over to eqiad. The problem was noticed just before the hand-off from Americas to EMEA SRE shifts, a period with a long-known lack of coverage, and it helped that the transcodes were not queued on a Friday evening in the US.
IL-0055A failing CronJob with the default concurrency policy piled up thousands of restarting pods and took down a clusterTarget2018- Symptoms
A Kubernetes cluster went down after one CronJob kept failing and its pods piled up. Because each failed run kept restarting instead of being replaced by the next one, the pods accumulated into the thousands. The speaker's arithmetic for a job scheduled every minute that fails for three days is 4,320 restarting pods.
- Trigger
A CronJob kept failing.
- Root cause
- Component
- Contributing factor
- Lessons
When deploying a CronJob, set its concurrency policy to Replace or Forbid; with the default, failing runs accumulate and restart together. An application should handle a missing dependency with probes and bounded back-off rather than crash in a loop, which also keeps it from hammering a dependency that is already struggling.
IL-0036A reindex Job that kept failing exhausted one node after another until the whole cluster was downUniverse2017- Symptoms
Shortly after a search reindex job was started, problems with the Kubernetes cluster hit Universe's reporting and search APIs and the Kubernetes cluster UI itself. The status page opened an investigation into reports of search and reporting being unavailable at 14:37 EDT on 2017-07-21.
- Trigger
A change to the search index definition, which removed some fields from full-text indexing, was shipped, and a reindex job was started as a Kubernetes Job to apply it.
- Root cause
- Component
- Contributing factor
- Detection
The team saw problems with the Kubernetes cluster shortly after starting the job, and the status page cites reports of search and reporting being unavailable.
- Remediation
- removed the reindex Job from the scheduler
- let the nodes auto-heal back to healthy
- Lessons
restartPolicy: Never on the pod template does not stop a Kubernetes Job from retrying: a Job replaces failed pods and may run more than once, so a job that can exhaust a node will keep moving to new nodes.
These 5 cases involve Jobs and CronJobs and Calico. 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 cause3
Capacity exhaustion3 cases
- Contributing factor
- Organisation
IL-0435Error rates rose as Aurora MySQL killed connections and declined queries to avoid OOM while load metrics stayed flatCyberAgent2026IL-0232Calico pods in the codfw WikiKube cluster hit their resource limits and crash-looped, taking nodes out one by oneIL-0036A reindex Job that kept failing exhausted one node after another until the whole cluster was downUniverse2017
Operator error1 case
- Contributing factor
- Organisation
Configuration change1 case
- Component
- Contributing factor
- Organisation