🚀 Amazon EKS — Zero to Production Roadmap
- Architecture
Core components:
EKS Control Plane
Managed Node Groups
VPC
Private/Public Subnets
VPC CNI
CoreDNS
kube-proxy
AWS Load Balancer Controller
EBS CSI Driver
IAM / EKS Access Entries
Kubernetes RBAC
- Create EKS with Terraform
Recommended structure:
eks-project/
├── main.tf
├── variables.tf
├── outputs.tf
├── providers.tf
├── terraform.tfvars
└── modules/
├── vpc/
└── eks/
Your Terraform should create:
VPC
├── Internet Gateway
├── NAT Gateway
├── Public Subnets
├── Private Subnets
└── Route Tables
EKS
├── Control Plane
├── IAM Roles
├── Managed Node Group
└── EKS Add-ons
For production, place worker nodes in private subnets.
- Verify AWS Authentication
Before touching Kubernetes:
aws sts get-caller-identity
You should get your AWS identity.
Then:
aws eks update-kubeconfig \
--region ap-south-1 \
--name
Verify:
kubectl config current-context
Then:
kubectl get nodes
Expected:
NAME STATUS ROLES
ip-10-0-1-xxx.ec2.internal Ready
ip-10-0-2-xxx.ec2.internal Ready
- EKS Authentication
Think about authentication in two layers:
IAM
│
│ Authentication
▼
EKS API Server
│
│ Authorization
▼
Kubernetes RBAC
Authentication
AWS asks:
Who are you?
Example:
aws sts get-caller-identity
Authorization
Kubernetes asks:
What are you allowed to do?
Example:
kubectl auth can-i get pods
This distinction is very important in EKS interviews.
- EKS Access Entry
For modern EKS clusters, use EKS Access Entries where possible.
Conceptually:
IAM User / IAM Role
│
▼
EKS Access Entry
│
▼
Access Policy / Kubernetes permissions
│
▼
Kubernetes API
For example, an IAM role can be granted administrative access to the cluster.
- Kubernetes RBAC
RBAC controls permissions inside Kubernetes.
There are four important objects:
Role
ClusterRole
RoleBinding
ClusterRoleBinding
Role
Namespace-specific permissions.
Example:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: developer-role
namespace: dev
rules:
- apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"]
This allows a user to:
GET pods
LIST pods
WATCH pods
but not:
DELETE pods
CREATE pods
- RoleBinding
Connect the user to the Role:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: developer-binding
namespace: dev
subjects:
- kind: User name: ali apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: developer-role apiGroup: rbac.authorization.k8s.io
Apply:
kubectl apply -f role.yaml
kubectl apply -f rolebinding.yaml
Test:
kubectl auth can-i get pods -n dev --as=ali
Expected:
yes
Test something unauthorized:
kubectl auth can-i delete deployment -n dev --as=ali
Expected:
no
- VPC CNI
This is one of the most important EKS concepts.
AWS VPC CNI gives Kubernetes pods networking through the AWS VPC.
EKS Node
│
├── Primary ENI
│
├── Secondary ENI
│
├── Pod IP
│
├── Pod IP
│
└── Pod IP
Check it:
kubectl get pods -n kube-system
Look for:
aws-node-xxxxx
Check:
kubectl get daemonset aws-node -n kube-system
- Why VPC CNI Matters
Suppose your node has:
10.0.1.10
A pod may receive:
10.0.1.50
That IP comes from the VPC networking system.
Therefore your pods can communicate with AWS resources such as:
RDS
ElastiCache
ALB
S3 via VPC endpoints
Secrets Manager via VPC endpoints
- Deploy an Application
Example:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Apply:
kubectl apply -f deployment.yaml
Check:
kubectl get pods
- Service
Expose the pods internally:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: ClusterIP
Then:
kubectl apply -f service.yaml
Check:
kubectl get svc
- ALB Ingress
For external traffic:
Internet
│
▼
AWS ALB
│
▼
Kubernetes Ingress
│
▼
Service
│
▼
Pods
You'll normally use the AWS Load Balancer Controller for this.
- Production Application Architecture
For your DevOps project, a good architecture is:
Internet
│
▼
Route 53
│
▼
AWS ALB
│
┌─────┴─────┐
│ Ingress │
└─────┬─────┘
│
┌────────┴────────┐
│ │
Frontend Backend
│ │
│ ┌────┴────┐
│ │ │
│ RDS Redis
│
▼
Pods
- CI/CD
Your final pipeline can be:
Developer
│
▼
GitHub
│
▼
GitHub Actions
│
├── Test
├── SonarQube
├── Docker Build
├── Docker Push
│
▼
Amazon ECR
│
▼
EKS
│
▼
Rolling Deployment
Use GitHub OIDC → AWS IAM Role rather than storing long-lived AWS access keys.
- Final Production Flow GitHub │ ▼ GitHub Actions │ OIDC Authentication │ ▼ AWS IAM │ ┌──────────┴──────────┐ │ │ ▼ ▼ ECR EKS │ │ Docker Image Kubernetes │ ┌────────┴────────┐ │ │ Ingress Services │ │ └────────┬────────┘ │ ▼ Pods │ ┌─────────────┼─────────────┐ ▼ ▼ ▼ RDS Redis AWS APIs

Top comments (0)