Azure Container Apps vs AKS: Which to Choose
Azure Container Apps vs AKS is the decision you hit the moment you decide to run containers on Azure and realise Microsoft offers two very different front doors to the same underlying technology. Both run your containers, both scale, and both are built on Kubernetes — but one hides Kubernetes entirely and the other hands you the full API. Picking the wrong one means either fighting cluster plumbing you never wanted, or hitting a ceiling on a platform that was deliberately simplified. This guide explains how Azure Container Apps (ACA) and Azure Kubernetes Service (AKS) actually differ, and gives you a clear rule for choosing.
It sits in the Devgains cloud cluster alongside the Terraform pillar, because in production you will provision either platform as code rather than clicking through the portal. If you are still building your mental model of what Kubernetes even is, read Kubernetes architecture explained first — it makes everything below land faster.
Quick answer: Azure Container Apps vs AKS
- Use Azure Container Apps when you want to ship containers without operating Kubernetes. ACA is a serverless, fully managed platform that gives you scale-to-zero, HTTPS ingress, revisions, and built-in Dapr — and hides the cluster completely.
- Use AKS when you need direct Kubernetes API access: custom resource definitions (CRDs), StatefulSets, a service mesh, GPU node pools, DaemonSets, or tight control over networking and node configuration.
- They share a foundation. ACA is built on top of Kubernetes and KEDA, so the scaling concepts transfer. The difference is how much of that machinery you are responsible for.
- Start with ACA. For most web APIs, background workers, and event-driven services, Container Apps is the faster, cheaper, lower-maintenance choice. Reach for AKS when a concrete requirement forces you to.
If you cannot name a Kubernetes feature you specifically need, you probably want Container Apps.
Why the choice matters
The platform you pick shapes your team's operational burden for years. Choose AKS and you own the cluster: node upgrades, networking plugins, ingress controllers, autoscaler tuning, and RBAC all become your responsibility (or your platform team's). That control is a genuine asset when you need it and pure overhead when you don't. Choose Container Apps and Microsoft runs the control plane, the nodes, and the scaling machinery — you hand over a container image and a few scale rules and get a running, auto-scaling, HTTPS-fronted service.
Migrating later is not a code rewrite, because both run the same OCI container images, but it is a migration of your operational model: manifests, CI/CD, secrets, and observability all move. Getting the call right on day one saves you that churn.
What is Azure Container Apps?
Azure Container Apps is a serverless container platform where Microsoft runs the Kubernetes control plane and nodes for you, and you never touch the Kubernetes API directly. You define an app (a container plus scale rules and ingress), and the platform handles the rest. Its headline features:
- Scale-to-zero with event-driven autoscaling powered by KEDA. When there is no traffic, replicas drop to zero and you pay nothing for compute.
- Revisions — every change can create an immutable revision, enabling blue/green and canary traffic splitting without extra tooling.
- Built-in Dapr for service-to-service calls, pub/sub, state, and bindings, so distributed-app patterns work without you wiring a sidecar by hand.
- Two billing models: a Consumption plan (pay per vCPU-second and GiB-second, with scale-to-zero) and Dedicated workload profiles (pay per node-hour for reserved, more powerful compute).
ACA is best understood as "Kubernetes-powered, but Kubernetes-hidden." You get the elasticity without the operational surface area.
What is AKS?
Azure Kubernetes Service is a managed Kubernetes offering: Microsoft runs and secures the control plane (free of charge), and you manage the node pools and everything running on them. You get the complete, unmodified Kubernetes API. That means every ecosystem tool — Helm, Argo CD, Istio, Prometheus operators, cert-manager, custom operators — works exactly as it does anywhere else.
AKS is the right home for workloads that genuinely need Kubernetes primitives:
- StatefulSets for ordered, stable-identity workloads like databases and message brokers.
- CRDs and operators that extend the cluster with your own resource types.
- GPU node pools for ML training and inference.
- Service meshes, network policies, and fine-grained pod scheduling.
The 2025 arrival of AKS Automatic (now GA) removes a lot of the historical setup pain by provisioning an opinionated, production-ready cluster with node autoscaling and security defaults — narrowing, but not closing, the simplicity gap with Container Apps. The scaling mental model is the same one covered in Kubernetes autoscaling: HPA, VPA, and Cluster Autoscaler.
Azure Container Apps vs AKS: comparison table
| Dimension | Azure Container Apps | AKS |
|---|---|---|
| Kubernetes API access | No (abstracted away) | Yes (full, unmodified) |
| Operational overhead | Minimal — Microsoft runs it | You own node pools, upgrades, add-ons |
| Scale-to-zero | Yes (KEDA, Consumption plan) | Not by default (needs KEDA add-on) |
| Pricing | Per vCPU-/GiB-second or per node-hour | Free control plane + node VM cost |
| StatefulSets / CRDs / service mesh | No | Yes |
| GPU workloads | Limited | Yes (GPU node pools) |
| Built-in Dapr | Yes | Add-on |
| Best for | APIs, workers, event-driven microservices | Complex platforms needing full k8s control |
Step-by-step: deploy a container app
Container Apps shines because a working deployment is a handful of CLI commands. First, create the environment and app:
# Create an environment (the shared boundary for a set of apps)
az containerapp env create \
--name devgains-env \
--resource-group devgains-rg \
--location eastus
# Deploy a container as an app with external HTTPS ingress
az containerapp create \
--name orders-api \
--resource-group devgains-rg \
--environment devgains-env \
--image ghcr.io/devgains/orders-api:1.4.0 \
--target-port 8080 \
--ingress external \
--min-replicas 0 \
--max-replicas 10The --min-replicas 0 is the important line: it enables scale-to-zero, so an idle service costs
nothing. --ingress external gives you a public HTTPS endpoint with a managed certificate — no
ingress controller to install. Contrast that with AKS, where you would author a Deployment, a
Service, an Ingress, and wire up a controller and TLS yourself.
To add event-driven scaling — for example, scaling on the depth of an Azure Service Bus queue — you attach a KEDA scale rule:
az containerapp update \
--name orders-worker \
--resource-group devgains-rg \
--scale-rule-name queue-depth \
--scale-rule-type azure-servicebus \
--scale-rule-metadata "queueName=orders" "messageCount=20" \
--scale-rule-auth "connection=servicebus-connection"This tells the platform to add a replica for roughly every 20 pending messages, then drain back to zero when the queue empties. KEDA waits out a cool-down period (300 seconds by default) before scaling the last replica to zero, so you avoid thrashing on bursty traffic. The exact same KEDA scalers underpin autoscaling on AKS — ACA just wires them up for you.
Pricing: how each one bills
The cost models are fundamentally different, and this often decides the choice:
- Container Apps (Consumption) bills per resource-second: roughly $0.000024 per vCPU-second and $0.000003 per GiB-second, plus a per-request charge, with a monthly free grant (around 180,000 vCPU-seconds and 360,000 GiB-seconds). Because idle apps scale to zero, spiky or low-traffic workloads can be dramatically cheaper here.
- AKS charges nothing for the managed control plane; you pay for the node VMs that back the cluster, whether or not they are busy. At sustained, high utilisation across many services, reserved nodes are often more cost-efficient than per-second billing.
The rule of thumb: bursty, low, or unpredictable traffic favours ACA's scale-to-zero; steady, high-density utilisation favours AKS nodes. Model both against your real traffic before committing.
Best practices
- Default to Container Apps for stateless HTTP services and workers. Only escalate to AKS when a named requirement demands it.
- Provision as code. Whether ACA or AKS, define infrastructure with Bicep or Terraform so environments are reproducible and reviewable — see the full comparison to pick the right IaC tool for your team.
- Use managed identity, not connection strings. Grant your app an identity and assign roles — the same least-privilege discipline covered in AWS IAM: roles vs policies vs users applies to Azure.
- Right-size scale rules. Set sensible
min/maxreplicas and pick a scaler that matches your real bottleneck (HTTP concurrency, queue depth, CPU), not a guess. - Keep images lean. Both platforms pull the same OCI images, so the container-hardening habits in deploying Docker containers to production carry straight over.
Common mistakes
- Reaching for AKS "to be safe." Standing up a cluster you don't need buys you upgrade cycles, add-on management, and on-call pages for infrastructure a managed platform would have handled.
- Expecting scale-to-zero to be free of latency. A cold start still has to pull the image and boot
the container. For latency-sensitive paths, set
min-replicasto 1 to keep one warm. - Trying to run stateful workloads on ACA. Dapr actors and true StatefulSet semantics are an AKS job — ACA is built for stateless and event-driven apps.
- Ignoring the environment boundary. All apps in one Container Apps environment share a virtual network and Log Analytics workspace; mixing unrelated trust domains in one environment is a design smell.
When should you choose AKS over Container Apps?
Choose AKS when at least one of these is true: you need the raw Kubernetes API for CRDs or operators; you run StatefulSets or GPU workloads; you require a service mesh or fine-grained network policy; or you already have deep Kubernetes expertise and existing manifests you don't want to rewrite. Choose Container Apps in essentially every other case — especially greenfield APIs, background processors, and event-driven microservices where operational simplicity and scale-to-zero matter more than low-level control.
Takeaways
- ACA and AKS both run the same containers on Kubernetes; the difference is how much of Kubernetes you operate.
- Container Apps = serverless, scale-to-zero, built-in Dapr, minimal ops. AKS = full Kubernetes API, maximum control, maximum responsibility.
- Pricing splits along utilisation: per-second with scale-to-zero (ACA) vs pay-for-nodes (AKS).
- Default to ACA; escalate to AKS only when a concrete Kubernetes feature forces the move.
FAQ
What is the difference between Azure Container Apps and AKS?
Azure Container Apps is a serverless, fully managed platform that hides Kubernetes and gives you scale-to-zero, ingress, revisions, and Dapr out of the box. AKS is managed Kubernetes that exposes the full API and lets you run any Kubernetes workload, at the cost of operating the cluster yourself.
Is Azure Container Apps built on Kubernetes?
Yes. ACA runs on top of Kubernetes and uses KEDA for event-driven autoscaling, but Microsoft manages the control plane and nodes and does not expose the Kubernetes API to you.
Which is cheaper, Container Apps or AKS?
For bursty or low-traffic workloads, Container Apps is usually cheaper because it scales to zero and bills per second. For steady, high-utilisation workloads packed onto reserved nodes, AKS is often more cost-efficient. Model both against your real traffic.
Can I move from Container Apps to AKS later?
Yes — both run the same container images, so the application doesn't change. What you migrate is the operational layer: manifests, CI/CD, ingress, secrets, and observability configuration.
Does Azure Container Apps support Dapr?
Yes. Dapr is built in. You enable it per app to use service invocation, pub/sub, state management, and bindings, and KEDA can scale the app and its Dapr sidecar on pending events.
Conclusion
Azure Container Apps vs AKS is not a question of which platform is better — it is a question of how much Kubernetes you want to operate. Container Apps gives most teams everything they need to ship containerised services with near-zero operational overhead, while AKS remains the right tool when you genuinely need the full Kubernetes API. Start on Container Apps, keep your infrastructure in code, and graduate to AKS only when a specific requirement makes the case. Explore more in the Cloud category, and pair this with GitHub Actions CI/CD to automate deployments to whichever platform you choose.

