The Quiet Drain: How Oversized Azure AKS Node Pools Cost Us 55% More
"Why are our Azure costs for AKS consistently climbing, even when our traffic is stable?"
It was a question that haunted our weekly FinOps meetings. Our Azure Kubernetes Service (AKS) clusters were the backbone of our microservices architecture, and they were supposed to be the epitome of cloud efficiency. Yet, month after month, the bills for our AKS node pools kept inching upwards. We were using powerful DSv3 nodes across our clusters, chosen for their robust performance and the promise of future scalability.
The initial thought was always: scaling issue. Maybe a new feature had driven up demand, or an unexpected spike in users. But every time we dug into application metrics, everything seemed... normal. Our services were performing well, latency was low, and pod replica counts were stable. The mystery deepened: if our applications weren't consuming more, where was the money going?
This subtle, persistent cost creep wasn't a sudden explosion like a misconfigured AI training run, but a slow, quiet drain on our budget, eroding our cloud cost discipline one dollar at a time.

The 'Just-in-Case' Trap: Why Bigger Isn't Always Better
Our initial provisioning strategy for AKS node pools was rooted in a common philosophy: over-provision for safety. We selected DSv3 nodes—high-performance, general-purpose VMs—thinking they would easily handle any workload spikes and provide ample headroom for growth. The idea was to avoid resource starvation and ensure a smooth experience for our users.
We had Azure's built-in Cluster Autoscaler enabled, which worked as expected for scaling the *number* of nodes within a given node pool. If demand increased, new nodes would spin up. If it decreased, they would scale down. Or so we thought. The problem wasn't the *quantity* of nodes, but the *quality* (or rather, the SKU) of each node. Even when the Cluster Autoscaler scaled down, it was still leaving us with expensive DSv3 nodes that were significantly underutilized.
We tried adjusting pod requests and limits, hoping to pack more pods onto fewer nodes. We even experimented with increasing replica counts to try and "fill up" the nodes. But the core issue remained: the nodes themselves were simply too powerful for the steady-state workloads running on them. It felt like driving a race car to pick up groceries – powerful, but completely inefficient for the task at hand.
The Blatant Truth: <20% CPU Utilization
The 'Aha!' moment arrived when we finally shifted our focus from application-level metrics to node-level resource utilization. We pulled up detailed CPU and memory graphs for our AKS node pools, specifically looking at the underlying VM instances. What we saw was startling: a consistent, abysmal less than 20% CPU utilization across most of our DSv3 nodes. Some nodes were even lower, hovering around 10-15% for extended periods.
This wasn't a temporary dip; it was the norm. Our workloads, while important, simply weren't demanding enough to justify the beefy DSv3 machines we had provisioned. We were paying for high-octane performance that our applications rarely, if ever, consumed. The difference between requested resources by pods and the actual utilization of the underlying nodes was vast, leading to immense waste.
It was a classic case of over-provisioning at the infrastructure layer, where a smaller, more cost-effective node SKU would have been perfectly adequate for the majority of our operational time, with burst capacity handled by temporary scaling if absolutely necessary. The expensive 'safety net' had become an enormous, unnecessary cost center.


Beyond Basic Auto-Scaling: The Need for Intelligent Node Pool Management
Our existing Cluster Autoscaler was doing its job, but it had a blind spot: it couldn't tell us if the *type* of node it was scaling was appropriate for the actual workload. It would just spin up more DSv3 nodes, perpetuating the overspending cycle. The native Azure monitoring and FinOps tools, while helpful for broad trends, didn't offer the granular, actionable insights we needed to optimize at the node SKU level.
We considered manually reconfiguring node pools to use smaller SKUs, but the prospect was daunting. It involved careful workload analysis, understanding potential performance impacts, and orchestrating a migration without downtime—all while trying to keep up with new feature development. The risk of picking the wrong size and causing performance regressions or, conversely, still overspending, was high. It felt like walking a tightrope with a blindfold on, hoping for the best.
This is where EazyOps stepped in. We needed more than just automated scaling; we needed intelligent optimization that understood our workloads and could make prescriptive, data-driven recommendations that went beyond simple pod-to-node ratios.
The EazyOps Solution: Precision Right-Sizing and Aggressive Scale-Down
EazyOps' approach was refreshingly holistic. Instead of just looking at current requests, they performed a deep analysis of our historical workload patterns, identifying peak demands, average usage, and idle periods across all our services. Their recommendation was clear: our DSv3 nodes were significantly oversized for the majority of our applications. The solution wasn't just to scale better, but to scale with the *right* resources.
The strategy involved two key components:
- Intelligent Node Pool Rightsizing: EazyOps helped us restructure our AKS clusters, moving away from a 'one size fits all' DSv3 approach. We introduced smaller, more cost-effective node SKUs like Dsv2 and even B-series (for less critical dev/test environments) where appropriate. This meant creating dedicated node pools tailored to specific workload characteristics, ensuring workloads landed on VMs that matched their true resource consumption.
- Aggressive Auto-Scale Down Policies: This was the game-changer. EazyOps fine-tuned our Cluster Autoscaler configuration, implementing more aggressive scale-down thresholds and shorter cooldown periods. Crucially, they also configured node pool auto-scaling to prioritize the removal of idle or least-utilized nodes, ensuring that we weren't stuck paying for expensive DSv3 instances when demand dropped.
This combined strategy meant that our clusters could still burst to handle peak loads by scaling out to DSv3 nodes if needed for specific demanding workloads, but would quickly contract to a highly efficient, right-sized configuration during off-peak hours, primarily using the most appropriate (and affordable) node types for baseline operations.

