Kubernetes

Kubernetes on AWS: Deploying Production Workloads with Amazon EKS

August 7, 2026 Kubezilla Team 3 min read
Kubernetes on AWS EKS architecture diagram showing developer kubectl and eksctl, EKS control plane, VPC with managed node group EC2 and Fargate profile, AWS Load Balancer Controller, and internet traffic

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

Kubernetes on AWS EKS architecture diagram showing developer kubectl and eksctl, EKS control plane, VPC with managed node group EC2 and Fargate profile, AWS Load Balancer Controller, and internet traffic

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.

Leave a comment