Incident Library
  • Root cause
  • Component
  • Symptom
  • Contributing factor
  • Case

Cases21 cases

1 to 5 of 21

  1. Symptoms

    From 15:05 UTC on 6 August 2026 GitHub Actions workflow runs failed to start, failed partway through or stayed queued for a long time, on both GitHub-hosted and self-hosted runners. Some requests to the Actions REST API returned errors, and some customers saw unexpected rate limiting in their workflows.

    Trigger

    A routine deployment to an internal Actions service that processes events and generates Actions jobs replaced pods, and the remaining capacity became saturated.

    Root cause
    Component
    Contributing factor
    Remediation
    • Expanded capacity of the affected services
    • Throttled incoming webhook-triggered work
    • Increased processing capacity for the backlog of affected events
    • Deployed changes that stopped runners from repeatedly trying to acquire invalid jobs
    • Deployed a fix for self-hosted runners that were not picking up jobs and enabled it incrementally
    • Paused migrations with GitHub Enterprise Importer
    • Restored webhook-triggered Actions workflows to full throughput
    • Rolled back the mitigation that left some ARC runners offline, and recovered those runners by hand
    • Shared CLI and UI steps for customers to clear jobs that could not be retried or canceled
    Action items
    • Improve deployment and capacity safeguards for the affected services
    • Strengthen monitoring for the conditions that preceded the incident
    • Improve the resiliency and recovery of queued work and runner assignment
    • Add automatic recovery for self-hosted runners in upcoming Runner and ARC releases
    • Reduce the risk of cascading failures and speed up recovery during large Actions disruptions
  2. 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.

  3. Symptoms

    On 4 March 2026 customers of the IONOS Container Registry got 504 Gateway Timeout errors when pushing or pulling container images, and deployments that relied on the registry were blocked. The status page first reported an increased error count on the registry at 09:23 UTC, saying customers might be unable to pull images.

    Trigger

    A migration combined with a temporary capacity constraint placed two critical control plane components on the same proxy instance, despite anti-affinity rules; the shared proxy then reached its concurrent connection limit.

    Root cause
    Component
    Contributing factor
    Remediation
    • Rolled back a component of the Kubernetes control plane to an earlier version
    • Provisioned additional proxy capacity
    • Moved the affected control plane components onto separate proxy instances
    Action items
    • Redesign registry-to-API connectivity so each node uses its own local proxy
    • Adjust alert thresholds to warn before proxy connection use approaches capacity
    • Deploy more infrastructure clusters and redistribute registries so no cluster exceeds safe capacity, with automation that keeps balancing load
  4. Symptoms

    On 21 October 2025 at 21:45 UTC a change to timeout handling was deployed to the feature flags service, and two minutes later automated monitoring reported higher error rates. The change was rolled back by 21:49, but error rates stayed high: about 38% of flag evaluation requests in the US datacenter returned errors. At 22:30 Redis metrics showed memory exhaustion on ElastiCache, at 22:35 Postgres connections spiked, and at 22:45 the team found a massive data transfer from Postgres into Redis. The main PostHog application was affected as well, because it shares the Redis instance with the flags service.

    Trigger

    On 21 October a deployment meant to reduce timeout errors (PR #39821); on 24 October the deployment of IP-based rate limiting (PR #40074) that saw all traffic as coming from the load balancer's IP; on 28 October an unrelated routine deployment that rolled the feature flag pods in the US region.

    Root cause
    Component
    Contributing factor
    Detection

    On 21 October automated monitoring detected higher error rates two minutes after the deploy. On 24 October no alert existed for 429 errors, and the team learned of the incident from customer reports that began at 18:10 UTC, a 62-minute detection delay. On 28 October on-call received a high error count alert. On 29 October the incident was reported with higher error rates and latency. No alert existed for CPU pressure, so the CPU saturation behind all three incidents was not seen directly.

    Remediation
    • rolled back the timeout handling change within 2 minutes on 21 October, which did not stop the errors
    • throttled connections and Redis writes on 21 October
    • halted the rollout on 28 October, scaled the US flags pods to zero until Redis recovered, then scaled them back gradually
    • rolled back hardware changes on 30 October at 00:03 UTC, which removed most errors but not the latency
    • increased the pod resource requests and adjusted the Kubernetes fleet size so fewer pods ran on each node
    • added retry limits to Envoy between the load balancer and the service
    • moved database connection timeouts and other critical settings to runtime configuration and raised the timeout values
    • added per-node and per-pod CPU alerts at 80% sustained for 5 minutes that page on-call
    Action items
    • Form a strike team from the flags, ingestion and infrastructure teams to review the application and infrastructure for remaining bottlenecks
    • Investigate separating the flags Redis instance from the application Redis instance
    • Before re-enabling ArgoCD sync, align the flags service chart configuration with the values in ArgoCD and define the deployment and Redis strategy
    • Make the feature flags team hard code-owners for flags-related code
    • Build a dashboard of key flag metrics with runbook links and update the feature flag runbooks
    • Add missing alerts on existing service and infrastructure metrics
    • Make readiness checks validate dependencies that degrade under load, for example by pinging the database
    • Rate-limit cache population so it cannot overwhelm Redis
    • Monitor connection pools with automatic throttling near exhaustion and limit concurrent connections
    • Build a production-scale load testing framework
    • Build progressive rollout infrastructure to limit blast radius
    • Document Postgres-to-Redis data flows and write runbooks for data transfer storms
    Lessons

    Nodes that are small relative to pod requests let the scheduler pack many pods on each node, and the resulting CPU saturation showed up three different ways: excessive parallelism, connection pool exhaustion and slow queries. Treating each symptom separately let the problem return; right-sizing the pods and nodes fixed all three. CPU must be alerted on from the start. Unbounded Envoy retries and unbounded cache population amplified the overload, and a Redis instance shared with the main application spread a flags problem to the main application. A rollback did not end the incident, because the data transfer and resource exhaustion it had started kept running.

  5. Symptoms

    In Microsoft's cloud LLM inference service, the inference engines themselves failed in 94 of the 156 high-severity incidents from April to June 2025 (≈60%). Requests timed out or ran into resource exhaustion under load, and callers got HTTP 408, 429 and 5xx errors.

    Trigger

    Bursty load, traffic with unusually high sampling parameters and long-running requests pushed the inference engines into resource exhaustion and timeouts.

    Root cause
    Component
    Contributing factor
    Detection

    Across the 156 incidents, 115 (≈74%) were auto-detected, meaning health probes or DRI pipelines alerted before customers reported the problem; the others were not.

    Remediation
    • Enabled dynamic pushback at the load balancer with caps on pending tokens and requests
    • Tuned request batching and GPU/CPU replica counts
    • Improved gRPC backoff and error mapping
    • Limited sampling parameters and throttled per client
    • Enabled streaming, tuned request batching and capped pending tokens against engine connection timeouts on long-running requests
    • Increased capacity, routed traffic to healthy endpoints and restarted nodes, the actions applied mostly to inference engine failures
    Action items
    • Optimise serving for long-running requests and high sampling regimes, with connection liveness and GPU capacity-aware routing as the main levers
    • Expand health-probe-driven failover and GPU capacity-aware routing so traffic moves off degraded endpoints on its own
    • Forecast token and throughput growth and automate capacity increase decisions
    • Deploy adaptive alerting and expand engine-level telemetry to close detection gaps
    Lessons

    Hotfixes restore correctness but lengthen time to mitigate, while traffic routing and node rebalancing mitigate faster under overload and timeout patterns. Even with AIOps tooling a meaningful share of incidents still needs manual detection or judgement, so health-probe-driven traffic routing, restarts and capacity increases are the decisions to automate first.

Check your cluster for this

These 21 cases involve Database and CoreDNS. 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 exhaustion21 cases

  1. IL-0471 GitHub Actions runs failed or sat queued for 9 hours after a routine deployment's pod replacement saturated capacity
    GitHub2026
  2. IL-0435 Error rates rose as Aurora MySQL killed connections and declined queries to avoid OOM while load metrics stayed flat
  3. IL-0465 IONOS Container Registry image pushes and pulls failed with 504 Gateway Timeout
  4. IL-0100 PostHog's feature flags pods were packed onto Kubernetes nodes that were too small for their CPU requests, and CPU saturation above 90% caused three outages in ten days through Redis overload, connection pool exhaustion and slow queries
  5. IL-0413 LLM inference engines timed out or ran out of resources under load in about 60% of 156 severe incidents at Microsoft
  6. IL-0082 Losing one CoreDNS pod during a planned EKS node reroll overloaded the remaining CoreDNS pods, causing DNS timeouts and errors across multiple services at RebelMouse
  7. IL-0204 An etcd memory spike overloaded the control plane of a Render Frankfurt cluster, and DNS then failed because CoreDNS ran on the rebooted control plane nodes and could not start without the API server
    Render2024
  8. IL-0232 Calico pods in the codfw WikiKube cluster hit their resource limits and crash-looped, taking nodes out one by one
  9. IL-0202 A burst of queries and database writes exhausted connection pools and memory on Honeycomb's ingest hosts, and Kubernetes crash-loop back-off kept failed hosts offline so ingest capacity stayed too low to recover
  10. IL-0433 Shifting API traffic from EC2 to EKS on Fargate overloaded two CoreDNS pods and caused mass name-resolution errors
  11. IL-0500 UToronto JupyterHub logins and server starts returned 500 errors when the hub's sqlite database disk filled up
    2i2c2022
  12. IL-0140 The GKE API in us-central1 returned errors and high latency for 3 hours 19 minutes after an unexpected rise in backend traffic that client retries made worse
  13. IL-0206 Consul agents in GitLab.com's GKE pods were repeatedly OOM-killed, so the Rails pods lost database replica discovery and sent every query to the primary
    GitLab2022
  14. IL-0013 The conntrack table filled up on downsized GKE nodes and a high-traffic aggregation proxy saw climbing connection resets
  15. IL-0002 CI builder pods could not get AWS IAM credentials because kubelet fell minutes behind its API rate limit
  16. IL-0064 CPU-heavy pods packed onto one Google Cloud node drove it to kernel panics, and the crash moved from node to node until the site was down
  17. IL-0075 Kubernetes API servers pegged on CPU when the cluster grew to about 290 nodes, traced to Datadog agents polling the API
  18. IL-0001 Cluster-wide DNS outage after CoreDNS pods were OOM-killed again and again under a burst of DNS queries
  19. IL-0031 Kubernetes API server OOM-killed, leaving the Skipper ingress without routes; the talk points to a misconfigured CronJob manifest
  20. IL-0518 gitlab.freedesktop.org on GKE ran short of volume space and a planned 30-minute storage upgrade became a 4-hour outage
  21. IL-0468 New JupyterHub student pods stuck Pending on MaxVolumeCount after a memory limit cut with node size unchanged