If a Kubernetes HorizontalPodAutoscaler (HPA) keeps more replicas than the latest low metric reading seems to require, first check its scale-down stabilization window and policies, then inspect HPA conditions and Events, metric APIs, replica limits and other writers. For CPU-based scaling, also verify CPU requests and pod readiness. HPA intentionally delays and limits some reductions, so a higher replica count is not necessarily a stuck controller.
The exact behavior depends on the Kubernetes version and controller-manager configuration. Compare the live HPA specification and status with the documentation for your cluster rather than assuming every documented default is active.
As an Amazon Associate I earn from qualifying purchases.
What to inspect first when HPA will not scale down
Start with the HPA and the workload it controls. HPA adjusts a scalable target, such as a Deployment or StatefulSet; it cannot scale objects without a scale subresource, such as a DaemonSet. Use:
Free tools Windows power users keep installed
One-click scans. No signup required.
kubectl get hpa
kubectl describe hpa <name>
kubectl get deployment <target-name>
In the HPA output, compare the current and desired replica counts, target reference, minimum and maximum replicas, configured metrics and targets, Conditions, and recent Events. The current metric alone does not determine whether the target changes: HPA records recommendations and applies behavior rules before scaling.
#1 Best Overall
In kubectl describe hpa <name>, pay particular attention to these conditions:
AbleToScaleindicates whether HPA can retrieve or update the target scale and whether backoff-related conditions affect scaling.ScalingActiveindicates whether HPA is enabled and can calculate a desired scale. A false value commonly points to a metrics problem.ScalingLimitedindicates whether the desired replica count was constrained by a minimum or maximum boundary.
Events help distinguish metric retrieval or conversion failures from scale access, backoff, and replica-boundary issues. Kubernetes’ HPA walkthrough describes the conditions and inspection process.
Could the stabilization window be holding replicas up?
By default, HPA uses a 300-second (five-minute) scale-down stabilization window. It chooses the highest recommendation made during that window, so an earlier recommendation for more replicas can keep the desired count above what the newest low metric sample suggests. This is a deliberate buffer against rapid metric swings, not automatically evidence that the controller is stuck. The Kubernetes HPA concepts documentation and autoscaling/v2 API reference describe this behavior.
Recommended Free Tools
Rank #2
The cluster-wide default can be changed with the --horizontal-pod-autoscaler-downscale-stabilization controller-manager flag. A per-HPA value is set in spec.behavior.scaleDown.stabilizationWindowSeconds. The API allows 0 to 3600 seconds (one hour). A value of zero removes the history-based delay, but also removes that protection against rapid downscale changes. There is no universally correct window: choose one that balances timely reduction against the risk of reacting to a short-lived dip.
Can a scale-down policy slow or stop the reduction?
After calculating a desired count, HPA applies scale policies that limit how quickly replicas may be removed. The documented default scale-down policy permits removing all replicas above the minimum during its 15-second policy period. A custom policy may permit less, leading to a gradual reduction even after the desired count falls.
Inspect the live spec.behavior.scaleDown, including selectPolicy, rather than relying only on the manifest in source control. When multiple policies are configured, selectPolicy: Min selects the smallest permitted change; selectPolicy: Disabled disables HPA-driven scaling in that direction. These fields are documented in the autoscaling/v2 API reference. A conservative policy trades responsiveness for steadier replica changes.
Rank #3
Are metrics missing or unavailable?
HPA needs the metrics API appropriate to the configured metric:
metrics.k8s.iosupplies per-pod resource metrics such as CPU and memory, commonly through metrics-server.custom.metrics.k8s.iosupplies custom metrics, typically through a metrics adapter.external.metrics.k8s.iosupplies external metrics, also typically through an adapter.
The aggregation layer and the relevant API registration must be available for HPA to retrieve metrics. The Kubernetes HPA documentation explains the metrics API requirements. Check the metric named in the HPA, its reported current value and target, and Events for retrieval or conversion errors.
Missing data can specifically prevent a reduction. When recalculating a possible scale-down with missing pod metrics, HPA conservatively assumes those pods are using 100% of their target. With multiple configured metrics, it selects the largest desired replica count. If one metric cannot be converted to a desired count while another valid metric recommends scaling down, HPA skips the scale-down. Thus, an unavailable custom metric can block a reduction even if CPU is low. Resolve the API, adapter, or metric-query problem before changing stabilization settings.
Is the replica floor or another controller keeping the count up?
HPA will not reduce below minReplicas. Check the live HPA value and the ScalingLimited condition; if the minimum is the constraint, lower it only if the workload’s availability requirements permit. The allowed range and scaling behavior are described in the autoscaling/v2 API reference.
Also check for other systems writing replica counts. Repeatedly applying a workload manifest with a fixed spec.replicas can reset the target and make it fight with HPA. Kubernetes recommends removing that field from Deployment or StatefulSet manifests managed by HPA. Review deployment automation and any other controller that may write the scale subresource.
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Scan for outdated or missing drivers - takes under a minuteDriver Scan →Repair Windows errors before they cause bigger problemsFix Now →Why can CPU-based scale-down be smaller than expected?
CPU utilization is calculated relative to the CPU requests configured for containers. If a relevant container lacks a CPU request, utilization for that metric can be undefined. Check the workload’s requests as well as the CPU metric and target shown on the HPA.
HPA also treats not-yet-ready pods and startup CPU samples specially, and conservatively accounts for missing metrics. These safeguards can dampen the calculated change. The documented controller-manager defaults include a 30-second initial readiness delay and a five-minute CPU initialization period; these are cluster-wide settings, so verify the values used by the deployed control plane. A startup or readiness probe that reflects when the application has finished its startup CPU spike can help avoid misleading startup samples. See the Kubernetes HPA concepts documentation for the algorithm and startup handling.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.What changes when the workload scales to zero?
Scale-to-zero is a separate case. Current Kubernetes documentation describes it for HPA using object or external metrics with minReplicas: 0. CPU and memory resource metrics cannot trigger a scale-up from zero because no pods remain to provide those per-pod metrics.
The Kubernetes v1.37 announcement describes HPAScaleToZero as enabled by default in v1.37 and introduces the ScaledToZero condition to distinguish an HPA-managed zero-replica state from a manually paused workload. For this path, check the condition, metric availability, and feature support in both kube-apiserver and kube-controller-manager. During a version-skewed upgrade, wait until both components support the feature before setting minReplicas: 0. If an adapter cannot return the metric, HPA may show ScalingActive=False with a reason such as FailedGetExternalMetric. See the Kubernetes v1.37 scale-to-zero announcement for release-specific details.
Which settings should you change?
First identify the constraint; changing the wrong setting can hide the symptom without fixing its cause.
| Observed cause | Setting or check | Effect of changing it |
|---|---|---|
| Recent high recommendation delays reduction | behavior.scaleDown.stabilizationWindowSeconds or the controller-manager default |
A shorter window allows faster response to a dip but offers less protection against rapid metric fluctuation. |
| Replica count falls only gradually | behavior.scaleDown.policies and selectPolicy |
A less restrictive policy permits faster removal; a disabled policy prevents HPA scale-down. |
| Count stops at a lower bound | minReplicas |
A lower floor permits fewer replicas, subject to workload availability needs. |
| Metric errors or missing values appear | Metric API, adapter, registration, and query | Restores metric availability; changing timing policies does not repair a failed metric source. |
The autoscaling/v2 API reference documents a 10% default cluster-wide tolerance for small metric variations when tolerance is not set. It is an API configuration default, not a measured performance result. Check the behavior supported by the cluster version and its configuration before attributing a small difference to tolerance.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




