EDEvangelos Dimitriadis
  • About me
  • Blog
  • Services
  • Projects
  • OpenSource
  • Uses
  • Contact
← Back to the blog

AWS ECS vs. EKS: Container Orchestration Compared

ED
Evangelos Dimitriadis
May 7, 2026
AWS ECS vs. EKS: Container-Orchestrierung im Vergleich

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: 9000

Kubernetes Versions and the Pricing Risk

As of May 2026, three Kubernetes versions are in EKS standard support and three in extended support:

VersionEKS ReleaseEnd of Standard SupportEnd of Extended Support
1.35Jan 27, 2026Mar 27, 2027Mar 27, 2028
1.34Oct 2, 2025Dec 2, 2026Dec 2, 2027
1.33May 29, 2025Jul 29, 2026Jul 29, 2027
1.32Jan 23, 2025Mar 23, 2026 (passed)Mar 23, 2027
1.31Sep 26, 2024Nov 26, 2025 (passed)Nov 26, 2026
1.30May 23, 2024Jul 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:

ServiceStandardExtended SupportHybrid Nodes
ECS control plane0 USDn/an/a
EKS control plane0.10 USD/hr per cluster0.60 USD/hr per clustertiered from 0.020 USD/vCPU/hr

Fargate pricing is identical for ECS and EKS:

ComponentLinux x86Linux ARM (Graviton)Windows x86
vCPU-hour0.04048 USDaround 0.032 USD (about 20 percent cheaper)around 0.0915 USD plus OS fee
GB memory-hour0.004445 USDidenticalidentical
Ephemeral storage20 GB included, more from 0.0001 USD/GB/hridenticalidentical
Spot discountup to 70 percentidenticalidentical
Compute Savings Plansup to 50 percentidenticalidentical

ECS has three compute options that are mixable:

Compute modelPricingUse case
Fargate0.04048 USD/vCPU/hr plus 0.004445 USD/GB/hrStandard workloads, no server management
ECS Managed Instances0.02 USD/hr flat plus EC2 costPrivileged containers, eBPF, GPU, more than 120 GB memory
EC2 Launch TypeEC2 cost onlyFull control, Reserved Instances, special hardware
ECS Anywhere0.01025 USD/hr per instance plus your own hardwareOn-premises containers under ECS control

EKS Auto Mode adds different surcharges per instance type:

InstanceEC2 On-DemandAuto Mode surchargeTotal with Auto Mode
m5.large (2 vCPU, 8 GB)around 0.096 USD/hraround 0.01152 USD/hraround 0.108 USD/hr
m5a.xlarge (4 vCPU, 16 GB)around 0.172 USD/hraround 0.02064 USD/hraround 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:

  1. How many services are we orchestrating, now and in 24 months?
  2. Do we have multi-cloud or hybrid requirements?
  3. Does the team have Kubernetes experience, or is it planned?
  4. Do we need specific Kubernetes features (CRDs, operators, Helm ecosystem)?
  5. How large is our compute volume relative to the control plane fee?
  6. How critical is time-to-first-production-deploy?

The recommendation matrix:

ProfileRecommendation
One to five services, AWS stack, no Kubernetes know-howECS Fargate
Privileged containers, eBPF, GPU, or more than 120 GB memory per taskECS Managed Instances
More than five services, AWS stack, Helm desired but limited operationsEKS Auto Mode
Multi-cloud, multi-region, large platform teamsEKS classic with own Karpenter control
On-premises plus AWS, data sovereigntyEKS Hybrid Nodes or ECS Anywhere
Batch and HPCECS 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-cni

Auto 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.

About meBlogProjectsContactImprintPrivacy Policy

Made in Gerlingen, 2026