Skip to main content
GenioCT

Container Apps vs AKS vs App Service: A Decision Framework

By GenioCT | | 9 min read
Azure Containers AKS Architecture

In this article

The container hosting spectrum on Azure ranges from fully managed App Service through serverless Container Apps to full-control AKS.

Microsoft just announced Azure Container Apps general availability at Build 2022. It is a serverless container platform built on Kubernetes that abstracts away the cluster management entirely. You bring a container image, Container Apps handles the rest.

This changes the container hosting conversation on Azure. Until now, the decision was binary: App Service if you want simplicity, AKS if you need orchestration. Container Apps fills the gap that has been there all along - a platform for teams that need more than App Service but don’t need (or want) to operate a Kubernetes cluster.

We have been running workloads on all three services for years. This is how we think about the decision.

The Three Options

Before diving into the framework, a brief summary of what each service actually is.

Azure App Service is a PaaS web hosting platform. It runs containers, but its core identity is a managed web application host. You get built-in deployment slots, authentication, custom domains, and TLS - all configured through the portal or your IaC tool of choice. It is the oldest of the three and the most mature.

Azure Container Apps is a serverless container platform. It runs on Kubernetes under the hood (specifically, an AKS cluster managed by Microsoft), but you never see or interact with the cluster. It is purpose-built for microservices, APIs, background processors, and event-driven workloads. The key differentiators are KEDA-based autoscaling, Dapr integration, and scale-to-zero.

Azure Kubernetes Service (AKS) is managed Kubernetes. Microsoft manages the control plane; you manage everything else - node pools, networking, RBAC, ingress controllers, service meshes, monitoring agents, and upgrade cycles. You get full access to the Kubernetes API and can run anything the ecosystem supports.

Azure docs: Container Apps overview · App Service overview · AKS overview

The Decision Framework

This is the table we walk through with clients when they are evaluating container hosting on Azure.

DimensionApp ServiceContainer AppsAKS
Abstraction levelHigh - managed PaaSMedium - serverless containersLow - managed Kubernetes
Kubernetes knowledgeNot neededNot neededRequired
Scale-to-zeroNo (always-on instances)Yes (KEDA-based)Manual (KEDA + node autoscaler)
Cost modelAlways-on App Service PlanPay per vCPU/memory secondsNode pool VMs + control plane
NetworkingVNet integration (outbound)Container Apps Environment (VNet)Full VNet control (CNI/kubenet)
IngressBuilt-in (HTTPS, custom domains)Built-in (Envoy-based)BYO (NGINX, Traefik, AGIC)
CI/CD integrationDeployment Center, GitHub ActionsRevisions, GitHub Actions, Azure PipelinesHelm, Kustomize, GitOps (Flux/ArgoCD)
Multi-containerLimited (sidecar preview)Yes (sidecar containers)Full pod spec
Custom operators/CRDsNoNoYes
Service meshNoDapr (built-in)Istio, Linkerd, or any mesh
Startup timeFast (warm instances)Cold start possibleFast (pods on warm nodes)

The pattern is straightforward: as you move from left to right, you gain control and lose simplicity. The question is where your workload sits on that spectrum.

Azure docs: Container Apps vs other Azure container options · AKS vs Container Apps

When to Use Each

App Service: Simple Web Applications

App Service is the right choice when you are running a web application or API that fits a standard pattern - a .NET API, a Node.js frontend, a Python Flask app. You want TLS, custom domains, deployment slots, and zero infrastructure thinking.

Use App Service when:

  • Your workload is a single web application or API
  • You don’t need scale-to-zero (traffic is consistent enough to justify always-on)
  • Your team isn’t familiar with containers and doesn’t want to be
  • You need built-in authentication integration (Easy Auth)
  • Deployment slots and traffic splitting are important to your release process

Container Apps: Microservices, Event-Driven, and APIs

Container Apps is the sweet spot for most modern cloud-native workloads. If you are building microservices, processing events from queues or topics, running background jobs, or hosting APIs that need to scale dynamically - this is where you should start.

Use Container Apps when:

  • You have multiple services that need to communicate (microservices)
  • You want scale-to-zero for cost optimisation on bursty workloads
  • You are processing events from Azure Service Bus, Kafka, Storage Queues, or other event sources
  • You want Dapr for service invocation, state management, or pub/sub without adopting a full service mesh
  • You need revision management for blue-green or canary deployments
  • Your team can build Docker images but doesn’t want to manage Kubernetes

AKS: Complex Orchestration and Full Control

AKS is for teams that genuinely need Kubernetes. That means custom operators, CRDs, specific CNI plugins, service mesh configurations, or compliance requirements that mandate cluster-level control.

Use AKS when:

  • You need custom Kubernetes operators or CRDs
  • You require a specific service mesh (Istio, Linkerd) with full configuration control
  • Your workloads need GPU scheduling, advanced node affinity, or custom scheduler plugins
  • You are running stateful workloads that require persistent volume management beyond what Container Apps offers
  • Regulatory or compliance requirements mandate cluster-level audit controls
  • You have a dedicated platform team that can operate Kubernetes

Azure docs: When to use Container Apps · AKS baseline architecture

Container Apps Features Worth Knowing

Container Apps bundles several capabilities that would take weeks to set up on raw AKS.

