Skip to main content
compliance · azure

AKS node pools running at a fixed size because the cluster autoscaler is off

resource types
1
rule IDs covered
1
severity
medium

What does ZopNight detect here?

ZopNight flags an AKS node pool when Azure reports `enableAutoScaling` as false, so the cluster autoscaler never changes its node count. A fixed-size pool pays for its full size through quiet hours and cannot add nodes when pods are stuck pending. ZopNight files it as compliance with no priced saving, since the right bounds depend on the workload.

Signal and threshold

How ZopNight evaluates AKS node pools running at a fixed size because the cluster autoscaler is off.
Field Value
Rule IDsRC-1356
Categorycompliance
Severitymedium
Metricnone — pure configuration read
ThresholdenableAutoScaling = false
SourceZopNight
Permissions usedMicrosoft.ContainerService/managedClusters/agentPools/read

A node pool that never resizes

Each AKS node pool is backed by a set of VMs billed while they run. The cluster autoscaler watches for pods that cannot be scheduled because of resource constraints and adds nodes, then removes nodes that stay underused. With it off, the pool keeps whatever count you last set.

That fails in both directions. At night and at weekends the pool bills for capacity no pod requests. At peak, new pods sit in Pending until someone scales the pool by hand.

Listing pools with autoscaling off

Terminal window
az aks nodepool list --resource-group my-rg --cluster-name my-aks \
--query "[].{pool:name, mode:mode, autoscale:enableAutoScaling, nodes:count}" -o table

Rows with autoscale false are fixed-size pools. The mode column separates system pools from user pools, which usually deserve different bounds.

What ZopNight checks on each pool

The rule evaluates node pools individually, not whole clusters. It reads the pool’s live autoscaling state from Azure and fires only when that state is explicitly false. No utilization metric or window is required, because the finding is about the missing control, not about how busy the pool happens to be today.

Pools the rule does not flag

A pool whose autoscaling state Azure did not report is treated as unknown and skipped. Tags saying the autoscaler is on or off are ignored; only the pool’s real configuration counts. A pool with autoscaling on but a minimum equal to its maximum is not flagged here either, since the autoscaler is technically enabled.

No saving is claimed, only the missing control

This is a compliance finding without a dollar estimate: the saving from autoscaling depends on how far demand falls below today’s fixed count, and on the minimum you choose. The exposure is paying for idle nodes off-peak and failing to schedule pods on-peak.

Enabling the autoscaler on a pool

  1. Pick bounds. The minimum should cover your baseline and any pod disruption budgets; the maximum caps spend and must fit subnet IP space and vCPU quota.
  2. Enable it on the existing pool:
Terminal window
az aks nodepool update --resource-group my-rg --cluster-name my-aks \
--name userpool1 --enable-cluster-autoscaler --min-count 1 --max-count 5
  1. Check that pods set realistic CPU and memory requests. Microsoft notes the autoscaler scales up on pending pods rather than on node CPU or memory pressure, so scaling follows what pods request, not what they use.
  2. Watch scale events for a week and adjust the bounds with az aks nodepool update --update-cluster-autoscaler.

See it fire on your bill.

Connect an account read-only. The first findings land in minutes.

472 rule families across 353 resource types on 22 platforms. Every threshold, metric, and IAM action is documented on these pages before you grant anything.

472 rule families documented
353 resource types covered
read-only default access level
Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console· Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console·