The Game-Changing Results: A Staggering 55% Cost Reduction
The impact was almost immediate and undeniably impressive. Within weeks of implementing EazyOps' recommendations and policies, our Azure AKS costs plummeted. We saw a remarkable 55% reduction in our overall AKS cluster spending. This wasn't just a minor tweak; it was a fundamental shift in our cost profile.
- Cost Savings: A consistent 55% month-over-month reduction in AKS infrastructure bills, freeing up significant budget for other innovation.
- Improved Utilization: Average node CPU utilization jumped from below 20% to a healthy 60-75% during peak times, and scaled down efficiently to minimal active nodes during low usage periods.
- Operational Efficiency: Our platform team spent less time manually chasing down cost anomalies and more time on strategic initiatives, confident that our clusters were running optimally.
- Performance Stability: Despite using smaller nodes for baseline workloads, performance remained robust, as the right node types were selected for specific demands, and the autoscaler efficiently provisioned more powerful nodes when truly necessary, ensuring no compromise on service quality.
The days of mystery cost creep were over. We finally had clear visibility and proactive control over our AKS infrastructure spend, turning a silent drain into a significant saving and proving that true optimization often comes from looking beyond the obvious solutions.
Key Takeaways for Your AKS Clusters
- Don't blindly over-provision: While a 'just-in-case' mentality can seem safe, it's often a silent killer of your cloud budget. Always validate node sizing against actual workload metrics, not just perceived future needs.
- Node SKU matters as much as node count: Auto-scaling the *number* of nodes is only half the battle. Ensuring you're using the *right VM series and size* for your specific workloads is critical for true efficiency. Don't be afraid to mix node pool types.
- Aggressive auto-scale down is essential: Don't be afraid to let your clusters shrink when demand is low. Modern orchestrators and auto-scalers are designed to handle this gracefully and safely.
- Continuous monitoring and optimization are key: Workloads evolve, and so should your infrastructure. Regularly review node utilization and cost reports to adapt your strategy, as static configurations will lead to renewed waste.
- Specialized expertise pays off: Bringing in experts like EazyOps for deep analysis and fine-tuning can uncover significant savings that generic approaches or basic cloud tools often miss.
What's Next: The Future of Cloud Cost Optimization
Our journey with oversized AKS node pools taught us that cloud cost optimization is an ongoing process, not a one-time fix. As our services continue to evolve and new technologies emerge, we're constantly looking for ways to run leaner and smarter.
The next frontier involves leveraging even more sophisticated AI-driven analytics to predict workload patterns, dynamically adjust node pools based on real-time and forecasted demand, and integrate cost considerations deeper into our CI/CD pipelines. This ensures that efficiency is baked in from the start.
At EazyOps, we're dedicated to helping organizations navigate these complexities. We empower teams to confidently build and scale on the cloud without the fear of hidden costs or underutilized resources. This ensures you can innovate faster, knowing your infrastructure is optimized for both performance and budget.
About Shujat
Shujat is a Senior Backend Engineer at EazyOps, working at the intersection of performance engineering, cloud cost optimization, and AI infrastructure. He writes to share practical strategies for building efficient, intelligent systems.