Amazon EKS runs the Kubernetes control plane for you, so you only manage nodes, workloads, and networking. This tutorial takes you from zero to a production-style cluster with EC2 worker nodes, a Fargate profile for serverless Pods, and traffic flowing in through the AWS Load Balancer Controller, all driven by eksctl and kubectl.
Architecture Overview

Prerequisites
aws --version
eksctl version
kubectl version --client
aws configure list
Step 1: Create an EKS Cluster
eksctl create cluster \
--name kubezilla-prod \
--region us-east-1 \
--version 1.30 \
--nodegroup-name standard-workers \
--node-type t3.medium \
--nodes 2 \
--nodes-min 2 \
--nodes-max 5 \
--managed
# eksctl provisions the VPC, EKS control plane, and a managed node group
Step 2: Point kubectl at the New Cluster
aws eks update-kubeconfig \
--region us-east-1 \
--name kubezilla-prod
kubectl get nodes
kubectl get svc
Step 3: Deploy a Containerized App
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: registry.example.com/web:2.1.0
ports:
- containerPort: 8080
resources:
requests:
cpu: "250m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
kubectl apply -f deployment.yaml
kubectl rollout status deployment/web
kubectl get pods -o wide
Step 4: Expose the App with the AWS Load Balancer Controller
# Install the controller once per cluster (via Helm)
helm repo add eks https://aws.github.io/eks-charts
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=kubezilla-prod
apiVersion: v1
kind: Service
metadata:
name: web
spec:
selector:
app: web
ports:
- port: 80
targetPort: 8080
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
kubectl apply -f service.yaml
kubectl get ingress web-ingress
# ADDRESS column shows the ALB hostname once provisioning finishes
Step 5: Add a Fargate Profile for Serverless Pods
eksctl create fargateprofile \
--cluster kubezilla-prod \
--name batch-jobs \
--namespace batch-jobs
kubectl create namespace batch-jobs
kubectl run report-job --image=registry.example.com/report:1.0 -n batch-jobs
kubectl get pods -n batch-jobs -o wide
# Pods in this namespace run on Fargate, no EC2 nodes required
Step 6: Scale Nodes Automatically
eksctl create iamserviceaccount \
--cluster kubezilla-prod \
--namespace kube-system \
--name cluster-autoscaler \
--attach-policy-arn arn:aws:iam::aws:policy/AutoScalingFullAccess \
--approve
kubectl -n kube-system set image deployment.apps/cluster-autoscaler \
cluster-autoscaler=registry.k8s.io/autoscaling/cluster-autoscaler:v1.30.0
kubectl + eksctl Cheat Sheet
eksctl get cluster # list EKS clusters
eksctl get nodegroup --cluster <name> # list node groups
aws eks update-kubeconfig --name <name> # point kubectl at a cluster
kubectl get nodes -o wide # inspect nodes and instance types
kubectl get ingress # find ALB hostnames
kubectl describe fargateprofile <name> # inspect a Fargate profile
kubectl top nodes # check CPU/memory pressure
FAQ
Do I need Fargate at all? No. Fargate is optional and useful for bursty or batch workloads where you do not want to manage EC2 capacity. Most steady-state workloads run fine on managed node groups.
Is the AWS Load Balancer Controller required? It is required for Ingress resources annotated with kubernetes.io/ingress.class: alb and for Service objects of type LoadBalancer that should provision an NLB. Without it, those objects stay pending.
How much does an EKS control plane cost? AWS charges an hourly fee per cluster for the control plane, separate from the EC2, Fargate, and load balancer costs you provision underneath it.
Summary
You created an EKS cluster with eksctl, pointed kubectl at it, deployed a Deployment and Service, exposed it through the AWS Load Balancer Controller, added a Fargate profile for serverless workloads, and wired up autoscaling, a complete path from empty AWS account to a running production-style cluster.
