Product1 distinct publisher3 min readPublished
A CNCF write-up walks through a crash where autoscaling fired on time and still arrived late. The answer the team built forecasts ten minutes out, which is less lead time than their own incident timeline needs.
The Product Desk · Product desk

Compiled by The Product DeskSomething wrong?How this is made
Pre-warming only helps if the forecast horizon is longer than whatever you are warming. On the timeline in the post, the HPA crossed its threshold at 06:05 and the first GPU nodes only ran pods at 06:45 [2], a gap of 40 minutes [2]. The controller looks 10 minutes ahead [5], or a quarter of that gap [5]. Ten minutes of notice buys pod scheduling onto GPU nodes that already exist. It does not buy firmware load, driver init and CUDA readiness [3] on a node the cloud has not handed you yet.
So the pitch and the work come apart here in a way worth naming: the pitch is prediction, and the work is keeping enough GPU nodes warm that ten minutes of notice is enough to fill them. Those sit on different budget lines, and only one of them is a model.
The second ceiling is arithmetic, not accuracy. The graduated scaler rate-limits to 20 pods per minute [10], because the team found out what happens when you ask the scheduler for 100 pods per second [10]. Twenty pods a minute across a 10-minute horizon is 200 pods of pre-warm at most [3]. If the spike needs 300, a better forecast changes nothing about the outcome.
Here is what teams tell themselves after building something like this: the model is good, therefore the incident is solved. What the original incident actually measured was hundreds of pending pods and a 15 to 20 percent error rate [1], and those are the numbers that decide whether Friday goes well. Forecast error is an input. The author is refreshingly plain about the target, writing that for autoscaling they needed to be right 80 percent of the time rather than 100 percent [9], which means one window in five falls through to the burst detector, an adaptive threshold on the rolling standard deviation of predictions against actuals [6]. The account as supplied stops mid-sentence at the rate limiter [11], so there are no post-deployment pending-pod or error figures to hold against the 15 to 20 percent they started from.
Worth checking the training set against your own calendar, too. The model learned from 10,080 samples of GPU utilisation [7], which at one-minute resolution is seven days [4]: seven daily cycles and a single weekly one [6]. A month-end batch run or a quarterly customer onboarding wave is not in that window, and the burst heuristic is what catches it.
Two measurements decide this for your cluster, and neither is a hyperparameter. First, time the full path from "I want a GPU node" to "a pod is serving on it" on your own cloud and your own image. Second, work out how much of tomorrow's curve repeats last week's. Short lag, any pattern: tune the HPA and stop there. Long lag, repeating pattern: forecasting pays, and the horizon has to be at least the measured lag, not a round number. Long lag, event-driven demand: you are buying idle GPUs, and the only real question is how much idle you can defend. Long lag, no pattern, no budget for idle: the honest design is a queue and a documented degradation path rather than a cleverer autoscaler.
Ranked by verification strength, evidence, and original report placement.
The text of the post as supplied ends mid-sentence in the graduated scaler section and contains no post-deployment error-rate or pending-pod figures.
In the postmortem described, a critical production service crashed under traffic rather than degrading gradually, leaving hundreds of pending pods and users seeing 15-20% error rates.
Incident timeline: 06:00 traffic spike arrives; 06:05 HPA threshold crossed and Deployment replicas scale up; 06:15 new pods begin scheduling; 06:45 first GPU nodes finish provisioning and pods actually run. By 06:45 the spike was over.
Scaling CPU-only services takes minutes, while scaling GPU nodes takes 3-5x longer because firmware loads, drivers initialize and CUDA gets ready; reactive HPA by definition waits for demand before ordering capacity.
Prometheus was already collecting CPU, memory, latency, RPS and NVIDIA GPU utilization continuously, with a week of history in storage.
The Kubernetes controller runs every 60 seconds, ingests the past hour of metrics, runs inference to forecast demand 10 minutes into the future, and scales up gradually so capacity is warm when traffic arrives.
Distinct publishers with included, body-backed reporting in this cluster.
1 article · August 28, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
product
The GPU fleet's utilisation now hinges on which tenants you dare pack together1 distinct publisher
product
Sovereignty audits are moving from the region picker to the plane topology1 distinct publisher
build
Five pods green, GPU at 99 percent, queue up 70x: the Kubernetes dashboard is the wrong instrument1 distinct publisher
build
SSE in Go breaks twice before your handler runs: an illegal header, then a 30-second timeout1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
First-party throughout, arithmetic self-consistent
Every number in this story — the incident clock, the 85% hit rate, the 20-pods-per-minute ceiling — comes from the team that built the controller, published on the foundation whose ecosystem it runs in. There is no code to read and no second party who has reproduced any of it. The one internal cross-check available does hold: 10,080 samples at minute resolution is precisely the week of Prometheus history the team says it had. That is reassuring about the arithmetic and silent about the outcome.
Shadow mode, dev cluster, one team
Shadow mode is the whole deployment story: predictions ran for 500-plus hours and scaled nothing, and the furthest the post gets before cutting off is a week-long hackathon in a controlled dev environment. 'Production-ready' is an assessment, not a track record. No other team, operator or vendor appears anywhere in this reporting running the design, and the service that crashed at 06:00 is never shown running behind it.
Ten minutes of lead time for a 40-minute problem
This is a candid post that still oversells its own arithmetic. It opens by measuring a 40-minute gap between the autoscaler firing and GPU capacity serving, then builds a forecast that sees ten minutes ahead — a quarter of the runway the incident proved it needed, with a heuristic burst detector asked to cover the rest. Credit where it is due: the 80%-accuracy target, the interpretability loss and the shadow-mode framing are all stated out loud rather than buried. The overstatement is structural, in the promise of scaling before the spike, not in any single sentence.
House blog, hackathon showcase, nothing for sale
The venue is the foundation whose stack the answer is built from, and the answer is an internal hackathon project written up by the people who scored it. Prometheus in, Kubernetes controller out, no third-party platform to purchase — there is no product here, which keeps the stakes low. But no one in the chain is served by the design looking fragile, and every result in the piece is self-graded, including the one that declares it production-ready.
Single account, mechanism clearer than outcome
With one publisher and one voice there is no contradiction available to weigh, so our reading is firmer on how the controller works than on whether it works. The mechanics are specified precisely enough to argue with — units, epochs, rate limits, loop interval — which is why the design claims sit comfortably and the results claims do not. The text also stops mid-sentence, so even the author's own validation is only partly on the record.