Cases3 cases
1 to 3 of 3
IL-0548Buildkite's EKS Prometheus server was killed for memory again and again, so services stopped scaling and jobs laggedBuildkite2026- Symptoms
On 20 May 2026 a subset of Buildkite customers saw delays in notification delivery, build dispatch and the metrics services. The status page first reported delays to notifications for all customers and later narrowed it to a subset of customers.
- Trigger
Autoscaling during Buildkite's migration of production services from AWS Fargate to AWS EKS raised the number of pods that Prometheus tracked, and with it the memory the Prometheus server needed.
- Root cause
- Component
- Contributing factor
- Remediation
- Moved the load of the affected services back to AWS Fargate by following prepared documentation
- Scaled up the services of a few customers with very large backlogs further by hand
- Action items
- Upsize the underlying system nodes
- Set higher requests and limits for the Prometheus server so it can handle more load
- Review all new EKS resources and set any missing requests and limits
- Add observability and monitors for EKS pod and node health
IL-0099User servers on 2i2c's Earthscope hub took over 15 minutes to start and kernels were killed during a workshop, because a profile option guaranteed 8 GB of memory with no limit on 32 GB nodes2i2c2025- Symptoms
On 12 May 2025 at 20:15 EEST a Freshdesk ticket reported that users' servers on the Earthscope hub were taking more than 15 minutes to start and that their kernels were being killed. It happened during a workshop and also affected other instructors using the hub; a second report said a short course of about 30 users was having major problems.
- Trigger
A workshop with about 30 users on a profile option that guaranteed 8 GB of memory and set no memory limit on 32 GB nodes.
- Root cause
- Component
- Contributing factor
- Detection
A Freshdesk support ticket from the community at 20:15 EEST, brought to the team's attention in the #support-freshdesk Slack channel at 20:49.
- Remediation
- ran a helm rollout and hub redeploy, which partly improved server starts
- made the 'medium' profile available and raised its memory guarantee to reduce overcommitment
- pre-warmed the cluster with 15 nodes for the 30-user workshop
- set explicit memory limits, with the guarantee equal to the limit, on the community's small-node profile options (https://github.com/2i2c-org/infrastructure/pull/6047)
- Action items
- Write an incident report
- Hold an internal retrospective about the incident (https://github.com/2i2c-org/meta/issues/2194)
- Lessons
A memory guarantee without a limit lets a user server grow into memory that other pods on the same node were counting on, and on a shared node that ends with users' pods evicting each other. Setting the guarantee equal to the limit removes the overcommitment. For a known workshop, pre-warming enough nodes ahead of time keeps server start times short.
IL-0094Student pods filled the shared nodes of a JupyterHub cluster and starved the hub's core pods, freezing the hub2i2c2020- Symptoms
At 08:52 PM IST a report came in from WER that many students could not access the JupyterHub and that it was frozen; pages were stuck and nothing was usable. A rise in activity was visible by 09:02 PM, but the usual fixes, such as opening an incognito window and restarting servers, did not help.
- Trigger
WER students' pods used a good chunk of their memory limit (tests had shown they almost always use just under 1G of their 2G limit, against a 512M guarantee) on nodes shared with the hub's core pods.
- Root cause
- Component
- Contributing factor
- Detection
WER reported stuck pages and students unable to reach the hub in a GitHub issue (2i2c-org/docs#27).
- Remediation
- removed memory overcommit for the WER students
- raised resource guarantees for all core pods, which restarted them and moved some to a new node
- Action items
- Put user pods in a separate pool so they do not create pressure on the core pods (infrastructure#89)
- Set limits on the support infrastructure (Prometheus, Grafana, ingress) as well (infrastructure#90)
- Document and think about overcommit ratios for memory usage (infrastructure#91)
- Set up better Grafana dashboards to monitor resource usage (infrastructure#92)
- Document how people can get kubectl access to the cluster so others can look into issues too (infrastructure#87)
- Lessons
Core pods without resource guarantees get whatever is left on a node, so when user pods on the same nodes fill the CPU and memory, the hub that serves everyone freezes. The memory overcommit ratio has to come from measured use: WER students used just under 1G against a 512M guarantee, which a 4x overcommit could not hold.
These 3 cases involve Container memory limit and Node pool. 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
Capacity exhaustion3 cases
- Contributing factor
- Organisation
IL-0548Buildkite's EKS Prometheus server was killed for memory again and again, so services stopped scaling and jobs laggedBuildkite2026IL-0099User servers on 2i2c's Earthscope hub took over 15 minutes to start and kernels were killed during a workshop, because a profile option guaranteed 8 GB of memory with no limit on 32 GB nodes2i2c2025IL-0094Student pods filled the shared nodes of a JupyterHub cluster and starved the hub's core pods, freezing the hub2i2c2020