Cases3 cases
1 to 3 of 3
IL-0542Twingate authentication and authorization requests failed at higher rates after traffic moved onto a smaller GKE clusterTwingate2025- Symptoms
On 21 March 2025, between 21:10 and 21:41 UTC, part of the authentication and authorization requests to Twingate services failed with elevated error rates.
- Trigger
Twingate saw anomalies in one of its GKE clusters and scaled down the deployments in that cluster to protect the rest of the system, which moved its traffic to the other clusters.
- Root cause
- Component
- Contributing factor
- Detection
Twingate observed anomalies in one of its GKE clusters at the start of the incident.
- Remediation
- Reintroduced capacity in the cluster that had been scaled down, so traffic was rebalanced across regions
- Action items
- Keep working with the cloud provider to find the cause of the unexpected timeouts and of the cluster update's impact
- Run deployments in all regions with the same number of replicas in the HPA configuration
- Raise the maximum node counts of the cluster node autoscalers to leave more room to scale up
- Configure the HPA to scale up faster
IL-0493Netlify's Google Cloud TCP load balancer stopped serving about 5% of global traffic as all backends failed health checksNetlify2021- Symptoms
At 14:39 UTC on March 25, 2021, Netlify's monitors alerted that the health check of one of its load balancers was failing. That Google Cloud TCP load balancer served the single static IP that customers use for A records, and about 5% of Netlify's global traffic stopped being served until 18:46 UTC.
- Trigger
Unattended operating system updates, whose timing Netlify randomises across production nodes, restarted the systemd-networkd unit on each node over several hours, and each restart removed the custom route table entry that held the load balancer IP.
- Root cause
- Component
- Contributing factor
- Detection
Netlify's monitors alerted at 14:39 UTC that the load balancer health check was failing. The load balancer's own backend health checks were not part of Netlify's alerting, so the backends dropping out over the preceding hours raised no alert.
- Remediation
- Gave enterprise customers a separate range of IPs on a new load balancer for enterprise traffic
- Provisioned an AWS network load balancer backed by Global Accelerator and published its IP for self-serve customers
- Restarted the GCP networking daemon on all affected backend nodes, which restored traffic on the Google load balancer
- Action items
- Patch the google-guest-agent systemd configuration on all GCP CDN nodes to react to systemd-networkd restarts
- Report the bug to Google and open an issue in the google-guest-agent repository
- Include the load balancer's backend health checks in alerting
- Add a canary node to the backend to test updates and watch for issues over several days
- Decouple traffic tiers and move to multiple regions
- Offer customers more ways to route apex domains to Netlify, such as ALIAS and ANAME records
- Route enterprise traffic through its own IP
- Lessons
Netlify's own node-level health checks could not see that the backends were failing the load balancer's health check, and alerting on the load balancer's backend health checks would have given more time to diagnose before the outage.
IL-0333A downsized RDS PostgreSQL database maxed out its CPU at US peak and failing ELB health checks took buildkite.com downBuildkite2016- Symptoms
On 22 August 2016 at 17:21 UTC buildkite.com went offline: nobody could log in, view build logs or read the documentation, although builds kept running and GitHub and Bitbucket pull request statuses kept updating. The Buildkite team in Melbourne was asleep and woke at 21:00 UTC, almost 4 hours later, to emails, tweets and Slack messages saying Buildkite was down.
- Trigger
Over a weekend maintenance window, Buildkite downgraded its m4.10xlarge Multi-AZ RDS PostgreSQL database to an r3.2xlarge Multi-AZ instance to cut its AWS bill, and moved to a centralised pgbouncer to pool connections. The first US weekday peak after the change pushed the new instance's CPU to its maximum at about 16:00 UTC.
- Root cause
- Component
- Contributing factor
- Detection
New Relic, Pingdom, Datadog, Calibre and CloudWatch raised PagerDuty alerts, but the on-call phone call never came and only silent push notifications arrived. The team noticed at 21:00 UTC when they woke to emails, tweets and Slack messages from users.
- Remediation
- Moved servers from the Agent API to the dashboard ELB to bring buildkite.com back online
- Switched the Auto Scaling Groups to EC2 health checks and locked in desired counts
- Upgraded the database to an instance type that could handle the load, using the aws-cli
- Built a new AMI that did not depend on buildkite.com/_secret/version and rolled out servers that could self-deploy
- Removed the centralised pgbouncer and went back to pgbouncer on each host
- Action items
- Plan load testing after significant infrastructure changes without affecting other users of the system
- Make the ELB health check return OK when the app answers, without checking database connectivity
- Consider a separate health check endpoint for Pingdom that checks the database and other dependencies
- Store the latest deployed revision as a file on S3 for newly launched servers to self-deploy from
- Test by hand that PagerDuty calls reach every on-call team member
- Investigate regular company-wide tests of everyone's paging setup
- Ask PagerDuty about calling members when they go on call or requiring an immediate phone rule
- Lessons
Buildkite listed six lessons. Watch AWS credits, because billing reports show $0 while credits are spent, so the real cost is hidden and big changes end up rushed. Load test after significant infrastructure changes. Think about what a health check should do and what happens when every server behind an ELB fails it. Do not make new servers look up the deployed revision from the service they are replacing. Make sure every on-call member has the right PagerDuty and phone settings before going on call. When servers churn in AWS, stop health checks and autoscaling, for example with the Auto Scaling feature to suspend and resume processes, so the EC2 request limit is not used up.
These 3 cases involve Cloud load balancer and Cluster 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 cause3
Cloud provider outage1 case
- Contributing factor
- Organisation
Software defect1 case
- Component
- Contributing factor
- Organisation
Capacity exhaustion1 case
- Contributing factor
- Organisation