UberExplainer
From One Horizontal Scaling Controller to Many: Evolving Uber's Compute Platform
Summary
Uber’s failover redesign exposed a limitation in its long-standing single-controller model for scaling stateless workloads. To reuse idle capacity during regional failover, the platform needed multiple orchestrators to influence replica counts without overloading UDC, which remained on the normal deployment lifecycle path. The solution introduced the ServiceScale CRD and Service Scale Controller, allowing separate actors to record steady-state and temporary failover intent in Kubernetes and letting SSC reconcile the combined decision. Production work then exposed risks from informer caches that lagged reality and near-simultaneous multi-writer updates, including ReplicaSet metadata-spec drift that disrupted proportional scaling and could leave workloads stuck. Uber added fleet-wide detection, an automated UDC healer, a long-term scaling-path fix, and extensive kind integration tests, staging, and canaries; the year-long rollout avoided customer-impacting outages while establishing a more extensible control plane.
Context
Uber wanted to reuse idle capacity from low-tier workloads for high-tier workloads during regional failovers instead of reserving large amounts of underutilized capacity. This introduced an additional source of scaling intent while UDC and Up still needed to own normal service state and lifecycle workflows. The platform therefore had to support multiple orchestrators safely controlling the scale of the same Kubernetes workload.
Approach / What changed
Uber introduced the ServiceScale CRD and Service Scale Controller as a separate scaling path. Orchestrators record steady-state or temporary failover scaling intent in ServiceScale, and SSC reconciles the combined intent into Kubernetes objects while UDC continues handling the normal deployment lifecycle. The rollout added observability, an automated ReplicaSet healer, a long-term scaling-path fix, kind-based integration tests, staging, and canary deployments.
Takeaways
ServiceScale materializes each orchestrator’s scaling intent in Kubernetes, making competing requests inspectable and allowing failback to converge from persisted steady-state and temporary failover data.
Informer caches can lag reality, and near-simultaneous writes can produce ReplicaSet metadata-spec drift that breaks proportional scaling and can leave workloads stuck.
The rollout used kind integration tests, staging, canaries, fleet-wide drift detection, and an automated UDC healer to manage race-condition and production risks.
Source and freshness
- Source
- uber.com
- Published
- Added to Yomu
Summaries are generated from the original by a language model. Check the original before relying on it.
Keep reading
Related reading
The Good Stuff
Paid picks we use ourselves. Links carry a referral code — a subscription through one earns us a commission at no extra cost to you.
The best engineering reads, once a week
One useful email. Unsubscribe anytime.