Cost Optimization

    How Do You Reduce Azure Container Services Costs?

    Reduce Azure container costs across AKS, ACI, Container Apps, and serverless by right-sizing nodes, adopting Spot infrastructure, selecting the right platform per workload, and applying commitment discounts.

    Spotto
    February 2026
    40 min read

    Container services sprawl is a top cost driver in Azure environments. Organizations adopt AKS for orchestration, ACI for burst workloads, Container Apps for event-driven microservices, and Azure Functions for serverless compute -- often running all four simultaneously across multiple subscriptions. Each platform has a different pricing model, and without deliberate governance the result is over-provisioned node pools, idle clusters running around the clock, platform mismatches where a cheaper service would suffice, and missing commitment discounts on the underlying compute.

    Based on what we typically see, the most effective optimizations fall into six categories: right-sizing pods and nodes to eliminate wasted capacity, adopting Spot and interruptible infrastructure for fault-tolerant workloads, selecting the correct platform per workload instead of defaulting to AKS for everything, applying Reserved Instances and Savings Plans to the underlying VMs, scheduling non-production clusters to stop outside business hours, and establishing cost visibility through namespace-level chargeback and budget alerts. Spotto's cloud optimization platform continuously identifies these overprovisioned container configurations and platform mismatches, surfacing targeted recommendations that can reduce container costs by 40-70% without impacting workload performance.

    Key Takeaways at a Glance:

    AKS node pool right-sizing and Spot adoption together eliminate 40-60% of cluster compute costs
    Platform selection matters -- running a low-traffic API on AKS when Container Apps would cost 80% less is one of the most common mistakes
    Commitment discounts (Reserved Instances and Savings Plans) on AKS node VMs deliver 30-50% savings on baseline compute
    Dev/test AKS clusters that run 24/7 but are only used during business hours waste 65-75% of their compute spend
    Namespace-level cost visibility and budget alerts prevent cost drift from recurring after optimization

    What Problem This Solves

    Container Services Sprawl Drives Invisible Cost Growth

    Azure container costs are distributed across compute, networking, storage, and platform fees. Unlike a single VM where cost attribution is straightforward, container costs fragment across node pools, load balancers, persistent volumes, container registries, and egress charges. This fragmentation makes it difficult to identify waste without dedicated tooling.

    Common container cost problems:

    Over-provisioned AKS node pools. Nodes sized for peak load run 24/7 at 15-30% average CPU utilization. The gap between requested resources and actual usage is pure waste.
    Wrong platform for the workload. A simple HTTP API running on a 3-node AKS cluster when a single Container App instance would handle the same traffic at a fraction of the cost.
    No commitment discounts on AKS node VMs. AKS nodes are standard VMs that qualify for Reserved Instances and Savings Plans, but many organizations pay on-demand rates for predictable baseline workloads.
    Dev/test clusters running outside business hours. Non-production AKS clusters that run 24/7 when they are only needed 10-12 hours per weekday waste 65-75% of their compute spend.
    ACI containers left running after batch jobs complete. Orphaned ACI container groups that were deployed for a one-time task and never cleaned up continue to bill per-second.
    Premium storage tiers attached to non-critical workloads. Persistent volumes provisioned with Premium SSD when Standard SSD or Standard HDD would meet the IOPS requirements.
    Cross-region egress from misconfigured service meshes. Container-to-container traffic routed across regions instead of staying within the same region or availability zone.

    Container Platform Cost Comparison

    PlatformPricing ModelBest ForControl Plane CostTypical Monthly (Small Workload)
    AKSVM node pools (pay for VMs)Complex multi-service workloads, stateful apps, custom networkingFree (Standard tier: $0.10/hr)$200-$2,000+
    ACIPer-second vCPU + memoryShort-lived tasks, burst compute, sidecar containersNone$5-$500
    Container AppsPer-second vCPU + memory (consumption) or dedicated planHTTP APIs, event-driven microservices, background processorsNone (consumption)$0-$300
    Azure FunctionsPer-execution + GB-seconds (consumption) or premium planEvent triggers, lightweight APIs, scheduled tasksNone (consumption)$0-$200
    ARO (Azure Red Hat OpenShift)VM node pools + ARO service feeEnterprises requiring OpenShift compatibility, Red Hat support~$0.35/hr per worker node$1,500-$10,000+

    Key insight: The cheapest container platform depends entirely on your workload pattern. A workload that handles 10 requests per minute does not need AKS. A workload that handles 10,000 requests per second with custom networking likely does. Matching platform to workload is the single highest-leverage optimization.

    AKS Cost Optimization Priority Flowchart

    AKS Cost Optimization Priority Flowchart
    ==========================================
    
    [Start] Is this workload running on AKS?
      |
      +-- Does it NEED AKS? (custom networking, stateful, multi-service)
      |     |
      |     +-- NO --> Evaluate Container Apps or Functions (potential 60-80% savings)
      |     |
      |     +-- YES --> Continue to AKS optimizations
      |           |
      |           +-- [1] Are node pools right-sized?
      |           |     |
      |           |     +-- Avg CPU < 40% --> Right-size VMs or enable cluster autoscaler
      |           |     +-- Avg CPU 40-70% --> OK, move to next check
      |           |     +-- Avg CPU > 70% --> Consider scaling up (performance risk)
      |           |
      |           +-- [2] Are Spot node pools used for fault-tolerant workloads?
      |           |     |
      |           |     +-- NO --> Add Spot node pool for batch, dev/test, stateless (60-90% savings)
      |           |     +-- YES --> Move to next check
      |           |
      |           +-- [3] Are commitment discounts applied to baseline nodes?
      |           |     |
      |           |     +-- NO --> Apply 1-year RI or Savings Plan (30-40% savings)
      |           |     +-- YES --> Move to next check
      |           |
      |           +-- [4] Is Arm64 viable for any workloads?
      |           |     |
      |           |     +-- YES --> Migrate to Dpsv6/Epsv6 Arm64 nodes (20-30% cheaper)
      |           |     +-- NO --> Move to next check
      |           |
      |           +-- [5] Are dev/test clusters running 24/7?
      |           |     |
      |           |     +-- YES --> Schedule cluster stop/start (65-75% savings)
      |           |     +-- NO --> Move to next check
      |           |
      |           +-- [6] Are PV storage tiers aligned to workload needs?
      |           |     |
      |           |     +-- Premium on non-critical --> Downgrade to Standard (40-60% savings)
      |           |     +-- Aligned --> Move to next check
      |           |
      |           +-- [7] Is namespace-level cost visibility in place?
      |                 |
      |                 +-- NO --> Enable AKS Cost Analysis add-on + budgets
      |                 +-- YES --> Optimization complete, monitor for drift

    How It Works

    Right-Sizing: Pods, Nodes, and Scale-to-Zero

    Right-sizing is the foundation of container cost optimization. In Kubernetes, waste occurs at two levels: the gap between pod resource requests and actual usage, and the gap between node capacity and the sum of pod requests. Both gaps compound -- oversized pod requests lead to underutilized nodes, which lead to more nodes than necessary.

    Pod-level right-sizing:

    Review resources.requests and resources.limits against actual P95 usage from Prometheus/Container Insights
    Use Vertical Pod Autoscaler (VPA) in recommendation mode to identify oversized requests
    Set requests to P95 actual usage + 20% buffer; set limits to 2x requests for burst headroom

    Node-level right-sizing:

    Enable the cluster autoscaler with appropriate min/max node counts per pool
    Match VM SKU to workload profile -- memory-optimized for caches, compute-optimized for CPU-bound processing
    Avoid D-series general-purpose VMs when B-series burstable VMs would suffice for low-utilization workloads

    ACI right-sizing:

    ACI bills per-second for allocated vCPU and memory, not actual usage
    Profile container resource consumption and reduce allocated vCPU/memory to match actual peak + 15% buffer
    Terminate ACI container groups promptly after batch jobs complete -- do not leave them running

    Container Apps scale-to-zero:

    Container Apps on the consumption plan can scale to zero replicas when there is no traffic. This is the primary cost advantage over AKS for low-traffic workloads.

    ScenarioAKS Cost (3-node minimum)Container Apps Cost (scale-to-zero)Savings
    API with 100 req/day~$350/mo (3x D2s_v5)~$5/mo99%
    API with 10K req/day~$350/mo (3x D2s_v5)~$30/mo91%
    API with 1M req/day~$350/mo (3x D2s_v5)~$180/mo49%
    API with 10M req/day~$700/mo (3x D4s_v5)~$900/moAKS cheaper

    Crossover point: Container Apps becomes more expensive than AKS at approximately 5-10M requests per day for a typical API workload. Below that threshold, scale-to-zero economics strongly favour Container Apps. Above it, AKS with right-sized nodes and commitment discounts is more cost-effective.

    Spot and Interruptible Infrastructure

    Azure Spot VMs offer 60-90% discounts compared to on-demand pricing. AKS supports Spot node pools natively, and ACI supports Spot container groups for batch workloads. The trade-off is that Spot resources can be evicted with 30 seconds notice when Azure needs the capacity.

    AKS Spot node pool pricing (East US, representative):

    VM SKUOn-Demand ($/hr)Spot Price ($/hr)DiscountMonthly Savings (per node)
    D4s_v5 (4 vCPU, 16 GB)$0.192$0.03880%~$112
    D8s_v5 (8 vCPU, 32 GB)$0.384$0.07780%~$224
    D16s_v5 (16 vCPU, 64 GB)$0.768$0.15480%~$447
    E8s_v5 (8 vCPU, 64 GB)$0.504$0.10180%~$294

    Workloads suitable for Spot node pools:

    Batch processing and data pipelines that can checkpoint and resume
    Dev/test and CI/CD build agents
    Stateless microservices behind a load balancer with multiple replicas
    Machine learning training jobs with checkpointing
    Queue-processing workers that can drain gracefully

    ACI Spot containers:

    ACI also supports Spot pricing for container groups. Spot ACI is priced at up to 70% less than regular ACI. Suitable for batch jobs, data processing, and any workload that can tolerate interruption. Unlike AKS Spot nodes, ACI Spot containers do not automatically restart -- your orchestration logic must handle re-submission.

    # Create an AKS Spot node pool
    az aks nodepool add \
      --resource-group myResourceGroup \
      --cluster-name myAKSCluster \
      --name spotnodepool \
      --priority Spot \
      --eviction-policy Delete \
      --spot-max-price -1 \
      --node-vm-size Standard_D4s_v5 \
      --node-count 3 \
      --min-count 0 \
      --max-count 10 \
      --enable-cluster-autoscaler \
      --labels kubernetes.azure.com/scalesetpriority=spot \
      --node-taints kubernetes.azure.com/scalesetpriority=spot:NoSchedule
    
    # Deploy workload with Spot toleration
    # In your Kubernetes deployment YAML:
    # spec:
    #   tolerations:
    #   - key: "kubernetes.azure.com/scalesetpriority"
    #     operator: "Equal"
    #     value: "spot"
    #     effect: "NoSchedule"
    #   affinity:
    #     nodeAffinity:
    #       requiredDuringSchedulingIgnoredDuringExecution:
    #         nodeSelectorTerms:
    #         - matchExpressions:
    #           - key: "kubernetes.azure.com/scalesetpriority"
    #             operator: "In"
    #             values:
    #             - "spot"

    Failure mode warning: Never run stateful workloads (databases, message brokers) on Spot nodes unless they have built-in replication and can survive node eviction. Spot eviction gives only 30 seconds notice. Use eviction-policy: Delete to ensure evicted nodes are replaced cleanly by the autoscaler.

    Architecture and Platform Selection

    Platform selection is the highest-leverage optimization because it determines the baseline cost structure. Migrating a workload from the wrong platform to the right one can deliver 50-90% savings without any code changes.

    ARO to AKS migration:

    Azure Red Hat OpenShift (ARO) carries a per-worker-node service fee on top of VM costs. For organizations that do not require OpenShift-specific features (Operator Hub, Red Hat support, OpenShift Routes), migrating to AKS eliminates the ARO service fee entirely. The underlying Kubernetes workloads are largely compatible.

    ComponentARO (4 workers, D8s_v5)AKS Free Tier (4 nodes, D8s_v5)AKS + Spot (2 on-demand + 2 Spot)
    Compute (VMs)$1,119/mo$1,119/mo$671/mo
    Control plane (3 masters)$840/mo (included in ARO)$0 (Free tier)$0 (Free tier)
    ARO service fee$1,022/mo ($0.35/hr x 4 workers)$0$0
    Infrastructure VMs (masters)$840/mo (3x D8s_v5)$0 (managed)$0 (managed)
    Load balancer$18/mo$18/mo$18/mo
    Total$3,839/mo$1,137/mo$689/mo

    Functions to AKS consolidation:

    While Functions is cheaper than AKS for low-volume workloads, organizations that run dozens of Function Apps on Premium plans may be paying more than consolidating those workloads onto a right-sized AKS cluster. The crossover point is typically 10-15 Premium Function App instances -- at that scale, a single AKS cluster with appropriate node sizing is cheaper and provides better resource utilization.

    Arm64 node pools:

    Azure offers Arm64-based VMs (Dpsv6, Epsv6 series) that provide approximately 20-30% better price-performance than equivalent x86 VMs. For workloads that run on Linux containers with Arm64-compatible images, migrating to Arm64 node pools reduces cost per vCPU-hour.

    Comparisonx86 (D4s_v5)Arm64 (Dpsv6 equivalent)Savings
    vCPU / Memory4 vCPU / 16 GB4 vCPU / 16 GB--
    On-demand price~$0.192/hr~$0.154/hr~20%
    Monthly (730 hrs)~$140~$112~$28/node

    Prerequisite: Your container images must be built for linux/arm64. Most Go, Java, Node.js, and Python workloads compile cleanly for Arm64. Check your base images and any native dependencies before migrating. Use multi-arch Docker builds to maintain compatibility across both architectures.

    Commitment Discounts

    AKS node pools are backed by standard Azure VMs, which means they qualify for Reserved Instances (RIs) and Azure Savings Plans. For predictable baseline workloads, commitment discounts are one of the simplest and most impactful optimizations -- no code changes, no architecture changes, just a purchasing decision.

    RI and Savings Plan comparison for AKS node VMs:

    Commitment Type1-Year Discount3-Year DiscountFlexibilityBest For
    Reserved Instance~30-40%~55-65%Locked to VM family + region (instance size flexibility within family)Stable AKS clusters with predictable node sizes
    Compute Savings Plan~25-35%~45-55%Applies across VM families, regions, and services (AKS, VMs, Functions Premium)Organizations evolving their AKS node sizes or adding new clusters

    Azure Hybrid Benefit (AHB) for Windows containers:

    Organizations running Windows containers on AKS Windows node pools can apply Azure Hybrid Benefit to eliminate the Windows Server license cost component of the VM price. This typically saves 40-45% on Windows node VMs. AHB requires existing Windows Server licenses with active Software Assurance or Windows Server subscription.

    ACI and Container Apps commitment plans:

    ACI: ACI supports Savings Plans that apply to the per-second vCPU and memory charges. Organizations running consistent ACI workloads should evaluate commitment coverage.
    Container Apps (Dedicated plan): Container Apps on the Dedicated workload profile plan run on underlying compute that can be covered by Savings Plans. Consumption plan billing is not eligible for commitment discounts.
    # Check current AKS node pool VM SKUs to plan commitment purchases
    az aks nodepool list \
      --resource-group myResourceGroup \
      --cluster-name myAKSCluster \
      --query "[].{Name:name, VmSize:vmSize, Count:count, Mode:mode, Priority:scaleSetPriority}" \
      -o table
    
    # Output example:
    # Name          VmSize          Count  Mode    Priority
    # system        Standard_D4s_v5 3      System  Regular
    # workerpool    Standard_D8s_v5 5      User    Regular
    # spotpool      Standard_D8s_v5 4      User    Spot
    #
    # Commitment recommendation:
    # - Cover the 3 system nodes (D4s_v5) with RIs (stable, predictable)
    # - Cover 3-4 of the 5 workerpool nodes with Savings Plan (allows flexibility)
    # - Do NOT cover Spot nodes (they are already 60-80% discounted)
    
    # Apply Azure Hybrid Benefit to Windows node pool
    az aks nodepool update \
      --resource-group myResourceGroup \
      --cluster-name myAKSCluster \
      --name winnodepool \
      --enable-ahub

    Important: Do not purchase commitment discounts for Spot node pool VMs. Spot VMs already receive a 60-90% discount. Reservations and Savings Plans should only cover on-demand (Regular priority) node pool VMs. Over-purchasing commitments leads to idle reserved capacity that wastes money.

    Scheduling: Cluster Start/Stop

    AKS supports stopping and starting clusters, which deallocates all node pool VMs while preserving the cluster configuration and persistent volumes. For dev/test and staging clusters that are only needed during business hours, this eliminates compute costs during nights and weekends.

    AKS Cluster Start/Stop Savings Model
    ======================================
    
    Scenario: Dev/test AKS cluster, 3x D4s_v5 nodes
    On-demand cost: 3 x $0.192/hr = $0.576/hr
    
    Running 24/7:       $0.576 x 730 hrs = $420/mo
    Running 10hrs x 5 days: $0.576 x 217 hrs = $125/mo
    Savings:            $295/mo (70%)
    
    For 5 dev/test clusters: $1,475/mo savings = $17,700/year
    
    # Stop a cluster (deallocates all node VMs)
    az aks stop --resource-group myResourceGroup --name myDevCluster
    
    # Start a cluster (reallocates node VMs)
    az aks start --resource-group myResourceGroup --name myDevCluster
    
    # Automate with Azure Automation or Logic Apps:
    # Schedule stop at 7 PM, start at 7 AM, skip weekends
    What stops: All node pool VMs are deallocated. No compute charges accrue. The control plane remains in a stopped state.
    What persists: Cluster configuration, persistent volumes (disks), container registry images, and IP addresses (if static).
    What does not persist: In-memory state, ephemeral storage, and any workloads running at the time of stop.
    Start time: Cluster restart typically takes 3-5 minutes for the control plane and 5-10 minutes for all nodes to become ready.

    Failure mode warning: Do not stop production clusters. Cluster stop deallocates all VMs and terminates all running workloads. This feature is designed exclusively for non-production environments. For production cost optimization, use the cluster autoscaler to scale down during off-peak hours instead.

    Storage and Network Optimization

    Storage and egress costs are often overlooked in container environments but can represent 10-25% of the total container bill, particularly for stateful workloads and multi-region deployments.

    Persistent Volume tier alignment:

    Kubernetes StorageClasses in AKS default to Premium SSD (managed-premium) or Premium SSD v2. Many workloads (logging, archival, low-IOPS databases) do not need Premium performance and can run on Standard SSD or even Standard HDD.

    Disk Tier256 GB Monthly CostMax IOPSBest For
    Premium SSD (P15)~$38/mo1,100Production databases, latency-sensitive workloads
    Standard SSD (E15)~$19/mo500General workloads, web servers, dev/test databases
    Standard HDD (S15)~$8/mo500Logging, backups, archival, low-priority batch

    Cross-region egress optimization:

    Co-locate dependent services in the same region and availability zone to avoid inter-region egress charges (~$0.02-$0.05/GB)
    Use topology-aware routing in Kubernetes to prefer same-zone endpoints for service-to-service traffic
    Configure container registry geo-replication to pull images from the local region instead of cross-region
    Compress inter-service payloads (gzip/brotli) to reduce egress volume for chatty microservices

    Cost Visibility and Governance

    Without namespace-level cost visibility, container cost optimization is a one-time effort that drifts. Establishing continuous visibility ensures that savings are maintained and new waste is caught early.

    AKS Cost Analysis add-on:

    Enable the AKS Cost Analysis add-on to break down cluster costs by namespace, node pool, and workload
    Integrate with Azure Cost Management to set namespace-level budgets and alerts
    Use cost allocation tags on node pools to attribute costs to specific teams or projects

    Budget alerts:

    Set Azure Cost Management budgets per resource group or subscription for container resources
    Configure alerts at 80%, 100%, and 120% of budget to catch unexpected cost growth
    Use action groups to trigger automated responses (e.g., scale down non-critical workloads when budget is exceeded)

    Managed Prometheus and Grafana:

    Deploy Azure Managed Prometheus to collect resource utilization metrics across all AKS clusters
    Build Grafana dashboards showing CPU/memory utilization vs requests at the pod and node level
    Alert on sustained low utilization (<30% CPU for 7+ days) as a trigger for right-sizing review

    Namespace governance:

    Enforce resource quotas on each namespace to prevent any single team from consuming unbounded resources
    Require resource requests and limits on all pod specs using admission controllers or Azure Policy
    Implement chargeback or showback reporting so teams see the cost of their namespace consumption
    # Enable AKS Cost Analysis add-on
    az aks update \
      --resource-group myResourceGroup \
      --name myAKSCluster \
      --enable-cost-analysis
    
    # Create a resource quota for a namespace
    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: team-alpha-quota
      namespace: team-alpha
    spec:
      hard:
        requests.cpu: "8"
        requests.memory: 32Gi
        limits.cpu: "16"
        limits.memory: 64Gi
        pods: "50"
    EOF
    
    # Set up budget alert via Azure CLI
    az consumption budget create \
      --budget-name aks-monthly-budget \
      --amount 5000 \
      --category cost \
      --resource-group myResourceGroup \
      --time-grain monthly \
      --start-date 2026-02-01 \
      --end-date 2027-01-31

    Five Anti-Patterns to Avoid

    1. Defaulting everything to AKS. AKS is the right choice for complex, multi-service workloads. It is the wrong choice for a single API endpoint handling 1,000 requests per day. Evaluate Container Apps and Functions first for simple workloads -- the TCO difference can be 80-95%.
    2. Over-requesting pod resources "just in case." Setting CPU requests to 4 cores when the pod uses 0.3 cores on average forces the scheduler to allocate 4 cores worth of node capacity. This cascades into more nodes than necessary. Use VPA recommendations to right-size requests to actual usage + buffer.
    3. Running dev/test clusters 24/7. A 3-node dev AKS cluster costs ~$420/mo running continuously but only ~$125/mo with business-hours scheduling. Across 5 dev/test clusters, that is $17,700/year wasted on idle compute.
    4. Ignoring commitment discounts for AKS node VMs. AKS nodes are regular VMs that qualify for RIs and Savings Plans. Organizations that pay on-demand rates for stable baseline AKS nodes are overpaying by 30-50%. Cover your baseline, use Spot for burst, pay on-demand only for the gap.
    5. Not cleaning up orphaned ACI container groups. ACI bills per-second while the container group exists and is running. Batch jobs deployed via ACI that are not terminated after completion continue to accrue charges. Implement lifecycle management to auto-delete completed container groups.

    Cost Impact Summary

    RecommendationTypical SavingsComplexity
    Right-size pod resource requests15-30%Medium
    Right-size AKS node pool VM SKUs10-25%Medium
    Enable cluster autoscaler10-20%Low
    Add Spot node pools for fault-tolerant workloads60-90% per nodeMedium
    ACI Spot for batch workloads50-70%Low
    Migrate low-traffic APIs from AKS to Container Apps60-95%High
    Migrate ARO to AKS70-90%High
    Consolidate Functions Premium to AKS20-40%High
    Migrate to Arm64 node pools20-30%Medium
    Apply Reserved Instances to baseline AKS nodes30-40% (1yr) / 55-65% (3yr)Low
    Apply Compute Savings Plans25-35% (1yr) / 45-55% (3yr)Low
    Azure Hybrid Benefit for Windows nodes40-45%Low
    Schedule dev/test cluster stop/start65-75%Low
    Downgrade PV from Premium to Standard SSD40-60% per diskLow
    Downgrade PV from Standard SSD to Standard HDD50-60% per diskLow
    Reduce cross-region egressVariable (depends on traffic)Medium
    Enable AKS Cost Analysis add-onIndirect (enables other savings)Low
    Enforce namespace resource quotasIndirect (prevents drift)Low
    Terminate orphaned ACI container groups100% of orphaned spendLow

    Common Questions

    1. When should I use AKS vs Container Apps vs ACI?

    Use AKS when you need full Kubernetes control -- custom networking (CNI), service meshes, stateful workloads, multi-container pod patterns, or more than 10 tightly coupled microservices. Use Container Apps for HTTP APIs, event-driven processors, and background workers that benefit from scale-to-zero and do not require custom Kubernetes primitives. Use ACI for short-lived batch jobs, sidecar containers for existing services, and burst compute that runs for minutes to hours.

    2. How do I know if my AKS nodes are over-provisioned?

    Check node-level CPU and memory utilization over a 14-day period using Container Insights or Prometheus. If average node CPU utilization is below 40% and average memory utilization is below 50%, your nodes are likely over-provisioned. Also compare pod resource requests against actual P95 usage -- a large gap indicates that pod requests are inflated, which cascades into over-provisioned nodes.

    3. Is it safe to run production workloads on Spot nodes?

    Yes, for stateless workloads with multiple replicas behind a load balancer. The key requirements are: at least 3 replicas spread across Spot and on-demand node pools, graceful shutdown handling (preStop hooks), and pod disruption budgets to ensure minimum availability during evictions. Do not run databases, message brokers, or single-replica stateful services on Spot nodes.

    4. How much can I save by migrating from ARO to AKS?

    The ARO service fee alone is ~$0.35/hr per worker node, which adds ~$255/mo per node on top of VM costs. Additionally, ARO requires dedicated master node VMs that you pay for, while AKS provides the control plane as a managed service (free on the Free tier). For a 4-worker-node cluster, migrating from ARO to AKS typically saves $2,700-$3,200/mo -- a 70-85% reduction.

    5. Should I use Reserved Instances or Savings Plans for AKS nodes?

    Use Reserved Instances if your AKS node pools use consistent VM SKUs and you do not plan to change them. RIs provide the deepest discounts (up to 65% for 3-year). Use Savings Plans if you expect to evolve your node pool configurations -- changing VM families, adding new clusters, or shifting workloads between services. Savings Plans provide slightly lower discounts but much greater flexibility.

    6. What is the cluster autoscaler and how does it reduce costs?

    The AKS cluster autoscaler automatically adjusts the number of nodes in a node pool based on pending pod requests. When pods cannot be scheduled due to insufficient resources, the autoscaler adds nodes. When nodes are underutilized and their pods can be rescheduled elsewhere, the autoscaler removes nodes. This eliminates the need to over-provision for peak load -- you only pay for the nodes you need at any given time.

    7. Can I apply Azure Hybrid Benefit to AKS?

    Yes, for Windows node pools. AHB eliminates the Windows Server license cost from the VM price, saving approximately 40-45%. This requires existing Windows Server licenses with active Software Assurance. For Linux node pools, AHB does not apply, but you can use Azure Hybrid Benefit for Linux (RHEL/SUSE) if you have qualifying subscriptions.

    8. How do I right-size ACI container groups?

    ACI charges per-second for allocated vCPU and memory, regardless of actual utilization. Review the actual resource consumption of your ACI containers using Azure Monitor metrics. Reduce the allocated vCPU and memory to match peak actual usage plus a 15% buffer. Common over-provisioning: allocating 4 vCPU and 16 GB memory for a container that uses 0.5 vCPU and 2 GB at peak.

    9. What is the cost impact of the AKS Standard vs Free tier?

    The AKS Free tier provides a managed Kubernetes control plane at no cost with a financially backed SLA of 99.5%. The Standard tier ($0.10/hr, ~$73/mo) provides a 99.95% uptime SLA and additional features like the Uptime SLA, Cluster Autoscaler profile customization, and planned maintenance windows. For production clusters, the Standard tier is recommended. For dev/test clusters, the Free tier is sufficient and saves $73/mo per cluster.

    10. How does Spotto help with container cost optimization?

    Spotto continuously monitors your Azure container fleet -- AKS clusters, ACI container groups, Container Apps environments, and Functions apps -- to identify over-provisioned nodes, platform mismatches, missing commitment discounts, idle dev/test clusters, and orphaned resources. Rather than running one-off audits, Spotto provides ongoing visibility and prioritized recommendations, making it straightforward to maintain optimized container costs as your environment evolves.

    Use-Case and Scenario Coverage

    Scenario 1: MSP Managing 12 Tenants with Mixed Container Workloads

    Before

    $52,000/mo

    12 AKS clusters (one per tenant), all D8s_v5 nodes, 3-node minimum, no autoscaler, no Spot, on-demand pricing, running 24/7 including dev/test

    After

    $19,500/mo

    Right-sized to D4s_v5 where appropriate, Spot pools for dev workloads, autoscaler enabled, 4 dev clusters scheduled stop/start, 1-year RIs on production baseline

    Actions taken: Analyzed per-tenant utilization and found 8 of 12 clusters running below 35% CPU. Down-sized 8 clusters from D8s_v5 to D4s_v5. Added Spot node pools for non-critical workloads. Enabled cluster autoscaler on all clusters (min 2, max 8). Scheduled 4 dev/test clusters to stop outside business hours. Purchased 1-year RIs for the 8 production system node pools.

    63% savings -- $390,000/year

    Scenario 2: Enterprise ARO to AKS Migration

    Before

    $5,645/mo

    Single ARO cluster with 4 D8s_v5 worker nodes, 3 master nodes, ARO service fee, all on-demand

    After

    $561/mo

    AKS Free tier, 2 on-demand D4s_v5 + 2 Spot D4s_v5, 1-year Savings Plan on baseline nodes

    Actions taken: Confirmed no OpenShift-specific dependencies (no Operators, no OpenShift Routes). Migrated Kubernetes manifests to AKS (minimal changes required). Eliminated ARO service fee and master node costs. Right-sized from D8s_v5 to D4s_v5 based on actual utilization. Added Spot pool for stateless workloads. Applied 1-year Savings Plan to the 2 baseline on-demand nodes.

    90% savings -- $60,960/year

    Scenario 3: SaaS Company with Multi-Service Architecture

    Before

    $28,000/mo

    All 22 microservices on a single large AKS cluster (12x D8s_v5), 8 Premium SSD PVs, cross-region service mesh, 15 Azure Functions on Premium plan

    After

    $12,600/mo

    Core services on right-sized AKS (6x D4s_v5 + 4 Spot), 5 low-traffic APIs moved to Container Apps, PV tiers aligned, Functions consolidated, same-region routing

    Actions taken: Profiled all 22 microservices and identified 5 low-traffic APIs (<5K req/day) suitable for Container Apps. Migrated those 5 services to Container Apps with scale-to-zero. Right-sized the AKS cluster from 12x D8s_v5 to 6x D4s_v5 + 4 Spot D4s_v5. Downgraded 5 PVs from Premium to Standard SSD. Consolidated 15 Functions Premium apps into 4 + moved 6 to the AKS cluster. Fixed cross-region service mesh to route within the same region.

    55% savings -- $184,800/year

    Scenario 4: Dev/Test Environment Sprawl

    Before

    $7,800/mo

    6 dev/test AKS clusters running 24/7, each 3x D4s_v5, Standard tier, no Spot, orphaned ACI groups from manual testing

    After

    $1,900/mo

    Consolidated to 3 clusters, all Free tier, Spot nodes only, business-hours scheduling, automated ACI cleanup

    Actions taken: Consolidated 6 dev/test clusters to 3 using namespace isolation. Downgraded all 3 from Standard to Free tier. Switched all node pools to Spot VMs (acceptable for dev/test). Implemented business-hours scheduling (stop 7 PM, start 7 AM, skip weekends). Deployed automated ACI cleanup that terminates container groups older than 4 hours. Cleaned up 23 orphaned ACI groups.

    76% savings -- $70,800/year

    Scenario 5: High-Throughput API on AKS

    Before

    $12,000/mo

    8x D16s_v5 nodes, over-requested pod resources (4 CPU requested, 0.8 actual), Premium SSD for all PVs, no commitment discounts, x86 only

    After

    $5,800/mo

    Right-sized pods, 4x D8s_v5 on-demand + 2 Spot, Arm64 node pool for stateless workers, 1-year RI on baseline, Standard SSD for non-critical PVs

    Actions taken: Right-sized pod resource requests from 4 CPU to 1 CPU based on P95 utilization data. This reduced the required node count from 8 to 4 on-demand. Added 2 Spot nodes for overflow capacity. Migrated stateless worker pods to Arm64 (Dpsv6) node pool for 20% cost reduction. Applied 1-year RI to the 4 baseline nodes. Downgraded 3 non-critical PVs from Premium SSD to Standard SSD. Saved $175/mo on storage alone.

    52% savings -- $74,400/year

    Implementation Guidance

    Preconditions

    Azure CLI or PowerShell Az module installed and authenticated with Contributor access to AKS clusters
    kubectl configured with cluster credentials for each AKS cluster
    Container Insights or Managed Prometheus enabled for at least 14 days of utilization data
    Cost Management + Billing Reader access for reservation and savings plan purchasing
    Change management approval for production cluster modifications

    Required Inputs

    Subscription IDs and resource groups for all container resources (AKS, ACI, Container Apps, Functions)
    14+ days of CPU and memory utilization metrics per node pool and per pod
    Workload classification (production, staging, dev/test) for each cluster and namespace
    Traffic patterns and request volumes for each containerized service
    Existing commitment purchases (RIs, Savings Plans) and their utilization rates

    Rollout Approach

    Step 1: Discovery and inventory -- Catalog all container resources across subscriptions: AKS clusters (node pools, VM SKUs, node counts), ACI container groups, Container Apps environments, and Functions apps. Export utilization metrics for analysis.
    Step 2: Platform assessment -- For each containerized workload, evaluate whether it is running on the optimal platform. Flag AKS workloads that could run on Container Apps or Functions. Flag ARO clusters that could migrate to AKS.
    Step 3: Quick wins -- Implement low-complexity changes first: schedule dev/test cluster stop/start, clean up orphaned ACI groups, enable cluster autoscaler, downgrade PV tiers on non-critical workloads.
    Step 4: Right-sizing -- Right-size pod resource requests using VPA recommendations. Then right-size node pool VM SKUs based on the new pod requests. Test in staging for 1 week before applying to production.
    Step 5: Spot adoption -- Add Spot node pools for identified fault-tolerant workloads. Deploy with pod anti-affinity and disruption budgets. Monitor for 2 weeks to validate eviction handling.
    Step 6: Platform migrations -- Migrate suitable workloads from AKS to Container Apps or Functions. Migrate ARO to AKS where applicable. These are higher-effort changes that deliver the largest per-workload savings.
    Step 7: Commitment purchases -- After right-sizing and Spot adoption stabilize (4-6 weeks), purchase RIs or Savings Plans for the remaining on-demand baseline compute.
    Step 8: Governance -- Deploy cost visibility (Cost Analysis add-on, budgets, Prometheus dashboards) and governance (namespace quotas, admission controllers) to prevent drift.

    Failure Modes

    Pod OOMKill after right-sizing memory requests: If memory limits are set too low, pods will be OOMKilled during traffic spikes. Set limits to at least 2x requests and monitor OOMKill events in Container Insights for 7 days after changes.
    Pod scheduling failures after node pool downsizing: If the node pool has insufficient capacity for all pod requests, pods will enter Pending state. Ensure the cluster autoscaler is enabled with appropriate max node counts before reducing node sizes.
    Service degradation on Spot eviction: If Spot node pools host workloads without adequate replicas or disruption budgets, a Spot eviction event can cause downtime. Maintain at least minAvailable: 2 in PodDisruptionBudgets for all Spot-eligible workloads.
    Cold start latency on Container Apps after scale-to-zero: When Container Apps scales from 0 to 1 replica, there is a cold start delay of 2-10 seconds depending on image size. For latency-sensitive APIs, set minimum replicas to 1 instead of 0.
    Over-purchasing commitments: Purchasing RIs or Savings Plans before right-sizing and Spot adoption stabilize can result in unused reserved capacity. Wait 4-6 weeks after optimization changes before committing.

    Rollback Strategy

    Every optimization should have a clear rollback path:

    Pod right-sizing rollback: Revert resource requests and limits in the deployment manifests to previous values and apply. Pods will be recreated with the original resource configuration within seconds.
    Node pool rollback: Add a new node pool with the original VM SKU and drain the undersized nodes. Use kubectl cordon and kubectl drain to move workloads safely. The original node pool can be recreated in 5-10 minutes.
    Spot pool rollback: Remove the Spot node taint and toleration from workloads, or add an on-demand node pool and reschedule workloads. The cluster autoscaler will handle node provisioning.
    Platform migration rollback: Maintain the original AKS deployment manifests and container images. If Container Apps performance is unsatisfactory, redeploy to AKS using the original configuration. Keep the AKS namespace reserved for 30 days after migration.
    Cluster stop/start rollback: Simply disable the scheduled stop automation. The cluster will continue running 24/7 as before.

    What to Do Next

    Step 1: Inventory your container fleet -- List every AKS cluster, ACI container group, Container Apps environment, and Functions app across all subscriptions. Capture VM SKUs, node counts, utilization metrics, and current spend per resource.
    Step 2: Classify and prioritize -- Categorize each workload by platform fit (AKS vs Container Apps vs Functions), environment (prod vs dev/test), and Spot eligibility. Prioritize the highest-spend resources with the lowest utilization.
    Step 3: Execute quick wins first -- Schedule dev/test cluster stop/start, clean up orphaned ACI groups, enable autoscalers, and downgrade storage tiers. These changes are low-risk and deliver immediate savings.
    Step 4: Establish continuous governance -- Deploy cost visibility tooling, budget alerts, and namespace quotas. Consider Spotto for continuous, automated container cost optimization across your entire Azure environment.

    Summary

    Right-sizing is the foundation -- Pod resource requests drive node provisioning. Oversized requests cascade into oversized nodes and unnecessary node count. Start by aligning requests to actual P95 usage.
    Platform selection is the highest-leverage optimization -- Running a low-traffic API on AKS when Container Apps would suffice is one of the most common and expensive mistakes. Match platform to workload pattern.
    Spot infrastructure delivers 60-90% per-node savings -- For fault-tolerant workloads with multiple replicas, Spot node pools and Spot ACI containers are the most cost-effective compute option in Azure.
    Commitment discounts are the easiest win for stable workloads -- Reserved Instances and Savings Plans require no code changes and deliver 30-65% savings on baseline AKS node VMs.
    Dev/test scheduling eliminates 65-75% of non-production compute -- AKS cluster stop/start is a low-risk, high-impact optimization for environments that are only used during business hours.
    Storage and network costs add up -- Premium SSD on non-critical workloads and cross-region egress from misconfigured routing are common sources of hidden container costs.
    Continuous governance prevents drift -- Without namespace-level cost visibility, budget alerts, and resource quotas, container costs will regrow after any one-time optimization effort.

    The challenges outlined in this article — oversized node pools, wrong platform selections, missing commitment discounts, idle dev/test clusters — are the same ones our customers work through across their Azure environments. The difference is they use Spotto to surface these opportunities automatically, rather than running the analysis by hand.

    Stop Paying for Containers That Aren't Earning Their Keep

    Spotto continuously analyzes your Azure container fleet — AKS clusters, ACI groups, Container Apps, and Functions — to detect over-provisioned nodes, platform mismatches, missing discounts, and idle resources, giving you clear recommendations to cut container costs across every subscription.

    Free Trial

    Disclaimer: This article is provided for informational purposes only and does not constitute professional advice. Azure pricing, features, and service behaviour may have changed since publication. Always validate recommendations against your specific environment and consult Microsoft's official documentation before making changes to production infrastructure. Spotto is not liable for any actions taken based on the content of this article.