AWS ECS vs. EKS: Container Orchestration Compared

Photo by Bent Van Aeken on Unsplash
In mid-sized companies, the container orchestration decision often happens during a LinkedIn break or in a conference lunch. The consultant says Kubernetes, the AWS account manager says ECS, and the setup ends up being whatever the team already knows. Sometimes that works. Often it does not.
Containers have been mainstream for ten years, but between re:Invent 2024 and re:Invent 2025, AWS shifted the playing field significantly. EKS Auto Mode, ECS Managed Instances, and the App Mesh EOL mean that anyone who set their container strategy in 2024 should review it in 2026. This article is a trade-off analysis grounded in verified pricing data and concrete architectural scenarios. Numbers are as of May 2026, pricing values are from us-east-1.
What this article is not: a Hello World introduction to Kubernetes or ECS. If you have never set up a cluster, start with the official tutorials. What it is: the foundation for a deliberate decision between ECS and EKS, made outside the lunch break.
What ECS Is and What It Is Not
Amazon Elastic Container Service is AWS's own orchestrator, not Kubernetes. The core concepts:
- Cluster: a logical container for tasks and services
- Task Definition: a JSON description of a container or container group (analogous to a Kubernetes Pod spec, but AWS-specific)
- Service: keeps N tasks running, with load balancer, autoscaling, and deployment strategies
- Capacity Provider: governs whether tasks run on Fargate, ECS Managed Instances, or self-managed EC2
What ECS does well: deep AWS integration with IAM, CloudWatch, ALB, Secrets Manager, and ECR. There is no control plane fee. Service Connect (since November 2022) gives you service-to-service communication with an AWS-managed Envoy sidecar. Three capacity providers are available. With re:Invent 2025 updates, blue/green, canary, and linear deployments with automatic rollback on CloudWatch alarms come out of the box, no external tools required.
What ECS does not do: no Helm, no Custom Resource Definitions, no operators. No standard service mesh ecosystem since App Mesh EOL on September 30, 2026. No portability beyond AWS. A simple task definition for a Laravel app on Fargate looks like this:
{
"family": "laravel-web",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"cpu": "512",
"memory": "1024",
"executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
"taskRoleArn": "arn:aws:iam::123456789012:role/laravel-task-role",
"containerDefinitions": [
{
"name": "web",
"image": "123456789012.dkr.ecr.eu-central-1.amazonaws.com/laravel-web:1.2.3",
"essential": true,
"portMappings": [
{ "name": "http", "containerPort": 9000, "protocol": "tcp" }
],
"environment": [
{ "name": "APP_ENV", "value": "production" }
],
"secrets": [
{ "name": "DB_PASSWORD", "valueFrom": "arn:aws:secretsmanager:eu-central-1:123456789012:secret:laravel/db-AbCdEf" }
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/laravel-web",
"awslogs-region": "eu-central-1",
"awslogs-stream-prefix": "web"
}
},
"healthCheck": {
"command": ["CMD-SHELL", "curl -f http://localhost:9000/health || exit 1"],
"interval": 30,
"timeout": 5,
"retries": 3,
"startPeriod": 10
}
}
]
}What EKS Is and What It Is Not
Amazon Elastic Kubernetes Service is a managed Kubernetes control plane. AWS manages the control plane across multiple availability zones, ships Kubernetes version upgrades and etcd patches, and integrates IAM via IRSA (IAM Roles for Service Accounts) or the newer EKS Pod Identity. VPC CNI as the default networking plugin gives pods VPC IPs from the CIDR block.
What you do yourself (without Auto Mode): manage worker nodes through EC2 auto-scaling groups or Karpenter, configure add-ons (VPC CNI, kube-proxy, CoreDNS, EBS CSI Driver, EFS CSI Driver), pick Helm/Argo/Flux/Kustomize for deployment logic, set up service mesh, ingress controller, cert-manager, external-dns, and cluster autoscaler. That is substantially more work than ECS.
EKS Auto Mode (re:Invent 2024 with extensions in 2025) shifts that boundary. AWS now manages Karpenter, the load balancer controller, EBS CSI, and GPU plugins (NVIDIA Device Plugin, DCGM Exporter). Pre-configured: ALB, EBS, NVIDIA plugin, and SOCI Parallel Pull (AWS reports container start times reduced by up to 60 percent). Auto Mode is available in all commercial regions, GovCloud, and Local Zones. The price is a management fee of roughly 10 to 12 percent on top of EC2 hourly costs, not discounted by Savings Plans.
EKS Hybrid Nodes extend the architecture to on-premises or edge hardware that joins an EKS cluster as a node. Pricing is tiered from 0.020 USD per vCPU per hour for the first 576,000 vCPU hours per month, dropping to 0.006 USD per vCPU per hour at high volume. Hyperthreaded cores count as two vCPUs. Use cases: hybrid cloud, data sovereignty, edge workloads.
Karpenter as of May 2026: aws/karpenter-provider-aws is at v1.9.x, kubernetes-sigs/karpenter at v1.5.x. Stable APIs since v1.0 (August 2024), with key features including disruption controls with disruption budgets, drift stability, termination grace period, and IMDS restriction for containers by default.
A simple EKS deployment for the same Laravel app:
apiVersion: apps/v1
kind: Deployment
metadata:
name: laravel-web
namespace: production
spec:
replicas: 3
selector:
matchLabels:
app: laravel-web
template:
metadata:
labels:
app: laravel-web
spec:
serviceAccountName: laravel-web
containers:
- name: web
image: 123456789012.dkr.ecr.eu-central-1.amazonaws.com/laravel-web:1.2.3
ports:
- containerPort: 9000
name: http
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
memory: "1Gi"
envFrom:
- secretRef:
name: laravel-secrets
readinessProbe:
httpGet:
path: /health
port: 9000
periodSeconds: 30
timeoutSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: laravel-web
namespace: production
spec:
selector:
app: laravel-web
ports:
- port: 80
targetPort: 9000Kubernetes Versions and the Pricing Risk
As of May 2026, three Kubernetes versions are in EKS standard support and three in extended support:
| Version | EKS Release | End of Standard Support | End of Extended Support |
|---|---|---|---|
| 1.35 | Jan 27, 2026 | Mar 27, 2027 | Mar 27, 2028 |
| 1.34 | Oct 2, 2025 | Dec 2, 2026 | Dec 2, 2027 |
| 1.33 | May 29, 2025 | Jul 29, 2026 | Jul 29, 2027 |
| 1.32 | Jan 23, 2025 | Mar 23, 2026 (passed) | Mar 23, 2027 |
| 1.31 | Sep 26, 2024 | Nov 26, 2025 (passed) | Nov 26, 2026 |
| 1.30 | May 23, 2024 | Jul 23, 2025 (passed) | Jul 23, 2026 |
The reality for many mid-sized clusters: version 1.32 only entered extended support on March 23, 2026, about six weeks before this article. Anyone not actively upgrading their cluster has been paying 0.60 USD instead of 0.10 USD per cluster per hour since then, meaning 438 USD instead of 73 USD per month. Version 1.30 ends entirely on July 23, 2026, after which an automatic upgrade kicks in. Version 1.31 ends in November 2026.
The AWS lifecycle is 14 months of standard support plus 12 months of extended support, 26 months total per version. Three versions are in standard support at any time. Lesson: the price jump from standard to extended is sixfold. Anyone not auditing their cluster inventory regularly pays four- to five-figure annual amounts in stealth.
The Five Real Differences
Operations Overhead
ECS has minimal operations overhead. AWS Console or Terraform are enough, a productive application runs within hours. EKS classic is significantly more work. A team member should know Kubernetes solidly, otherwise cluster upgrades, add-on management, and troubleshooting become a burden. EKS Auto Mode reduces that materially, but Kubernetes concepts (pods, services, RBAC, network policies) remain mandatory.
A practical rule of thumb from real projects: an EKS cluster without Auto Mode costs roughly half a person-year of operations work annually, with Auto Mode about a quarter. An equivalent ECS setup is significantly lower, often a few hours per month.
Pricing Reality (all values us-east-1)
Control plane costs:
| Service | Standard | Extended Support | Hybrid Nodes |
|---|---|---|---|
| ECS control plane | 0 USD | n/a | n/a |
| EKS control plane | 0.10 USD/hr per cluster | 0.60 USD/hr per cluster | tiered from 0.020 USD/vCPU/hr |
Fargate pricing is identical for ECS and EKS:
| Component | Linux x86 | Linux ARM (Graviton) | Windows x86 |
|---|---|---|---|
| vCPU-hour | 0.04048 USD | around 0.032 USD (about 20 percent cheaper) | around 0.0915 USD plus OS fee |
| GB memory-hour | 0.004445 USD | identical | identical |
| Ephemeral storage | 20 GB included, more from 0.0001 USD/GB/hr | identical | identical |
| Spot discount | up to 70 percent | identical | identical |
| Compute Savings Plans | up to 50 percent | identical | identical |
ECS has three compute options that are mixable:
| Compute model | Pricing | Use case |
|---|---|---|
| Fargate | 0.04048 USD/vCPU/hr plus 0.004445 USD/GB/hr | Standard workloads, no server management |
| ECS Managed Instances | 0.02 USD/hr flat plus EC2 cost | Privileged containers, eBPF, GPU, more than 120 GB memory |
| EC2 Launch Type | EC2 cost only | Full control, Reserved Instances, special hardware |
| ECS Anywhere | 0.01025 USD/hr per instance plus your own hardware | On-premises containers under ECS control |
EKS Auto Mode adds different surcharges per instance type:
| Instance | EC2 On-Demand | Auto Mode surcharge | Total with Auto Mode |
|---|---|---|---|
| m5.large (2 vCPU, 8 GB) | around 0.096 USD/hr | around 0.01152 USD/hr | around 0.108 USD/hr |
| m5a.xlarge (4 vCPU, 16 GB) | around 0.172 USD/hr | around 0.02064 USD/hr | around 0.193 USD/hr |
Three observations from the field. The Auto Mode management fee is not discounted via Savings Plans, but the EC2 portion is. The ECS Managed Instances management fee is a flat 0.02 USD per hour regardless of instance type, which is relatively cheaper than Auto Mode for large instances and more expensive for small ones. Region differences apply: eu-central-1 typically runs about 5 to 15 percent above us-east-1, so verify current values in the AWS Pricing Calculator before any setup.
A concrete three-cluster scenario in us-east-1, all on standard support: three EKS clusters with ten Fargate tasks each (0.5 vCPU plus 1 GB), 24 hours a day, 730 hours per month. Per task: 0.5 times 0.04048 times 730 plus 1 times 0.004445 times 730, that is 14.78 USD plus 3.24 USD, totaling 18.02 USD per month. Thirty tasks come to about 541 USD per month. Three control planes: 3 times 73 USD equals 219 USD per month. EKS total: about 760 USD. The same setup on ECS saves the 219 USD control plane fee.
When the pricing difference becomes irrelevant: as soon as compute costs disproportionately exceed control plane. For a productive cluster with 50 vCPU hours per day, the EKS control plane is under 4 percent of total cost. For small setups with few tasks, the control plane is the dominant argument.
Ecosystem Leverage
ECS ecosystem: ECS Service Connect, capacity providers, ECS Exec, ECS Anywhere, blue/green/canary/linear deployments with automatic rollback (re:Invent 2025), MCP integration, and Amazon Q Developer for ECS. All AWS-specific.
EKS ecosystem: the entire CNCF universe. Helm for packaging, ArgoCD or Flux for GitOps, Istio or Linkerd for service mesh (App Mesh is EOL on September 30, 2026), cert-manager, external-dns, Vault, Knative, custom resource definitions, and operators. Karpenter v1.x for very fine-grained compute management, AWS-managed in Auto Mode.
When the ecosystem matters: multi-service architectures with established Helm charts, GitOps workflows, or multi-cloud portability. For a PHP app with three services, the ecosystem argument is weak.
Networking Model
On Fargate, every task or pod gets an ENI with a private IP, simple. On ECS with EC2 in awsvpc mode, tasks get ENIs, and the per-instance ENI quota is a real limit. EKS with VPC CNI gives every pod a VPC IP, and pod density is bounded by the ENI quota. With Prefix Delegation, density per node is significantly higher. EKS with Cilium or Calico uses pod IPs from a separate network, more flexibility but additional complexity.
Practical consequence: VPC IP address space should be planned generously from day one for both services. A /16 VPC with /24 subnets feels generous but runs out faster than expected with aggressive pod density configurations.
Deployment and Release Strategies
ECS supports rolling, blue/green, canary, and linear deployments with automatic rollback on CloudWatch alarm thresholds since re:Invent 2025, no external tools needed. EKS offers anything Kubernetes offers, plus Argo Rollouts for canary and Flagger for progressive delivery. A practical assessment: with the ECS 2025 updates, the functionality is comparable for most mid-sized releases. Argo Rollouts is excellent if you actually use the complexity.
Fargate, ECS Managed Instances, and EC2 as Compute Layer
Fargate is the simplest path. No server management, no patches, billing per vCPU and GB memory at second granularity (1-minute minimum on Linux, 5-minute minimum on Windows). 20 GB of ephemeral storage included, max 16 vCPU plus 120 GB memory per task. Limitations: no DaemonSet on EKS, no privileged containers, no GPU on ECS Fargate.
ECS Managed Instances (available since September 30, 2025 in six regions: us-east-1, us-west-2, eu-west-1, af-south-1, ap-southeast-1, ap-northeast-1) sit between Fargate and self-managed EC2. Important: not yet in eu-central-1 at launch, which matters for German mid-sized companies with a Frankfurt preference. AWS provisions, patches (every 14 days), and replaces instances automatically. Full EC2 visibility and instance type choice. Permits what Fargate does not: privileged containers, eBPF-based observability and security agents, GPU workloads, and tasks with more than 120 GB memory. Pricing: 0.02 USD per hour flat management fee plus regular EC2 cost, regardless of instance type. All EC2 purchase options work (On-Demand, Spot, Compute Savings Plans), but Savings Plans only discount the EC2 portion.
EC2 Launch Type gives full control, all instance types available (Spot, GPU, Graviton). Karpenter on EKS or capacity providers on ECS handle autoscaling. Reserved Instances and Savings Plans cut prices by 30 to 70 percent. Patch management stays with the team, or Bottlerocket as a minimal container OS reduces the attack surface.
Rule of thumb: low volume, variable load, no operations team is a good fit for Fargate. Privileged containers, eBPF, or GPU with AWS-managed patches in a supported region match ECS Managed Instances. High volume, predictable load, Reserved Instances, or special hardware fit EC2 with self-managed patches. Hybrid setups use capacity providers or Karpenter mixed instance pools.
Service Mesh Reality After App Mesh EOL
AWS App Mesh is being discontinued, EOL on September 30, 2026. Anyone using App Mesh has to migrate. AWS-suggested migration paths:
- ECS-to-ECS communication: ECS Service Connect (AWS-managed Envoy as sidecar)
- Cross-service communication (ECS plus EKS plus Lambda plus EC2): VPC Lattice
- EKS-internal service mesh: Istio (CNCF standard) or Linkerd
VPC Lattice pricing in us-east-1: 0.025 USD per hour per service, 0.025 USD per GB processed, 0.10 USD per 1 million HTTP requests, first 300,000 per hour free. VPC association and service network endpoints are free.
Practical recommendation: ECS-only setups use Service Connect. ECS plus other services should evaluate VPC Lattice. Istio is the right answer when Kubernetes-native tracing, authorization, and traffic shaping are central. App Mesh in new projects is an anti-pattern.
EKS Auto Mode, the Game Changer for Mid-Sized Companies
Auto Mode automates: Karpenter-based compute autoscaling with AWS-managed Karpenter pods, the application load balancer controller, the EBS CSI driver for persistent volumes, GPU support with NVIDIA Device Plugin and DCGM Exporter, and SOCI Parallel Pull for container start times.
Auto Mode does not automate: Kubernetes concepts (pods, services, RBAC, network policies remain knowledge teams need), application-level operators (cert-manager, external-dns remain setup work), and service mesh (still Istio or Linkerd, no Auto Mode mesh).
Who benefits: mid-sized companies that want Kubernetes advantages (Helm ecosystem, multi-cloud option) without the full operations load. Who does not: anyone looking for ECS functionality should choose ECS, not EKS Auto Mode. Auto Mode reduces operations effort, but it does not turn EKS into ECS.
Migration Between ECS and EKS
Containers are portable, configuration is not. The image stays the same, but task definition (ECS) and pod spec (EKS) are not 1:1 swappable. IAM integration differs (task role on ECS vs. IRSA or Pod Identity on EKS).
Realistic migration effort for a five-service Laravel app: ECS to EKS is four to eight weeks, mostly Helm charts and CI/CD pipeline adjustments. EKS to ECS is three to six weeks, mostly simplifying manifests into task definitions.
When migration makes sense: outgrowing the ECS scope (multi-cloud requirement, Kubernetes standardization) or simplifying an over-dimensioned EKS setup. When it does not: migration as an end in itself or because a new architect wants to "modernize".
Decision Framework
Six questions to answer before the choice:
- How many services are we orchestrating, now and in 24 months?
- Do we have multi-cloud or hybrid requirements?
- Does the team have Kubernetes experience, or is it planned?
- Do we need specific Kubernetes features (CRDs, operators, Helm ecosystem)?
- How large is our compute volume relative to the control plane fee?
- How critical is time-to-first-production-deploy?
The recommendation matrix:
| Profile | Recommendation |
|---|---|
| One to five services, AWS stack, no Kubernetes know-how | ECS Fargate |
| Privileged containers, eBPF, GPU, or more than 120 GB memory per task | ECS Managed Instances |
| More than five services, AWS stack, Helm desired but limited operations | EKS Auto Mode |
| Multi-cloud, multi-region, large platform teams | EKS classic with own Karpenter control |
| On-premises plus AWS, data sovereignty | EKS Hybrid Nodes or ECS Anywhere |
| Batch and HPC | ECS Fargate Spot or EKS with GPU node pools |
| Stateful (databases in cluster) | usually the wrong question, check RDS or Aurora |
Anti-Patterns
Seven patterns I keep seeing in technical audits:
Kubernetes for three services: high complexity, low value. A simple ECS setup would have done the same job with much less operations overhead.
ECS for multi-cloud: ECS is AWS-only, multi-cloud breaks the mental model. ECS Anywhere is an island solution, not a full multi-cloud replacement.
EKS without Auto Mode and without a platform team: the team spends 30 percent of its time on cluster maintenance instead of features. Auto Mode or a switch to ECS dramatically reduces that effort.
App Mesh in new projects: EOL on September 30, 2026, new setups go directly to Service Connect, VPC Lattice, or Istio.
Self-built Kubernetes cluster on EC2 (kops, kubeadm): an operations nightmare, rarely justified by real requirements anymore.
Databases in the cluster without a clear strategy: stateful workloads in Kubernetes are doable, but RDS or Aurora are almost always the better default in mid-sized companies. Anyone forcing PostgreSQL into the cluster takes on backups, failover, and tuning that come for free with a managed database.
Ignoring EKS extended support: the 0.60 USD per hour fee for EOL Kubernetes versions can quietly grow sixfold over plan. As of May 2026, 1.30, 1.31, and 1.32 are in extended support, and many clusters are running on them unnoticed.
Turning on Auto Mode without Kubernetes know-how: the compute layer becomes simpler, but pods, services, RBAC, and network policies remain mandatory knowledge. Anyone lacking that hits the wall on the first production incident.
Example: Complete Setup for a Laravel App
Scenario: Laravel app with three services (Web, Worker, Scheduler), PostgreSQL on RDS, Redis on ElastiCache, monthly compute budget around 500 USD.
The ECS variant with Fargate as default and Fargate Spot for worker tasks:
resource "aws_ecs_cluster" "laravel" {
name = "laravel-production"
setting {
name = "containerInsights"
value = "enabled"
}
}
resource "aws_ecs_cluster_capacity_providers" "laravel" {
cluster_name = aws_ecs_cluster.laravel.name
capacity_providers = ["FARGATE", "FARGATE_SPOT"]
default_capacity_provider_strategy {
capacity_provider = "FARGATE"
weight = 1
base = 1
}
}
resource "aws_ecs_service" "laravel_worker" {
name = "laravel-worker"
cluster = aws_ecs_cluster.laravel.id
task_definition = aws_ecs_task_definition.laravel_worker.arn
desired_count = 2
capacity_provider_strategy {
capacity_provider = "FARGATE_SPOT"
weight = 4
}
capacity_provider_strategy {
capacity_provider = "FARGATE"
weight = 1
}
network_configuration {
subnets = var.private_subnet_ids
security_groups = [aws_security_group.laravel_tasks.id]
}
}The EKS variant with Auto Mode:
# eksctl-cluster.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: laravel-production
region: eu-central-1
version: "1.34"
autoModeConfig:
enabled: true
iam:
withOIDC: true
addons:
- name: aws-ebs-csi-driver
- name: vpc-cniAuto Mode manages the compute layer automatically, no Karpenter setup needed. The application is deployed via Helm chart or a direct manifest.
The cost comparison for this scenario in us-east-1: ECS Fargate is around 542 USD per month (see calculation above). EKS Auto Mode is 542 USD plus 73 USD control plane plus around 10 to 12 percent Auto Mode surcharge depending on instance mix. For comparable workloads, EKS lands around 100 to 130 USD per month above ECS, mostly through the control plane fee.
Conclusion
ECS and EKS are not "better or worse", they are different tools for different requirements. In mid-sized companies, ECS Fargate is the right choice for the majority of workloads. The operations savings and missing control plane fee pay off as long as the Kubernetes ecosystem is not central. A container base with production-grade PHP images is the prerequisite either way, regardless of the orchestrator.
With ECS Managed Instances since September 2025, ECS closes the most important gap to EKS for workloads that need privileged containers, eBPF, or GPU. EKS Auto Mode shifted the decision matrix at re:Invent 2024. Anyone who would have ruled out EKS for operations reasons before should reassess Auto Mode.
The final decision depends on team, workload profile, and roadmap, not on the buzzword. Mandatory homework for every EKS cluster: check the version regularly. Version 1.30 ends entirely in July 2026, 1.31 in November. Extended support is six times more expensive than standard support, and the jump happens without active notification.
Are you planning a new container orchestration setup, or do you doubt the current one? Contact me for a technical audit that clarifies architecture, pricing, and migration path in two to three days.