Right-sizing AKS pods: the basics
What does an over-provisioned pod actually cost you?
An AKS cluster does not bill for the work your pods do, it bills for the nodes the scheduler has to keep running to satisfy the resource requests your pods declare. A pod that requests 1 CPU and 2 GiB of memory reserves that much capacity on a node whether it uses three per cent of it or all of it, because the Kubernetes scheduler treats the request as a hard reservation. Set those requests too high and the scheduler packs fewer pods per node, so the cluster autoscaler adds more virtual machines to fit them, and each of those VMs is a line on your Azure bill. The waste is invisible inside the cluster: every pod looks healthy, nothing is throttled, and the only symptom is a node count and a compute invoice that are larger than the actual demand warrants.
Setting the correct request and limit values is genuinely hard, because the resources a workload needs vary greatly from one service to the next, and managing that by hand across hundreds or thousands of pods is harder still. This is exactly why Azure Advisor raises the cost recommendation 'Enable Vertical Pod Autoscaler recommendation mode to rightsize resource requests and limits' against your managed cluster. The Vertical Pod Autoscaler (VPA) watches the real CPU and memory consumption of your pods over time and, in its recommendation-only mode, tells you the requests and limits each container should actually have, without changing anything until you decide to apply them.
Most of this over-provisioning is not a mistake, it is a sensible-looking guess that was never revisited: a request copied from a template, a generous number chosen 'to be safe' at launch, or a limit inherited from a service that has since shrunk. The work is to turn on VPA in recommendation mode, read what it says each workload truly needs, separate the pods that are genuinely sized for their peaks from the ones that are simply oversized, and bring the inflated requests down so the cluster fits onto fewer, smaller nodes.
In this lesson you will learn how AKS turns pod resource requests into real Azure compute cost, why over-provisioned requests inflate the node count, and how to use the Vertical Pod Autoscaler in recommendation-only mode to find out what each workload actually needs before you change anything. You will enable VPA on a cluster, read its recommendations, and apply them safely so the node pool shrinks to fit real demand.
The cluster that was twice the size of its workload
Kubernetes right-sizing studies have repeatedly found that a large share of requested CPU and memory across a typical cluster is never used, often well over half, because requests are set defensively and almost never revisited downward. The pattern is always the same: every pod looks healthy, nothing is being throttled, and yet the cluster is running far more nodes than the real demand needs, purely because the scheduler is honouring reservations nobody is actually consuming. The Vertical Pod Autoscaler exists precisely to close that gap by measuring what each container really uses and telling you the number you should have requested all along.
Finding over-provisioned pods on a cluster
Priya runs the platform team at a scale-up whose AKS bill has been climbing faster than its traffic. Azure Advisor is showing the cost recommendation to enable Vertical Pod Autoscaler recommendation mode on the production cluster, and the node count has crept up even though nothing new shipped.
Rather than guess at new request values, Priya turns VPA on in recommendation-only mode so it can measure real consumption, then reads what it says each workload actually needs before changing a single deployment.
Enable VPA on the existing cluster, then read its recommendation for a workload. In recommendation-only mode VPA measures and advises but changes nothing.
VPA's Target is the request it recommends; the Lower and Upper Bound show the safe range. A Target far below the current request is recoverable node capacity.
How VPA recommendation mode decides a pod is over-provisioneddeep dive
VPA is an AKS add-on you turn on at the cluster level, after which you attach a VerticalPodAutoscaler object to a workload via its 'targetRef'. The behaviour is controlled by 'updatePolicy.updateMode'. With the mode set to 'Off', VPA runs in recommendation-only mode: its recommender component watches the live CPU and memory usage of the target pods and continuously computes a recommendation, but it never evicts or resizes anything. This is the mode the Advisor recommendation asks for, because it lets you review and apply suggested values manually, which prevents potential disruptions and gives you better control over resource allocation while you build confidence.
Read the recommendation with 'kubectl describe vpa/
The strongest position is to treat the recommendation as input and keep control of the apply step. The active modes, where VPA changes pods for you, are 'Recreate' and, on newer clusters, 'InPlaceOrRecreate'; note that the older 'Auto' mode is deprecated since VPA version 1.4.0 on AKS 1.34 and behaves as an alias for 'Recreate'. Starting in recommendation-only mode and applying the numbers yourself means you capture the saving on your own schedule, validate latency-sensitive workloads before you trim them, and never risk an automatic eviction surprising a service during a busy period.
What is the impact of leaving pods over-provisioned?
The direct impact is paying for nodes you do not need. Every inflated request is capacity the scheduler reserves but the workload never uses, and reservations are what drive the cluster autoscaler to add virtual machines. Across a cluster of hundreds of pods, requests set several times higher than real usage can keep a meaningful number of nodes running purely to satisfy reservations, and each of those nodes bills around the clock. Because the over-provisioning is invisible from inside the cluster, nothing is throttled and every pod looks healthy, the cost simply accrues quietly on the Azure invoice until someone measures it.
The second-order impact is that the waste compounds with everything built on top of the node pool. A reservation or savings plan bought against an over-sized cluster locks in spend for capacity nobody uses. Capacity planning based on inflated requests over-forecasts future need. And bin-packing efficiency, the whole reason to run a shared cluster, is undermined when each pod hoards more than its share. Right-sizing the requests first means every downstream commitment and forecast is made against the cluster's true size.
On the operational side, leaving requests untuned is a standing drag on cost-efficiency that grows as the estate grows. Azure Advisor raises this as a cost recommendation precisely because over-provisioning is, in Microsoft's own framing, a major driver of unnecessary spend, and VPA recommendation mode is the documented, low-risk way to find and fix it. A cluster whose requests track measured usage is the cheapest version of itself that still meets demand.
How do you right-size pods safely?
Work the capability as one loop rather than chasing a single workload. The order matters: measure first with VPA in recommendation-only mode so you know the true numbers before you change any request, so you never trim a workload below what it actually needs.
1. Turn on VPA in recommendation-only mode
Enable the VPA add-on on the cluster, then attach a VerticalPodAutoscaler to each workload with the update mode set to 'Off'. In this mode VPA measures real CPU and memory usage and computes a recommendation without evicting or resizing anything, so it is safe to run in production while you gather data.
2. Read the recommendations and rank by gap
After VPA has observed each workload for a representative period, read its Target with 'kubectl describe vpa'. Rank workloads by the gap between their current request and the recommended Target, because the largest gaps are the most recoverable node capacity. Treat this ranking as the source of truth, not the cluster's overall node count.
3. Apply the easy wins, review the sensitive ones
For clearly over-provisioned, stateless workloads, lower the request toward the Target and let the autoscaler retire the freed-up nodes. For latency-sensitive or bursty workloads, keep a margin above the Target and validate under load before trimming. Use 'minAllowed' and 'maxAllowed' to bound VPA's advice so it never recommends below a floor you are comfortable with.
4. Keep it honest and compound with reservations
Leave VPA running in recommendation mode so the numbers stay current as workloads change, and revisit the largest gaps periodically. Once the cluster is right-sized, buy any reservation or savings plan against the node pool that is actually left, so you never commit spend to capacity you have just removed.
# 1. Enable the Vertical Pod Autoscaler add-on on an existing cluster.
az aks update \
--name prod-cluster \
--resource-group rg-platform \
--enable-vpa
# 2. Attach VPA in recommendation-only mode (updateMode: Off).
# It measures and advises but never evicts or resizes a pod.
cat <<'EOF' | kubectl apply -f -
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: web-api-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: web-api
updatePolicy:
updateMode: "Off"
resourcePolicy:
containerPolicies:
- containerName: '*'
minAllowed:
cpu: 50m
memory: 64Mi
controlledResources: ["cpu", "memory"]
EOF
# 3. Let VPA observe, then read the recommended Target per container.
kubectl describe vpa/web-api-vpa Quick quiz
Question 1 of 5Why does an over-provisioned pod request cost money even when the pod is healthy and nothing is throttled?
You scored
0 / 5
Keep learning
Go deeper on how the Vertical Pod Autoscaler measures and recommends resource requests, and how it fits the wider AKS cost picture.
- Get AKS cost recommendations in Azure Advisor The Advisor cost recommendations for AKS, including enabling VPA recommendation mode to rightsize requests and limits.
- Use the Vertical Pod Autoscaler in AKS How to enable VPA, attach a VerticalPodAutoscaler, set the update mode and read recommendations.
- Vertical pod autoscaling in AKS overview What VPA is, its update modes including recommendation-only mode, and when to use each.
You can now treat AKS right-sizing as one capability rather than a vague sense that the cluster is too big: turn on the Vertical Pod Autoscaler in recommendation-only mode so it measures real usage and changes nothing, read the Target it recommends for each workload, apply the easy trims and review the latency-sensitive ones, then keep VPA running so the cluster stays sized to demand. The measurement is free, the easy wins recur every month, and the node count starts to track the work being done.
Back to the library