π 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
Enter fullscreen mode Exit fullscreen mode
- 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

λ΅κΈ λ¨κΈ°κΈ°