Cases4 cases
1 to 4 of 4
IL-0102CoreDNS pods on a production EKS cluster ran out of memory under a burst of new pods, endpoints and nodes, taking down the Buildkite web UI, APIs and job dispatchBuildkite2026- Symptoms
From 22:47 UTC on 25 August 2026 the Buildkite web interface, REST API, Agent API, job queue and notifications stopped working for every customer. No one could create a build from the UI or the REST API, job dispatch was delayed, and some builds that were already running when the outage began stayed stuck until the services recovered.
- Trigger
At 22:44 UTC an application deploy created a surge of new pods, which used up the free capacity on the existing nodes and made the EKS cluster scale out. Background worker pools with unusually high maximum replica counts were scaling out at the same time and kept asking for more pods while new nodes were still being provisioned. Together they produced an unusually high rate of change in applications, network endpoints and nodes, and with it a sudden rise in demand on CoreDNS.
- Root cause
- Component
- Contributing factor
- Detection
The first status post, at 22:55 UTC, eight minutes after the outage began, said something had gone wrong, and at 23:05 UTC the status page said a sitewide outage was being investigated. CoreDNS query duration had been rising as the cluster grew, but a defect in a key monitoring query and too little monitoring of query volume meant this went unnoticed before the outage.
- Remediation
- paused further application deploys
- scaled CoreDNS from three to twelve pods
- raised each CoreDNS pod's memory limit from 512 MiB to 2 GiB
- expanded the system node pool that runs CoreDNS
- Action items
- Increase immediate CoreDNS headroom: twelve pods instead of three, a 2 GiB memory limit instead of 512 MiB, and a larger system node pool
- Enable EKS-managed CoreDNS autoscaling with a tested minimum replica count and enough capacity to spread the replicas across nodes and availability zones
- Add direct alerts on CoreDNS query duration, query volume, goroutine growth, memory pressure, OOM restarts and available replicas, and track longer-term trends in capacity planning
- Find other cluster-critical services that lack tested capacity, direct alerting, spread across failure domains, and either safe autoscaling or documented static headroom, and fix them
- Lessons
A CoreDNS deployment sized once and left at a fixed size can carry a growing cluster for months and then fail on the first burst of churn it cannot absorb. When query processing slows, pending queries take up memory, the pods hit their limits and restart, and client retries keep the service down after the restart. Server-side DNS query duration and volume need their own alerts: here client-side latency was masked by unrelated application speed-ups, and a broken monitoring query hid the server-side trend. Maximum replica counts raised as a temporary measure remove the cap that normally stops runaway scaling when new nodes are slow to arrive.
IL-0470Buildkite notifications were delayed after Prometheus storage filled and EKS notification workers could not autoscaleBuildkite2026- Symptoms
From 20:01 UTC on 28 May 2026, Buildkite build and job notifications (GitHub commit status, email, Slack and webhook notifications) reached a subset of customers late. Internal queue latency monitoring showed the delay as queues grew while notification-processing workers stayed underprovisioned.
- Trigger
The Prometheus service used by Buildkite's EKS autoscaling path ran out of storage, so some EKS-based notification workers could not autoscale while their queues were growing.
- Root cause
- Component
- Contributing factor
- Detection
Internal queue latency monitoring detected the rising notification delivery latency.
- Remediation
- Moved the affected notification-processing workloads from EKS back to the ECS-based infrastructure
- Adjusted scaling configuration and worker counts by hand
- Completed the rollback and scaled the remaining affected ECS services
- Increased Prometheus storage capacity and recorded the change in infrastructure as code
- Action items
- Alert before Prometheus storage exhaustion can affect autoscaling
- Fix GitHub notification retry behaviour for a class of errors that could cause repeated retries
- Make the EKS-to-ECS rollback verify destination capacity, autoscaling configuration and traffic movement
- Review the CPU, memory and storage allocations of EKS control-plane dependencies such as KEDA and Karpenter
- Move customer-critical workloads to EKS more gradually, with clearer settling periods
- Improve customer-level monitoring of notification delivery latency to detect customer-impacting regressions earlier
- Review which notification types sit on customers' scheduling or CI hot path and need tighter latency, separate queueing or specific alerting
- Update the status page earlier when notification latency is likely to affect customer workflows
- Describe the customer-visible impact in status page updates, not only the affected internal service
- Improve internal escalation for customers who report critical CI impact
- Lessons
Buildkite said recovery took longer than expected because the rollback path from EKS to ECS did not fully handle this failure, and that its public status page did not show the customer-visible impact as quickly or clearly as it should have, since notification latency affects customers differently depending on how their CI and deployment workflows use notifications.
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-0182Too few CoreDNS replicas on EKS were overloaded during traffic spikes, raising latency and cutting the network for task pods, and the over-provisioned, tightly spread CoreDNS pods added later blocked Karpenter consolidation이언철2024- Symptoms
When traffic changed sharply, CoreDNS came under heavy load, and the cluster saw network problems and a sudden rise in latency. The horizontal pod autoscaler then added pods, database connections surged, and the impact spread to the whole service.
- Trigger
Sharp changes in traffic loaded the small number of CoreDNS pods beyond what they could handle.
- Root cause
- Component
- Contributing factor
- Remediation
- Set up the Cluster Proportional Autoscaler for CoreDNS with nodesPerReplica and coresPerReplica chosen for the instance types in use
- Spread CoreDNS with soft topologySpreadConstraints (ScheduleAnyway) instead of anti-affinity so Karpenter could consolidate nodes
- Added alert thresholds on CoreDNS error rate, panics, request duration and request rate
- Deployed NodeLocal DNSCache so each node answers DNS from a local cache and forwards misses to the main CoreDNS
- Lessons
A fixed, small number of CoreDNS pods cannot follow a cluster whose nodes and pods change quickly with traffic, and the damage spreads: DNS latency triggers autoscaling, which in turn floods the database with connections. Simply adding many CoreDNS replicas created a different problem, because with tainted nodes and a maxSkew: 1 spread constraint the pods piled onto a few nodes and blocked Karpenter consolidation. Scaling CoreDNS in proportion to the cluster and putting a DNS cache on every node handled both.
These 4 cases involve CoreDNS and Horizontal pod autoscaler. 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 exhaustion4 cases
- Component
- Contributing factor
- Organisation
IL-0102CoreDNS pods on a production EKS cluster ran out of memory under a burst of new pods, endpoints and nodes, taking down the Buildkite web UI, APIs and job dispatchBuildkite2026IL-0470Buildkite notifications were delayed after Prometheus storage filled and EKS notification workers could not autoscaleBuildkite2026IL-0548Buildkite's EKS Prometheus server was killed for memory again and again, so services stopped scaling and jobs laggedBuildkite2026IL-0182Too few CoreDNS replicas on EKS were overloaded during traffic spikes, raising latency and cutting the network for task pods, and the over-provisioned, tightly spread CoreDNS pods added later blocked Karpenter consolidation이언철2024