October DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsWindows FixRecommendedWindows errors stealing your time? Find the fix fastScan stability, cleanup and performance issues.Fix NowOctober DealsAmazon USDeal season is back - check today's better picksAmazon US: current deals, useful picks and tech finds.See Picks×
Skip to content
World desk6 min

Kubernetes HPA Scale-Down Troubleshooting: Common Questions Answered

A practical, version-aware checklist for diagnosing why a Kubernetes HPA does not reduce replicas after demand falls.
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
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.

In kubectl describe hpa <name>, pay particular attention to these conditions:

  • AbleToScale indicates whether HPA can retrieve or update the target scale and whether backoff-related conditions affect scaling.
  • ScalingActive indicates whether HPA is enabled and can calculate a desired scale. A false value commonly points to a metrics problem.
  • ScalingLimited indicates 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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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.

Are metrics missing or unavailable?

HPA needs the metrics API appropriate to the configured metric:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • metrics.k8s.io supplies per-pod resource metrics such as CPU and memory, commonly through metrics-server.
  • custom.metrics.k8s.io supplies custom metrics, typically through a metrics adapter.
  • external.metrics.k8s.io supplies 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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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.Support on Ko-Fi

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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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.

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.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More from the Wire

  1. World desk4 min
    How to Spot an AI Voice Scam Before Sending MoneyDon’t rely on how a caller sounds. Pause, call back through a known number, and verify the emergency with another trusted person before sending money.
  2. Mountain View desk4 min
    Google’s SynthID Detector: How to Check AI-Generated Images, Video and AudioGoogle’s SynthID Detector looks for an embedded watermark in supported images, video and audio. Here is what its results do—and do not—show.
  3. Redmond desk20 min
    How to create a link to File or Folder in Windows 11Windows 11 gives you several ways to point to a file or folder without moving or duplicating it. You can create a desktop shortcut,…
Recommended PC Tool
Recommended PC Tool
Crashes, No Sound, or Screen Glitches?Free driver scan
Windows Errors? Fix Them Before They SpreadFree repair scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.