Cases2 cases
1 to 2 of 2
IL-0006VPC subnets ran out of IP addresses because the AWS VPC CNI kept IPs on full nodes, and WARM_IP_TARGET changes then blocked pod starts after every pod deletionNeon2025- Symptoms
On 16 May 2025, in Neon's Kubernetes cluster in AWS us-east-1, new compute pods were scheduled but could not start and failed with IP allocation errors. Each Neon compute is a Postgres database running in a lightweight virtual machine in its own pod, so without new pods, idle customer databases could not be woken up.
- Trigger
On 16 May the Neon control plane's periodic job that terminates idle computes started failing. Compute creations continued, and the number of active computes rose from about 5k to about 8.1k within minutes. On 19 May, a follow-up change that set WARM_IP_TARGET back to 1 started the second round of failures.
- Root cause
- Component
- Contributing factor
- Detection
As cluster-autoscaler added nodes, the team saw IP allocation errors on new pods that were scheduled but could not start. The rate of successful pod starts and VPC subnet metrics were then used to follow the problem.
- Remediation
- Set WARM_IP_TARGET=1 to release IPs held by nodes without free CPU or memory
- Fixed the control plane's periodic job so idle computes were terminated again
- Restarted the aws-node DaemonSet several times, each with a temporary improvement
- Set WARM_IP_TARGET=0, MINIMUM_IP_TARGET=0 and WARM_ENI_TARGET=0, which let nodes allocate enough IPs and stabilised the cluster
- On 19 May, set WARM_IP_TARGET back to 0 after setting it to 1 failed again
- Enlarged the pool of pre-created warm compute pods to absorb failed pod starts
- Action items
- Open a pull request to AWS CNI to improve how ipamd releases IPs in this situation
- Follow up with AWS Support about the roughly 100 subnet IPs that were never allocated, for reasons Neon could not explain
- Change the architecture to support horizontal scaling
- Lessons
With default settings AWS CNI can keep many IPs on nodes that cannot use them, so the share of subnet IPs assigned to pods does not tell how close the subnet is to running out. WARM_IP_TARGET and WARM_ENI_TARGET follow different logic, a warm IP target of zero switches to the ENI logic, and IPs in cooldown count toward the target, which behaves badly under high pod churn. Changing these settings during an incident without knowing that logic prolonged the outage, and reverting a setting did not bring back the earlier healthy state.
IL-0024Expensive cache-backed API calls and uncancelled database requests overloaded MongoDB and took the Hugging Face Hub down three timesHugging Face2024- Symptoms
At 08:45 CET on 22 April 2024 the Hugging Face Hub became unstable, and by 09:30 it was unresponsive. For most users the website was slow or could not be reached at all.
- Trigger
Bursts of requests to revision endpoints that read heavily from the *_info_cache collections: a call to https://huggingface.co/api/datasets/lighteval/mmlu/revision/main rose sharply right before the first crash, and a call to https://huggingface.co/api/models/sentence-transformers/all-mpnet-base-v2/revision/main, a model with 300+ associated spaces, lined up with the crash at 21:30 on 23 April.
- Root cause
- Component
- Contributing factor
- Detection
Instability started at 08:45 on 22 April and the Hub was unresponsive by 09:30; the team followed MongoDB Atlas metrics and a MongoDB support case. The root cause was found days later from a new graph of requests per URL.
- Remediation
- Added a firewall rule blocking all requests with a Java/* user agent
- Disabled the quicksearch feature on the Hub
- Scaled the MongoDB Atlas cluster by hand from tier 2 to tier 3
- Switched the Hub to maintenance mode with a 503 page through AWS WAF and blocked incoming traffic
- Scaled all Hub pods down to 0 and brought them back
- Set an aggressive rate limit
- Added timeouts to requests and reworked database queries that were slow or returned large bodies
- Action items
- Add timeouts to requests based on their usual completion time
- Optimise requests that took too long or returned a large body, and rework poorly designed database queries
- Remove old unused indexes from the database
- Build new dashboards and monitoring metrics
- Move the *_info_cache collections to Redis
- Make it possible to abort any database request when the client aborts theirs
- Lessons
Finding the root cause took two to three days: the existing charts did not show it, and a per-URL request breakdown did. Not cancelling database work when a client goes away turns a strained database into a thundering herd. A close inspection of the database exposed architectural flaws and bottlenecks, such as a collection with large unused indexes, and taught the team which metrics need closer watching to anticipate crashes. Unrelated failures happening at the same time added to the stress and made restoring service harder.
These 2 cases involve Cluster autoscaler and Application database. 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
Capacity exhaustion1 case
- Contributing factor
- Organisation
Software defect1 case
- Contributing factor
- Organisation