KEDA-based autoscaling. Container Apps uses KEDA under the hood for event-driven scaling. You configure scale rules declaratively - scale on HTTP concurrent requests, queue length, CPU, memory, or any of KEDA’s 50+ scalers. Scale-to-zero is the default, which means you pay nothing when there is no traffic.

Dapr integration. Dapr is enabled as a sidecar with a single configuration flag. This gives you service-to-service invocation, state management, pub/sub messaging, and bindings - all without adding Dapr to your container image or managing Dapr infrastructure.

Revision management. Every deployment creates a new revision. You can split traffic between revisions for canary deployments, run multiple revisions simultaneously, and roll back instantly. This is the same concept as Cloud Run revisions or App Service deployment slots, but for containers.

Built-in ingress. Container Apps uses Envoy as the ingress controller. You get HTTPS, custom domains, and traffic splitting without deploying or managing an ingress controller. External ingress exposes the app to the internet. Internal ingress makes it available only within the Container Apps Environment.

Azure docs: Scaling in Container Apps · Dapr integration · Revisions in Container Apps

The Anti-Pattern: The Over-Engineering Tax

The most common mistake we see is teams choosing AKS when Container Apps would have been a better fit. We call this the over-engineering tax.

Here is what it looks like in practice. A team needs to run five microservices that process messages from Service Bus and expose a REST API. They choose AKS because “we might need Kubernetes features later.” Six months in, they have two engineers spending 30% of their time managing cluster upgrades, node pool scaling, ingress controller configurations, and certificate rotation. The application code hasn’t changed - the infrastructure overhead has consumed the team.

AKS is a powerful platform. It is also an operational commitment. The control plane is managed, but everything above it is not. Node pool OS patching, Kubernetes version upgrades, network policy management, RBAC configuration, monitoring agent deployment, ingress controller lifecycle - all of this is on your team.

Container Apps eliminates this entire category of work. For the five-microservices-and-a-queue scenario, Container Apps deploys in an afternoon and scales to zero overnight. AKS deploys in a week and costs you node pool VMs 24/7.

The question to ask isn’t “could we use Kubernetes features?” It is “do we need Kubernetes features today, and do we have a team that can operate Kubernetes responsibly?”

The Migration Path: Progressive Complexity

One of the best things about the Azure container ecosystem is that the migration path is well-defined and incremental.

App Service to Container Apps. If your App Service workload is already containerised, moving to Container Apps is straightforward. The main changes are the ingress configuration and the scaling model. Environment variables, secrets, and managed identity work similarly. You gain scale-to-zero and KEDA-based scaling. You lose deployment slots (replaced by revisions) and Easy Auth (replaced by manual auth or Dapr middleware).

Container Apps to AKS. Because Container Apps runs on Kubernetes, the mental model transfers directly. Your container images, environment variables, and scaling concepts all carry over. You will need to configure your own ingress controller, set up monitoring, and manage the cluster lifecycle - but the application layer stays the same. If you were using Dapr on Container Apps, you can deploy Dapr on AKS and keep your application code unchanged.

This incremental path means you can start with the simplest option that meets your requirements and move up only when you hit a genuine limitation. That is the opposite of starting with AKS and carrying the operational cost from day one.

Azure docs: Migrate from App Service to Container Apps · Container Apps environments

VNet Integration and Security

Container Apps are deployed into a Container Apps Environment, which is the security and networking boundary for your apps. You have two options:

External environment - the environment has a public endpoint. Individual apps can be configured with external or internal ingress. This is the simplest option and works for public-facing APIs and services.

Internal environment - the environment is deployed into a VNet with no public endpoint. All ingress is private. This is the pattern for enterprise workloads that must stay within the corporate network boundary.

For internal environments, the Container Apps Environment is injected into a dedicated subnet in your VNet. Outbound traffic flows through the VNet and is subject to your NSGs and route tables. Inbound traffic requires a reverse proxy (Application Gateway, Azure Front Door, or a custom solution) in front of the internal endpoint.

This model is similar to App Service Environment (ASE) but without the significant cost overhead. An ASE starts at roughly 1000 USD/month just for the stamp. A Container Apps internal environment costs nothing beyond the resources your apps consume.

DNS configuration is important in internal environments. The Container Apps Environment gets a static IP and a default domain. You need to configure Private DNS zones to resolve the environment’s domain to the internal IP within your VNet.

Azure docs: Container Apps networking · Container Apps with internal VNet · Private DNS zones

Final Thoughts

Azure Container Apps fills a gap that has existed since AKS launched. Not every containerised workload needs Kubernetes, and not every team should be operating a cluster.

Start with the simplest option that meets your requirements. App Service for standard web apps. Container Apps for microservices, event-driven workloads, and APIs that benefit from scale-to-zero. AKS when you genuinely need the Kubernetes API and have the team to support it.

Pick the platform that lets you ship product, not the one that becomes a project of its own.

Looking for Azure architecture guidance?

We design and build Azure foundations that scale - landing zones, networking, identity, and governance tailored to your organisation.

Start with a Platform Health Check - results within 1 week.
Talk to an Azure architect
Share this article

Start with a Platform Health Check

Not sure where to begin? A quick architecture review gives you a clear picture. No obligation.