Cases4 cases
1 to 4 of 4
IL-0495HubSpot's internal load balancers on Kubernetes were falsely marked unhealthy and the rest collapsed under the trafficHubSpot2024- Symptoms
Between 14:20 and 15:16 UTC on 27 August 2024, some HubSpot customers could not log in to their accounts, reach their content or use HubSpot tools. Requests were slow or failed because HubSpot's internal load balancers, which run on Kubernetes and spread traffic across the backend services, were overloaded.
- Trigger
Routine operation of a critical component of HubSpot's traffic management system, from about 14:08 UTC, ran path handling updates in the load balancer stack, and an issue in that stack made those updates block health check responses.
- Root cause
- Component
- Contributing factor
- Detection
Monitoring detected widespread performance degradation across the platform at 14:23 UTC and the incident response team was mobilised. HubSpot says it had identified the issue internally by 14:20 UTC. The status page was not updated until 14:44 UTC, which left customers with outdated information.
- Remediation
- Tried to increase the capacity of the remaining load balancer instances
- Brought new load balancer instances online, which relieved the pressure and let traffic return to normal
- Action items
- Change the health check configuration so health checks do not time out falsely
- Redesign the health check system so health checks get priority and keep running during operations such as configuration updates
- Increase the capacity of the load balancers for sudden traffic spikes
- Change the load balancing architecture to detect traffic surges earlier and distribute load dynamically in real time
- Update the status page automatically for large-scale outages
- Integrate the monitoring systems more tightly with the communication tools
- Expand load testing to simulate high-traffic scenarios
- Introduce chaos engineering to test platform resilience regularly
- Add traffic pattern metrics, including the ratio of current connections to the maximum allowed
- Add auto-scaling that adjusts resource capacity to traffic patterns
- Lessons
HubSpot concluded that earlier detection of the abnormal traffic surge could have prevented the cascading failure, and that health checks have to keep running during operations such as configuration updates so that working load balancers are not removed together. The late status page update caused confusion for customers.
IL-0106A malformed Traefik IngressRoute triggered a Traefik v2 bug once a node rollover restarted every Traefik pod, and all Kubernetes services returned 404DFDS2021- Symptoms
At 08:00 UTC on 2021-09-06 every service in DFDS's Kubernetes cluster answered with 404. Investigation started five minutes later.
- Trigger
The automated Kubernetes node rollover on 2021-09-06 restarted all the Traefik v2 pods, five days after a malformed IngressRoute manifest had been applied.
- Root cause
- Component
- Contributing factor
- Detection
All services returned 404 from 08:00 UTC and root cause investigation started at 08:05. Time to detection was 5 minutes.
- Remediation
- changed the ALB health check path, which made the targets healthy but did not stop the 404s
- rolled back by hand to Traefik v1 as the main ingress controller
- deleted the malformed IngressRoute by hand and confirmed the Traefik v2 bug
- applied the changes upstream
- Action items
- Upgrade Traefik to v2.5, where the bug is fixed, and verify that it removes the bug
- Change the Traefik v2 health check path to something more robust
- Set up an external liveness probe on the ingress controller
- Consider workload segmentation to limit the blast zone
- Look into monitoring the Traefik v2 API for rapid changes
- Look into smoke testing during and after node rollover
- Lessons
A malformed IngressRoute did nothing visible for five days and then took down all ingress when every Traefik v2 pod had restarted during a node rollover. Because Traefik v2 failed gracefully, the first signals pointed at the ALB health checks instead of at Traefik. On incident handling, the team concluded that appointing an incident manager could have helped, that the war room meeting should be recorded and a log book kept, that people not involved should only make suggestions in writing, and that a short first round of sharing thoughts and gut feelings is useful.
IL-0054All ingress traffic lost while draining a GKE node pool because the load balancer only targeted new nodes without ingress-nginx podsDevOps Hof2019- Symptoms
While the old nodes of a GKE cluster were being drained to move workloads to a newly created node pool, none of the services in the cluster could be reached through ingress-nginx any more.
- Trigger
Cordoning and draining the old node pool removed those nodes from the GCP load balancer backend while the ingress-nginx pods were still running on them.
- Root cause
- Component
- Contributing factor
- Detection
The team noticed during the drain that no service in the cluster was reachable through ingress-nginx.
- Remediation
- deleted the nginx-ingress-controller pods still running on the old nodes so they were rescheduled on the new, ready nodes
- Lessons
With externalTrafficPolicy: Local, the load balancer can only reach nodes that run an ingress pod, and cordoned nodes leave the load balancer backend immediately; if the ingress pods stay behind on cordoned nodes, all ingress traffic stops. Before any change that might touch traffic, look twice into the documentation.
IL-0503mybinder.org launches failed after a GKE node ran out of memory and its nginx-ingress proxy pod crash-loopedBinder Project2017- Symptoms
On 30 November 2017 at 16:59 PST, mybinder.org operators noticed that Grafana looked wrong and that launching a new server failed with an error that a temporary user could not be created. Pods that were already running kept running, but no new ones were being created.
- Trigger
A build container, which ran without a memory limit, most likely used up all the memory on the node that ran the proxy pod.
- Root cause
- Component
- Contributing factor
- Detection
An operator happened to look at Grafana at 16:59 PST, saw that it looked wrong, and confirmed the error by launching a new server.
- Remediation
- Cordoned the node that had run out of memory
- Uncordoned the node once the proxy was working
- Action items
- Limit the memory available to build pods
- Change the JupyterHub configuration so user pods are not cleaned up when the jupyterhub pod restarts
- Nominate one person to drive the response, possibly in a shared terminal, so only one person changes the cluster
- Alert when something is wrong with the cluster, for example by counting 4xx responses on the jupyterhub pod
These 4 cases involve Ingress controller and Cloud load balancer. 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
Software defect2 cases
- Contributing factor
IL-0495HubSpot's internal load balancers on Kubernetes were falsely marked unhealthy and the rest collapsed under the trafficHubSpot2024IL-0106A malformed Traefik IngressRoute triggered a Traefik v2 bug once a node rollover restarted every Traefik pod, and all Kubernetes services returned 404DFDS2021
Operator error1 case
- Contributing factor
- Organisation
Capacity exhaustion1 case
- Contributing factor
- Organisation