Cases5 cases
1 to 5 of 5
IL-0133A storm shut down cooling at Nebius's us-central1 data center, and a disk hot-plug bug kept Managed Kubernetes control planes down for hours after power returnedNebius2026- Symptoms
On 19 August 2026 the first equipment-level signs in Nebius's us-central1 region appeared around 09:40 UTC: the InfiniBand fabric degraded and GPU over-temperature alerts began to accumulate. Customer reports followed shortly after 10:00. At 10:15 on-call engineers were paged on critical component temperature alerts, and the incident was declared at 10:21.
- Trigger
A storm-related event at the data center building took the building management system offline and shut down the chilled-water cooling loop.
- Root cause
- Component
- Contributing factor
- Detection
No facility-level alert fired, because the storm also disabled the building management system that monitors the facility. Engineers acted on component over-temperature alerts that paged on-call at 10:15 UTC, after InfiniBand degradation, GPU over-temperature alerts and customer reports; the temperature rise from about 09:15 was visible on dashboards but had no alert.
- Remediation
- had the facility operator switch cooling to manual bypass mode and opened rack rear doors to vent heat
- re-energised tripped racks, control-plane racks first
- restored the regional infrastructure control plane by manual intervention
- restarted block-storage host components to clear stale disk attachment state
- raised the VM recovery rate limits by hand for the region-scale recovery
- started the affected Managed Kubernetes control-plane instances by hand
- applied a controlled stop and start to control-plane instances whose data disk had been left unattached
- identified and started 104 customer VMs that the incident had stopped
- Action items
- Complete a joint resilience review with the facility operator covering redundancy of facility-management and monitoring systems, cooling that keeps running when those fail, electrical protection of cooling equipment and on-site response
- Add facility-level environmental alerting on cooling plant state and room temperature trend that pages on-call independently of the building management system
- Set up a documented emergency escalation path with the facility operator, with an on-call contact tree and guaranteed response times
- Define an emergency heat-load reduction procedure with criteria, ownership and mechanics for shutting down or degrading workloads during a cooling loss
- Establish a dependency-ordered region cold-start procedure with clear ownership for each service layer
- Run regular region-scale recovery drills that cover VMs, storage attachments and Managed Kubernetes clusters
- Fix the disk-attachment bug that extended the Managed Kubernetes outage and deploy the fix to all production regions
- Improve the recovery policies Compute users can configure, and move all Managed Kubernetes control-plane nodes to the improved policy
- Automate reconciliation of stale storage attachment state after abrupt host failures
- Remove in-region dependencies from monitoring startup and recovery, and extend cross-region monitoring
- Make regional health checks used for global traffic management reflect real service availability
- Lessons
Facility monitoring that runs on the same system it watches goes silent in exactly the failure it should report, and with no alert on the room temperature trend there was no practical window to shed heat load in a controlled way. A cold start of a whole region exercised recovery paths built for isolated failures: single-attempt VM recovery, conservative rate limits and stale disk attachments all needed manual work. The longest part of the outage was restoring customer resources, Managed Kubernetes control planes above all, so Nebius is extending its recovery drills to that layer.
- 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.
- Symptoms
Overnight into 26 March 2019 (PDT), every Prow test job that needed a GCP project from Boskos, the Kubernetes test-infra service that hands out GCP projects to test jobs, failed. The required job pull-kubernetes-e2e-gce failed on every run, so no pull request could be merged in kubernetes/kubernetes for just over nine hours, and other projects saw similar failures.
- Trigger
At 23:04 PDT the node running the only Boskos pod was drained to be replaced with a 1.13 node during the upgrade of the Prow clusters from Kubernetes 1.11 to 1.13. The replacement pod started from the StatefulSet's current spec, which named a newer Boskos image containing the bug.
- Root cause
- Component
- Contributing factor
- Detection
Users reported the failure on GitHub at 02:50 and on Slack at 05:16 and 06:27, and an engineer saw the Slack reports on waking at 07:16. The Boskos monitoring dashboard showed the failure, but no alert caught it.
- Remediation
- Built and deployed a new Boskos image with the bug fixed
- Cleaned up the GCP projects that had been left open
- Action items
- Change the Boskos configuration so that deployments actually take effect (#11956)
- Automate Boskos deploys (#11957)
- Improve alerting on Boskos status (#11953)
- Lessons
The write-up lists what went poorly: a ten-hour upgrade was started shortly after 17:00 when on-call coverage ended at 18:00; deployments were not checked to confirm that something had actually rolled out; the Boskos StatefulSet was not set up to perform updates, so changing its spec left the old pod running; the December change appears never to have been tested; and Boskos was deployed by hand, unlike most of Prow, which left more room for error. Once people were available, the problem was fixed quickly.
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.
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 5 cases involve JupyterHub and Node pool. 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 cause4
Dependency failure1 case
- Contributing factor
- Organisation
Faulty deployment2 cases
- Contributing factor
- Organisation
Software defect1 case
- Component
- Contributing factor
- Organisation
Capacity exhaustion1 case
- Contributing factor
- Organisation