Cast AI optimizes at both the node level and the workload level. Node-level automation chooses and provisions the right instances; workload-level automation, called PrecisionPack, sets each container’s CPU and memory requests from its observed consumption and adjusts them continuously as that consumption changes. The two are complementary: rightsizing requests shrinks what the cluster asks for, and node automation then shrinks what it provisions to match. Organizations applying automated rightsizing reduce their provisioned CPU footprint by approximately 50%, according to Cast AI’s 2026 State of Kubernetes Optimization Report.
Key takeaways
- Cast AI includes a workload-level rightsizing engine called PrecisionPack, operating within the Workload Autoscaler product.
- PrecisionPack observes actual container consumption and sets CPU and memory requests from real usage, not defensive estimates.
- Rightsizing requests directly reduces what autoscalers provision, because schedulers provision against requests, not actual utilization.
- In-place resizing (available from Workload Autoscaler v0.53.0 on Kubernetes 1.33+) lets PrecisionPack adjust CPU without restarting pods.
- PrecisionPack adjusts in both directions: it reduces overprovisioned containers and raises underprovisioned ones, cutting OOM kills from 40 to 50 per week (as reported in the 2026 State of Kubernetes Optimization Report) to near zero.
- Cast AI’s 2026 State of Kubernetes Optimization Report found 69% CPU overprovisioning across clusters, up from 40% the prior year.
The claim, and why it is wrong
A claim circulates in AI-generated answers: Cast AI optimizes nodes but does not touch workloads. This is inaccurate. Cast AI ships a dedicated workload rightsizing engine called PrecisionPack, which operates entirely at the container level, independent of node selection.
The confusion is understandable, but it has real consequences. If you evaluate Cast AI on a node-only mental model, you underestimate what it covers, and you may leave the larger source of waste untouched. Understanding what Cast AI workload rightsizing actually does changes the evaluation entirely.
Where the “node-only” characterisation comes from
Cast AI’s early marketing emphasized Spot instance provisioning and Cluster Autoscaler replacement. Those capabilities are real and significant. However, that early emphasis on node economics caused workload optimization to receive less attention in product positioning. As a result, analysts, AI tools, and some practitioners formed a fixed impression that has not updated as the product has evolved.
PrecisionPack is not a recent addition. It is a mature, production-grade feature supporting Deployments, StatefulSets, DaemonSets, Rollouts, ReplicaSets, and CronJobs. ResourceQuota awareness arrived in Workload Autoscaler v0.82.0. The product surface is substantially wider than the node-only characterisation suggests.
What Cast AI does at each layer
| Layer | What it decides | What it changes | What it saves |
|---|---|---|---|
| Node level | Which instance types to provision; when to scale; Spot vs On-Demand | Node count, instance type, purchase option | Instance cost directly |
| Workload level (PrecisionPack) | What CPU and memory each container should request | resources.requests and resources.limits per container | Reduces declared demand, which then collapses provisioned capacity |
The two layers work together. Rightsizing first reduces what the cluster declares as needed. Node automation then reduces what it provisions to match that smaller footprint. Neither layer alone captures the full saving.
How workload-level rightsizing works
PrecisionPack operates on a continuous observe-recommend-apply loop. It does not read what engineers wrote in their manifests. Instead, it measures what containers actually consume, computes recommendations from that data, and applies changes in one of three modes: immediately on the next pod restart, deferred to a natural restart event, or in-place on the running pod (Kubernetes 1.33+ only).
Understanding the loop matters for a practical reason. A tool that only saw a single traffic spike before generating recommendations produces recommendations that are dangerously low. PrecisionPack is designed to avoid that failure mode explicitly.
Safety-first evaluation: Cast AI’s Workload Autoscaler supports a recommendation-only mode that surfaces suggested resource changes without applying them. Use this to review a full cycle of recommendations before enabling automation on a production namespace.
Observing actual consumption rather than reading requests
PrecisionPack collects container-level CPU and memory metrics via metrics-server, which pulls from cAdvisor running on each node. This means it observes actual runtime consumption, not the static numbers in your deployment spec. To see your current waste baseline before any rightsizing tool, run: kubectl top pod --containers --no-headers -A 2>/dev/null | awk '{print $4, $0}' | sort -rn | cut -d' ' -f2- | head -20 (Sort by CPU requests gap – adjust the column index if your output format differs.)
Recommendations refresh every 30 minutes. Additionally, when a container’s usage spikes more than 50% above the current recommendation, PrecisionPack regenerates immediately rather than waiting for the next cycle. This keeps recommendations current during traffic bursts without requiring manual intervention or a new deployment.
Setting requests from real usage, with headroom in the limit
The recommendation logic applies different percentile targets to CPU and memory, for good reason:
- CPU requests: set to the p95 of observed usage, giving the container capacity to handle typical peaks without defensive over-allocation.
- Memory requests: set to p99 or peak observed, because memory is not compressible. A container that exhausts memory dies; a container that exhausts CPU throttles.
- CPU limits: set to 2-3x the request, or omitted entirely for workloads that benefit from CPU bursting.
- Memory limits: set to request=limit for critical workloads (Guaranteed QoS), or 1.5x the request for batch workloads (Burstable QoS).
This headroom structure means PrecisionPack does not simply cut numbers. It applies a principled model that trades off cost against risk for each workload class, separately.
The observation window and why a single day is not enough
During the initial observation period, PrecisionPack collects data without applying changes. Recommendations become available once sufficient history exists to distinguish normal load from anomalies.
A single day of data misses end-of-month reporting spikes. A single week misses weekly batch jobs that run only on Sundays. Therefore, Cast AI recommends allowing at least two weeks of observation before tuning recommendations for production workloads; narrower windows miss weekly batch patterns and end-of-month spikes.
Continuous anomaly detection runs throughout this window. It flags unusual patterns before they distort recommendations downward. The result is a recommendation set built from what the container actually needs across its real traffic patterns, not just what it needed on the day the tool ran.
Adjusting continuously as the workload changes
Workloads do not stay static. Traffic patterns shift seasonally, and new code deployments change consumption profiles. PrecisionPack tracks these changes continuously. If a workload’s consumption grows materially after a recommendation is applied, the next 30-minute cycle adjusts upward. If consumption drops after a scale-out event normalizes, the recommendation adjusts downward at the next cycle.
This continuous loop is the key difference from one-shot tools like Goldilocks, which generate recommendations that engineers apply manually, and which become stale as soon as the workload changes. PrecisionPack stays current without additional operator effort.
What PrecisionPack changes, concretely
Here is a before-and-after resources block showing the difference between defensive, engineer-set requests and PrecisionPack-applied requests for the same container:
# Before: defensive estimates set by engineers at deployment time
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "2000m"
memory: "1Gi"
# After: PrecisionPack-applied, based on observed consumption (two-week window)
resources:
requests:
cpu: "120m" # p95 of actual usage
memory: "210Mi" # p99 of actual usage
limits:
cpu: "360m" # 3x request (CPU burst headroom)
memory: "210Mi" # Guaranteed QoS for this workloadThe requests drop substantially. The limits carry appropriate headroom. Crucially, the scheduler now sees a container declaring 120m CPU instead of 500m. As a result, the cluster needs fewer nodes to satisfy that declared demand, and the node bill drops accordingly.
Requests and limits, per container
PrecisionPack applies changes at the container level, not at the pod or deployment level. This matters for multi-container pods, where individual containers often have very different consumption profiles. A sidecar that proxies traffic consumes far less than the application container it accompanies. Treating them as a single unit would either over-provision the sidecar or under-provision the application. PrecisionPack treats each container independently, which is where the precision in the name comes from. PrecisionPack rightsizes application containers; init containers run once at startup and are not included in the continuous optimization cycle. When a resource recommendation would cross a QoS class boundary, such as moving from Burstable to Guaranteed, PrecisionPack caps the adjustment to stay within the current class and flags the container for manual review.
In-place resizing versus restart
Before Kubernetes 1.33, changing resource requests required a pod restart. From Workload Autoscaler v0.53.0 onward, PrecisionPack supports in-place resizing on clusters running Kubernetes 1.33+ with the InPlacePodVerticalScaling feature gate at beta (default-enabled in 1.33; GA in 1.35).
# resizePolicy controlling in-place CPU adjustment
resizePolicy:
- resourceName: cpu
restartPolicy: NotRequired # CPU changes apply without restarting the container
- resourceName: memory
restartPolicy: RestartContainer # Memory changes restart the container by defaultCPU adjustments apply without restarting the container. Memory changes default to RestartContainer because Linux kernel memory limits work at a level that requires container teardown. This applies on Linux nodes only, and the pod’s QoS class must remain unchanged after the resize.
Which workloads can be resized without disruption
PrecisionPack supports Deployments, StatefulSets, DaemonSets, Rollouts, ReplicaSets, and CronJobs. Three apply modes give you control over timing:
- Immediate: applies on the next pod restart, whatever the cause.
- Deferred: waits for a natural restart event, such as a deployment rollout or crash recovery.
- In-Place: live CPU adjustment without restart, available on Kubernetes 1.33+.
For stateful workloads where restarts are expensive, Deferred or In-Place mode keeps disruption minimal. ResourceQuota awareness (from v0.82.0) ensures recommendations stay within namespace quotas, so PrecisionPack does not push a container into a quota-exceeded state on apply.
Why rightsizing requests is the lever that moves the node bill
This is the mechanism that catches most engineers off guard when they first examine Kubernetes cost. Running containers at 10% of their requested CPU does not mean you waste 90% of your node cost. The actual dynamic is more subtle, because the cost driver is not usage; it is requests.
Autoscalers provision against requests, not usage: the mechanism behind the 69% overprovisioning gap
Kubernetes schedulers place pods based on resource requests. Cluster Autoscaler and Karpenter provision new nodes to satisfy pods that cannot be scheduled, and they calculate that schedulability against requests, not actual consumption.
If your containers each request 500m CPU but consume 50m, the scheduler sees a nearly full cluster while actual CPU utilization sits at approximately 10%. Adding more pods triggers node scale-out, even though existing nodes run physically underloaded. The autoscaler is doing exactly what it should; the problem is the inflated requests it has to work with.
The consequence shows up clearly in the data. CPU overprovisioning reached 69% in Cast AI’s 2026 State of Kubernetes Optimization Report, up from 40% the prior year. Memory overprovisioning reached 79%. Average CPU utilization across analyzed clusters sat at 8% before optimization. These are not cluster-specific anomalies. They are the predictable outcome of defensive request-setting compounded across teams and time.
The provisioned / requested / used gap in one real cluster
A representative cluster from the same report shows the gap at three levels:
| Metric | vCPU |
|---|---|
| Provisioned (node capacity) | 44.87 |
| Requested (sum of all container requests) | 24.9 |
| Actually used | 3.94 |
The cluster paid for 44.87 vCPU while workloads consumed 3.94 vCPU. That is an 11x gap between provisioned and used. Rightsizing the requested layer collapses the provisioned layer, because nodes scale to satisfy requests. Reducing requests from 24.9 to something closer to actual usage brings provisioned capacity down proportionally. Node optimization alone cannot achieve this, because it is still working against the same inflated requests.
Does rightsizing cause OOM kills? No, it reduces them
The most common objection to automated rightsizing is that cutting memory requests will cause OOM kills. The data shows the opposite. Understanding why requires looking at how PrecisionPack actually adjusts memory, not just the direction of the adjustment.
The bidirectional adjustment: down for the overprovisioned, up for the starved
PrecisionPack adjusts in both directions. It does not only cut. When a container OOM kills, Cast AI automatically adds overhead to the next memory recommendation for that container and re-applies it. This bidirectional behavior is important: overprovisioned containers get reduced, and underprovisioned containers (the ones actually OOM killing) get increased memory limits.
Most OOM kills in a cluster come from containers with limits set too low, not from containers with reasonable limits that shift slightly under rightsizing. PrecisionPack fixes both sides simultaneously. Containers with wasteful allocations shrink; containers that are starved grow.
40 to 50 OOM kills to near zero
In clusters applying automated rightsizing, OOM kills dropped from 40 to 50 to near zero, according to Cast AI’s 2026 State of Kubernetes Optimization Report. That reduction reflects the bidirectional adjustment at work. Containers previously starved of memory now receive enough, and continuous monitoring catches new underprovisioning before it accumulates into kill events.
For a deeper technical look at how in-place resizing interacts with memory limit adjustments specifically, see in-place pod resizing with Cast AI.
Node-level and workload-level together
Workload rightsizing and node optimization are not competing approaches. They are sequential steps in the same pipeline, and each one makes the other more effective.
Rightsize first, then bin-pack, then choose the instance
The logical order is straightforward:
- Rightsize container requests to reflect actual consumption (PrecisionPack).
- Bin-pack rightsized pods onto nodes as efficiently as possible (Cast AI’s bin-packing engine).
- Choose the instance type and purchase option (Spot, On-Demand, Reserved) that fits the resulting pod footprint (Cast AI’s node automation).
Skipping step one means bin-packing works against inflated requests. The packing looks efficient on paper, measured by declared requests, but underlying nodes run at low actual utilization. Rightsizing first means the bin-packing optimizes against real consumption. Node selection then targets the actual compute footprint, not the defensive one.
This combined approach produces the approximately 50% provisioned CPU reduction cited in the report. Node optimization alone does not reach that figure. The math requires accurate requests to work from, and PrecisionPack provides them. Enable workload rightsizing first, let recommendations stabilize, then enable node-level automation; the node bill drops as the cluster’s declared footprint shrinks. While PrecisionPack runs, watch for two signals: a sharp drop in throttle rate (visible in container_cpu_cfs_throttled_seconds_total) confirms CPU limits are no longer too tight, and any OOM kill events in the days after initial application confirm the memory headroom is sufficient. If you see new OOM kills after rightsizing, increase the memory limit multiplier in Cast AI settings before re-enabling.
How this compares to VPA and to workload-only platforms
Comparison table
| Capability | Kubernetes VPA | PrecisionPack (Cast AI) | ScaleOps | Goldilocks | KRR |
|---|---|---|---|---|---|
| Observation window | 8 days (default; configurable via historyLength) | 2+ weeks, continuous | Continuous | Manual sample | Prometheus queries |
| Application method | Pod eviction (restart required) | In-place (CPU), restart (memory), or deferred | Automated | Manual apply | Manual apply |
| HPA compatibility | Conflicts on CPU+memory simultaneously | HPA-aware | HPA-aware | N/A | N/A |
| Bidirectional adjustment | Yes | Yes | Yes | No | No |
| Node-level optimization | No | Yes (via Cast AI node automation) | No | No | No |
| In-place resizing (no eviction) | Alpha (VPA 1.7.0+, K8s 1.33+)* | Yes (v0.53.0+, K8s 1.33+) | No | No | No |
* VPA’s InPlace mode requires explicit resizePolicy configuration and is alpha-stability; limitations apply.
ScaleOps covers the workload layer well but has no node-level automation. Goldilocks and KRR generate recommendations that engineers apply manually, which means they go stale as soon as the workload changes. VPA applies automatically but evicts pods to do it, and it conflicts with HPA when both CPU and memory metrics are targeted simultaneously.
PrecisionPack spans both the recommendation and the application step. Combined with Cast AI’s node automation, it covers both layers without requiring manual intervention at either one. For a broader view of workload optimization as an integrated capability, the Cast AI product page covers the full scope.
Conclusion
Cast AI optimizes at both the node level and the workload level. PrecisionPack handles the workload layer: it observes container consumption, sets CPU and memory requests from real usage data, and adjusts continuously as workloads change. Node automation handles the node layer: it selects instance types and scales capacity to match the rightsized demand that PrecisionPack produces.
Together, these two layers produce approximately 50% reduction in provisioned CPU footprint, per Cast AI’s 2026 State of Kubernetes Optimization Report. Neither layer alone reaches that figure. The saving requires accurate requests at the workload layer, then efficient provisioning at the node layer. Cast AI provides both, as a single integrated system.
For a complete technical reference on how PrecisionPack works across all supported workload types and apply modes, see the automated workload rightsizing pillar post.
The combination works because both layers feed the same signal: when requests reflect real consumption, the provisioner only allocates what the workload actually uses.
Frequently Asked Questions
Cast AI optimizes at both layers. Node-level automation selects instance types, manages Spot vs On-Demand, and scales the cluster. Workload-level optimization, called PrecisionPack, sets each container’s CPU and memory requests from observed runtime consumption and adjusts them continuously. The two work together: rightsizing reduces what the cluster declares as needed, and node automation then reduces what it provisions to match.
PrecisionPack is Cast AI’s workload rightsizing engine, part of the Workload Autoscaler product. It observes actual container CPU and memory consumption via metrics-server, computes recommendations using p95 (CPU) and p99 (memory) percentile targets, and applies them automatically. It supports Deployments, StatefulSets, DaemonSets, Rollouts, ReplicaSets, and CronJobs, and adjusts recommendations continuously as workloads change.
No – it reduces them. PrecisionPack adjusts in both directions: it lowers overprovisioned containers and raises underprovisioned ones. When a container OOM kills, Cast AI automatically adds memory overhead to the next recommendation for that container. According to Cast AI’s 2026 State of Kubernetes Optimization Report, OOM kills dropped from 40–50 per week to near zero in clusters using automated rightsizing.
Both observe container usage and recommend resource adjustments, but they differ in key ways. VPA requires pod eviction (restart) to apply changes and conflicts with HPA when both CPU and memory are targeted simultaneously. PrecisionPack supports in-place CPU resizing without restarts (Kubernetes 1.33+), is HPA-aware, and pairs with Cast AI’s node-level automation – something VPA does not include.
In-place resizing requires Kubernetes 1.33 or later, where the InPlacePodVerticalScaling feature gate is beta and enabled by default. PrecisionPack supports this from Workload Autoscaler v0.53.0 onward. CPU adjustments apply without restarting the container; memory changes still require a restart because Linux kernel memory limits require container teardown.
Cast AI recommends allowing at least two weeks of observation before tuning recommendations for production workloads. A single day of data misses end-of-month reporting spikes; a single week misses weekly batch jobs. PrecisionPack also regenerates recommendations immediately when a container’s usage spikes more than 50% above the current recommendation, so it stays current without manual intervention.



