Dev/test AKS clusters running every node at on-demand rates
What does ZopNight detect here?
Spot VM node pools cut AKS compute costs by a measured 5–92% depending on SKU and region, and dev/test workloads tolerate the evictions. ZopNight flags non-production node pools whose spotEnabled metadata is not true, computing the discount from live on-demand and Spot rates. No rates, no claim.
Signal and threshold
| Field | Value |
|---|---|
| Rule IDs | RC-250 |
| Category | discount |
| Severity | low |
| Metric | none — pure configuration read |
| Source | aks_spot_nodepool.go |
Where it applies
Interruptible workloads on uninterruptible pricing
Dev and test clusters rebuild themselves constantly by nature: that eviction tolerance is exactly what Azure Spot pricing pays for, and most such clusters never claim it. The rule classifies a node pool as non-production through an evidence chain: an env-style dev or test tag is authoritative, a production tag suppresses a misleading name, and dev/test naming patterns serve only as fallback. Production pools are never flagged.
The already-Spot check reads the API, not labels
Whether a pool is already on Spot comes from the discoverer’s authoritative metadata (the agent pool’s scaleSetPriority property, stamped as spotEnabled), with a legacy customer tag consulted only when that metadata is absent. An earlier version read the tag alone, which the platform never writes, and would happily recommend Spot for a pool already running on it.
A discount computed, not quoted
Spot discounts vary wildly by SKU, region, and moment; flat marketing percentages are fiction. ZopNight derives the fraction from the live on-demand and Spot rates for the pool’s exact VM size, bounded between 5% and 92%, and abstains entirely when either rate is missing. The number on the finding is the number your region’s market currently offers.
Audit your pools’ priority
az aks nodepool list --cluster-name <cluster> -g <rg> \ --query "[].{pool:name, priority:scaleSetPriority, size:vmSize, count:count}" -o tableAny dev/test pool showing Regular (or null) priority is a candidate.
Add a Spot pool alongside, do not convert
Priority is immutable on an existing pool, and the recommendation is deliberately additive: create a Spot pool next to the current one, steer workloads onto it with node selectors and tolerations for the Spot taint, and keep a small on-demand pool for anything eviction-averse. System pools must stay on-demand, because AKS requires it. Handle evictions with graceful shutdown hooks; they arrive with 30 seconds of notice.
Signals that suppress the finding
A production classification, spotEnabled already true, an unpriced pool, or missing tier rates each return silence. Reader covers all the metadata involved; Cost Management Reader supplies the pool’s billed baseline.