Cloud · Kubernetes · FinOps

In-place Pod resize on Kubernetes: field notes for right-sizing without restarts

For years, changing a Pod's CPU or memory meant replacing the Pod. That made right-sizing disruptive, so most teams over-provisioned and left it there. With in-place resize stable since Kubernetes 1.35, the excuse is gone. The operational details still matter.

Field noteSumanta Mukhopadhyay8 min read5 sources
#kubernetes#finops#platform#cloud
FIELD NOTE · CLOUD · KUBERNETES · FINOPS26 Oct 2026 · 08:15 GST

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:

ConditionReasonMeaning
PodResizePendingDeferredDoesn't fit now, might fit later; the kubelet keeps retrying
PodResizePendingInfeasibleCan never fit on this node as it stands
PodResizeInProgress(none) or ErrorAccepted 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.

Architecture diagram of the Vertical Pod Autoscaler: the metrics server feeds the VPA recommender, which stores recommendations in the VerticalPodAutoscaler custom resource; the admission controller injects resource values into new Pods via the API server, and the VPA updater either evicts Pods or updates them in place
VPA components: the updater can now update Pods in place rather than only evicting them. Source: Kubernetes documentation, Vertical Pod Autoscaling · CC BY 4.0

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

  1. Measure first. Compare requests with real usage by namespace and team, using the allocation approach in FOCUS-based cost allocation.
  2. Start with CPU on stateless services, using NotRequired, where the risk is lowest and the savings show quickly.
  3. Run the VPA in recommendation mode for a few weeks, then enable InPlaceOrRecreate on workloads that tolerate the fallback.
  4. 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.
  5. Alert on pending resizes and report status, not spec, in cost dashboards.
  6. 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.

References
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
    Vertical Pod AutoscalingKubernetes documentation
FAQ

Common questions

Can Kubernetes change a Pod's CPU and memory without restarting it?

Yes. In-place Pod resize graduated to stable in Kubernetes 1.35. CPU and memory requests and limits on a running Pod can be changed through the resize subresource, and with a resizePolicy of NotRequired the change is applied without restarting the container where the runtime supports it.

What happens if the node doesn't have room for the resize?

The kubelet sets a PodResizePending condition with reason Deferred if the resize might fit later, or Infeasible if it can never fit on that node, and keeps retrying. Since 1.35, deferred resizes are retried in priority order.

Does the Vertical Pod Autoscaler use in-place resize?

Yes. The VPA's InPlaceOrRecreate update mode tries an in-place resize first and falls back to recreating the Pod if that isn't possible. The Kubernetes 1.35 release blog described that mode as having graduated to beta.

Keep reading

Related

Open to advisory, fractional CTO & select builds

Let's talk about what you're building.

The fastest route is a free 30-minute call. Prefer to write? Send a message and I'll reply personally within two business days.

Start a conversation

How would you like to reach me?

Book a 30-min callFastest. Pick any open slot on my calendar.→ Write in GmailOpens a pre-filled draft in your browser.→ Use my email appOutlook, Apple Mail or your default client.→

I reply personally within two business days. Time zones from the Americas and Europe to the Middle East and Asia-Pacific.