Skip to content

AWS EKS — Elastic Kubernetes Service

Amazon Elastic Kubernetes Service (EKS) is a managed Kubernetes service that removes the complexity of running and maintaining the Kubernetes control plane. You focus on deploying applications; AWS manages etcd, the API server, and control-plane updates.

In Azure terms: AWS EKS = Azure Kubernetes Service (AKS)

EKS Cluster
├── Control Plane (managed by AWS)
│ ├── API Server
│ ├── etcd
│ └── Scheduler / Controller Manager
└── Data Plane (your nodes)
├── Managed Node Group (EC2)
├── Self-managed Node Group (EC2)
└── Fargate Profile (serverless)
TypeDescriptionBest For
Managed Node GroupsAWS manages EC2 nodes — provisioning, updates, drainingStandard workloads
Self-managed NodesYou manage EC2 nodes manuallyCustom AMIs, fine control
Fargate ProfilesServerless — no EC2 to manage; pods run on FargateBatch jobs, isolation, simplicity
KarpenterOpen-source node provisioner — faster scaling than Cluster AutoscalerCost-optimized autoscaling

IRSA (IAM Roles for Service Accounts) lets Kubernetes pods assume IAM roles without storing credentials:

# Service account with IRSA annotation
apiVersion: v1
kind: ServiceAccount
metadata:
name: s3-reader
namespace: default
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789:role/eks-s3-read-role

Any pod using this service account can call S3 with the permissions of that IAM role — no credentials in the container. This is equivalent to Azure Workload Identity in AKS.

Add-onPurpose
AWS Load Balancer ControllerProvisions ALB/NLB from Kubernetes Ingress/Service objects
Amazon EBS CSI DriverDynamic provisioning of EBS volumes for PersistentVolumeClaims
Amazon EFS CSI DriverShared ReadWriteMany volumes via EFS
CoreDNSDNS resolution inside the cluster
kube-proxyNetwork rules on each node
VPC CNIPod networking — each pod gets a real VPC IP address
AWS Secrets Manager CSIMount secrets from Secrets Manager/SSM as files
FeatureAWS EKSAzure AKS
Managed control planeYesYes
Node typesEC2, FargateVMs, Virtual Nodes (ACI)
Node autoscalingCluster Autoscaler / KarpenterCluster Autoscaler / KEDA
Pod identityIRSAAzure Workload Identity
Container registryECRACR
IngressAWS Load Balancer Controller (ALB)AGIC (App Gateway) / NGINX
Storage CSIEBS, EFS CSI driversAzure Disk, Azure File CSI
MonitoringCloudWatch Container Insights + X-RayAzure Monitor / Container Insights
NetworkingVPC CNI (native pod IPs)Azure CNI / Kubenet
PricingControl plane: $0.10/hour + node costsControl plane: free + node costs

EKS control plane costs $0.10/hour (~$72/month) per cluster. AKS control plane is free.

Terminal window
# Install eksctl
# https://eksctl.io/installation/
# Create a cluster (takes ~15 minutes)
eksctl create cluster \
--name my-cluster \
--region us-east-1 \
--nodegroup-name standard-nodes \
--node-type t3.medium \
--nodes 3 \
--nodes-min 1 \
--nodes-max 5 \
--managed
# Configure kubectl
aws eks update-kubeconfig --region us-east-1 --name my-cluster
# Verify
kubectl get nodes
kubectl get pods -A
# Deploy a sample app
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=LoadBalancer
# Delete the cluster
eksctl delete cluster --name my-cluster --region us-east-1

Run pods on Fargate — no node management:

# eksctl Fargate profile
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: my-cluster
region: us-east-1
fargateProfiles:
- name: default
selectors:
- namespace: default
- namespace: kube-system
  • Use Spot instances for non-critical workloads in managed node groups
  • Use Karpenter instead of Cluster Autoscaler for faster, cost-aware scaling
  • Right-size nodes with AWS Compute Optimizer recommendations
  • Use Fargate only for small or bursty workloads (Fargate is more expensive per CPU/RAM)
  • Set resource requests and limits on all pods to prevent over-provisioning