The AKS cost conversation almost always happens in the wrong order. A cluster
runs for six months, finance flags the line item, and someone is asked to "look
into Kubernetes spend." By then the expensive decisions are load-bearing and the
cleanup is a project. The teams who don't have this conversation made a different
set of choices on day zero, and none of them were exotic.
Cost on AKS isn't something you optimize after the fact. It's something your
architecture either has or lacks.
Where the money actually goes
Forget the per-cluster fee; it's noise. Your bill is overwhelmingly nodes:
VMs you pay for whether or not your pods use them. Which means AKS cost reduces
to one question: how much of the compute you're renting is doing real work?
Three things quietly drive that ratio down.
1. Idle capacity from bad bin-packing. Kubernetes schedules pods onto nodes
using their resource requests. If your pods request far more than they use, the
scheduler "fills" nodes that are mostly empty, and you buy more nodes to hold air.
A cluster at 25% real utilization is paying 4x for its actual workload.
2. Missing or fictional requests and limits. Pods with no requests are a
scheduling gamble; pods with copy-pasted requests are a budgeting fiction. Either
way the autoscaler, which reacts to requests, not reality, makes node decisions
on bad data and over-provisions to stay safe.
3. One undifferentiated node pool. When every workload runs on the same
general-purpose, on-demand VMs, you pay premium on-demand prices for batch jobs
that could run on spot, and you pay for memory-heavy SKUs to host CPU-bound
services.
You don't reduce AKS cost by turning things off. You reduce it by making the
compute you rent actually correspond to the work you do.
The day-zero moves
None of these are heroics. They're defaults you set before the cluster has
opinions of its own.
- Right-size requests against real usage. Measure, then set requests near
actual consumption with honest limits. This single discipline does more for
the bill than any negotiation with finance.
- Tier your node pools by workload shape. A system pool for the essentials,
a general pool for services, a spot pool for interruptible and batch work, and
memory- or CPU-optimized pools where the workload clearly calls for it. Let
scheduling send work to the cheapest place it can correctly run.
- Mix your purchase models deliberately. Reserved or savings-plan capacity
for the steady baseline you'll run for a year anyway; on-demand for the
variable middle; spot for the interruptible top. Paying on-demand rates for a
baseline that never changes is the most common avoidable overspend.
- Make cost visible per team from the start. Namespaces and labels that map
to owners turn "Kubernetes is expensive" into "this team's batch job is
expensive," which is a sentence someone can actually act on.
The takeaway
The cluster that's cheap in year two is the one that was legible in week one,
where requests meant something, node pools matched workloads, and every
namespace had an owner who could see its cost. You can retrofit all of this, and
plenty of teams eventually do. It's just far more expensive than designing it in,
which is exactly the kind of irony Kubernetes specializes in.