Cases2 cases
1 to 2 of 2
- Symptoms
At 09:36 on 18 March 2025, during the upgrade of the live cluster to EKS 1.30, users reported that their pods were being terminated and were not restarting automatically, in both production and non-production environments. Automated infrastructure alerts fired as well, and production services had outages.
- Trigger
Upgrading the live EKS cluster from 1.29 to 1.30, during which the descheduler attempted to reschedule all pods on the cordoned nodes simultaneously.
- Root cause
- Component
- Contributing factor
- Detection
Users reported at 09:36 that pods were being terminated and not restarting, and automated infrastructure alerts fired.
- Remediation
- Removed the cordon annotation so pods could be rescheduled
- Deleted stuck 1.30 nodes to force their recreation
- Added a new node group of 20 nodes running 1.30 by hand
- Cordoned and drained all old 1.29 nodes onto the new 1.30 nodes
- Action items
- Raise an AWS Production System Down support case (Case ID: 174229643100496)
- Get guidance from AWS support on querying control-plane logs to find the root cause of similar issues
- Document a runbook for emergency scaling of a new node group in case of unexpected capacity shortages
- Alert on an imbalance between the autoscaling group and the Kubernetes nodes
- Review the descheduler configuration to understand why it throws pods off cordoned nodes, and fix it where possible
- Alert on spikes in the pending pod count
- Lessons
The write-up lists review actions rather than lessons. They show the team had no documented way to add an emergency node group, no alert on a mismatch between the autoscaling group and the nodes Kubernetes sees, no alert on a spike in pending pods, and no clear understanding of how the descheduler treats cordoned nodes.
IL-0504mybinder.org launches failed for about five hours as undeleted user pods piled up and filled the clusterBinder Project2018- Symptoms
On Saturday 8 July 2018 at about 18:30 CEST, the launch success rate of mybinder.org dropped to zero and stayed there. Suspicious behaviour was first reported on Gitter at 22:48, more than four hours later.
- Root cause
- Component
- Contributing factor
- Detection
Suspicious behaviour was reported on Gitter at 22:48 CEST, more than four hours after launch success dropped to zero; no downtime notifications were set up.
- Remediation
- Deleted user pods older than four hours with the delete-pods.py script
- Culled pods of the most-used images, such as ipython-in-depth, more aggressively
- Restarted the Hub pod after about 600 pods were culled, which brought launches back to normal
- Cordoned some of the extra nodes so the autoscaler could reclaim them
- Ran manual max-age culling the next morning, letting the cluster scale back to 3 nodes
- Action items
- Set up notifications of downtime
- Automate cluster scale-down
- Document the downtime recovery steps so every team member knows them
- Fix KubeSpawner's failure to delete pods when the pod reflector fails
- Make KubeSpawner more robust to pod reflector failure
- Refactor the event reflector into a single reflector instead of one per pod
- Detect a likely unhealthy Hub state and restart the Hub without manual intervention
- Lessons
The delete-pods.py script was useful for bulk-deleting old pods, and once the problem was noticed the cluster was healthy within a few minutes. The outage lasted five hours before anyone noticed because no downtime notifications existed, and scaling the cluster back down still took several manual steps of cordoning and draining nodes.
These 2 cases involve Cluster autoscaler and Descheduler. 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 cause2
Faulty deployment1 case
- Contributing factor
- Organisation
Software defect1 case
- Component
- Contributing factor
- Organisation