Almost every Kubernetes cost review finds the same thing: requests set generously at launch and never touched again. Teams know the numbers are wrong. They leave them because changing them used to mean rolling every Pod, and nobody wants to explain a restart to a stateful service, a long-running batch job or a model server that takes minutes to warm up.
That constraint has gone. These are notes on what changed and how I would put it to work.
What changed
In-place Pod resize arrived as alpha in Kubernetes 1.27, reached beta in 1.33 and graduated to stable in 1.3513. It makes CPU and memory requests and limits mutable on a running Pod. You send the change to the Pod's resize subresource, for example with kubectl patch --subresource resize, which needs kubectl 1.32 or later2.
Each container declares a resizePolicy per resource. NotRequired asks for the change to be applied without a restart; RestartContainer restarts that container to apply it. A common pattern in the documentation is CPU set to NotRequired and memory set to RestartContainer2.
The stable release added two things operators will notice. Memory limits can now be decreased, with the kubelet only allowing it when current usage is below the new limit, a best-effort check rather than a guarantee. And when a node can't fit every pending resize, retries are ordered by PriorityClass, then QoS class, then how long the request has waited1.
Watch the conditions, not just the spec
A resize is a request, not a guarantee. The kubelet reports progress through Pod conditions2:
| Condition | Reason | Meaning |
|---|---|---|
| PodResizePending | Deferred | Doesn't fit now, might fit later; the kubelet keeps retrying |
| PodResizePending | Infeasible | Can never fit on this node as it stands |
| PodResizeInProgress | (none) or Error | Accepted and being applied; errors in actuation surface here |
The practical rule: alert on long-lived PodResizePending. A spec that says 4 CPUs while the container still runs on 2 is a quiet source of confusion in incidents and cost reports alike.
The spec says what you asked for. The status says what you got. Right-sizing dashboards should read the status.
Where the VPA fits
The Vertical Pod Autoscaler recommends requests from observed usage and applies them. Its InPlaceOrRecreate update mode tries an in-place resize first and falls back to recreating the Pod when that isn't possible; the 1.35 release blog described that mode as graduating to beta15.

This is the combination that changes cost economics. Recommendations used to sit in a report because applying them was disruptive. With in-place updates they can be applied continuously, within limits you set.
Pod-level resources are next
Kubernetes 1.36 promoted in-place resize of Pod-level resources to beta, meaning a shared budget for all containers in a Pod can also change without recreating it4. That is useful for Pods with sidecars, where per-container numbers are hard to tune separately. I would treat it as beta: pilot it, but don't build a platform default on it yet.
Where it bites
- Applications that size themselves at start-up. A runtime that reads its memory limit once, such as a JVM heap or a worker pool sized to CPU count, won't notice a change. For those, a restart policy on memory is the honest choice.
- Memory decreases. The usage check is best-effort, so shrinking memory on a busy Pod still carries OOM risk1. Shrink gradually and watch.
- Node fragmentation. Growing in place only works if the node has room. Busy nodes produce Deferred resizes; plan headroom or accept fallback to recreation.
- Quotas and policy. Resizes still count against namespace quotas, and teams will need guardrails on how far they can go, enforced with admission policies in multi-tenant clusters.
How I'd roll it out
- Measure first. Compare requests with real usage by namespace and team, using the allocation approach in FOCUS-based cost allocation.
- Start with CPU on stateless services, using
NotRequired, where the risk is lowest and the savings show quickly. - Run the VPA in recommendation mode for a few weeks, then enable
InPlaceOrRecreateon workloads that tolerate the fallback. - Use it for warm-up spikes. Services that need extra CPU at start-up, including model servers like those in vLLM serving, can start large and shrink once warm.
- Alert on pending resizes and report status, not spec, in cost dashboards.
- Combine with scale-to-zero from Kubernetes FinOps: horizontal scaling for traffic shape, vertical for per-Pod fit.
How I can help
I run Kubernetes cost and platform reviews that turn right-sizing from a one-off report into a continuous, safe process. As a fractional CTO I can own that roadmap. Or analyse your challenge and bring the result to a call.
- 1Kubernetes 1.35: In-Place Pod Resize Graduates to StableKubernetes blog · 19 Dec 2025
- 2Resize CPU and Memory Resources assigned to ContainersKubernetes documentation
- 3Kubernetes v1.33: In-Place Pod Resize Graduated to BetaKubernetes blog · 16 May 2025
- 4Kubernetes v1.36: In-Place Vertical Scaling for Pod-Level Resources Graduates to BetaKubernetes blog · 30 Apr 2026
- 5Vertical Pod AutoscalingKubernetes documentation