EKS vs Self-Managed K8s vs ECS

Compare EKS with running Kubernetes yourself on EC2 and with ECS, AWS's own container orchestrator.

AWS gives you several ways to run containers. Choosing well saves a lot of operational pain.

OptionControl planeBest when
EKSManaged by AWSYou want standard Kubernetes without operating the masters.
Self-managed K8s (e.g. kubeadm on EC2)You run it allYou need deep customization and accept full operational cost.
ECSManaged by AWSYou want simple AWS-native orchestration and don't need Kubernetes.

Rule of thumb

  • Already invested in the Kubernetes ecosystem (Helm, operators, portability)? Choose EKS.
  • Small AWS-only workload, want the least moving parts? ECS with Fargate is simpler.
  • Need to modify the control plane itself? Only then consider self-managed.

Example

Example · bash
# EKS uses kubectl / Kubernetes manifests
kubectl apply -f deployment.yaml

# ECS uses task definitions via the AWS CLI (different world)
aws ecs register-task-definition --cli-input-json file://task-def.json

When to use it

  • A team migrating from self-managed kubeadm clusters to EKS eliminates manual etcd backup scripts and control plane upgrade playbooks.
  • A gaming company chooses EKS over ECS because their platform team is already Kubernetes-fluent and wants portable YAML manifests.
  • A batch-processing shop evaluates EKS Fargate against ECS Fargate to pick the option that fits their existing Helm chart library.

More examples

EKS cluster via eksctl

Creates a fully managed EKS cluster in one command, contrasting with the multi-step kubeadm init process of self-managed Kubernetes.

Example · bash
eksctl create cluster \
  --name prod \
  --version 1.30 \
  --nodegroup-name workers \
  --nodes 3

ECS task definition example

An ECS task definition uses AWS-proprietary format, contrasting with the portable Kubernetes Deployment YAML used on EKS.

Example · json
{
  "family": "api-task",
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "512",
  "memory": "1024",
  "containerDefinitions": [{
    "name": "api",
    "image": "123456789.dkr.ecr.us-east-1.amazonaws.com/api:latest",
    "portMappings": [{"containerPort": 8080}]
  }]
}

Kubernetes Deployment on EKS

Standard Kubernetes Deployment YAML that runs unchanged on EKS, GKE, or AKS — demonstrating EKS's portability advantage over ECS.

Example · yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
spec:
  replicas: 3
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
      - name: api
        image: 123456789.dkr.ecr.us-east-1.amazonaws.com/api:latest
        ports:
        - containerPort: 8080

Discussion

  • Be the first to comment on this lesson.