Wednesday, 16 July 2025
EKS - 1
✅ Web App (3 Pods)
✅ MongoDB (3 Pods)
✅ AWS ALB Ingress
✅ Uses: Deployment, Service, ConfigMap, Secret, Ingress
# ===========================
# 1. Secret for MongoDB creds
# ===========================
apiVersion: v1
kind: Secret
metadata:
name: mongo-secret
type: Opaque
stringData:
mongo-username: mongouser
mongo-password: mongopass
---
# ===========================
# 2. ConfigMap for WebApp
# ===========================
apiVersion: v1
kind: ConfigMap
metadata:
name: webapp-config
data:
mongo-uri: mongodb://mongo-service:27017/mydb
---
# ===========================
# 3. MongoDB Deployment
# ===========================
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo
spec:
replicas: 3
selector:
matchLabels:
app: mongo
template:
metadata:
labels:
app: mongo
spec:
containers:
- name: mongo
image: mongo:6
ports:
- containerPort: 27017
env:
- name: MONGO_INITDB_ROOT_USERNAME
valueFrom:
secretKeyRef:
name: mongo-secret
key: mongo-username
- name: MONGO_INITDB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mongo-secret
key: mongo-password
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 10
periodSeconds: 15
readinessProbe:
httpGet:
path: /readyz
port: 80
initialDelaySeconds: 5
periodSeconds: 10
---
# ===========================
# 4. MongoDB Service
# ===========================
apiVersion: v1
kind: Service
metadata:
name: mongo-service
spec:
selector:
app: mongo
ports:
- protocol: TCP
port: 27017
targetPort: 27017
type: ClusterIP
---
# ===========================
# 5. WebApp Deployment
# ===========================
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 3
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: your-ecr-repo/your-webapp:latest # Replace this
ports:
- containerPort: 80
env:
- name: MONGO_URI
valueFrom:
configMapKeyRef:
name: webapp-config
key: mongo-uri
- name: MONGO_USER
valueFrom:
secretKeyRef:
name: mongo-secret
key: mongo-username
- name: MONGO_PASS
valueFrom:
secretKeyRef:
name: mongo-secret
key: mongo-password
---
# ===========================
# 6. WebApp Service
# ===========================
apiVersion: v1
kind: Service
metadata:
name: webapp-service
labels:
app: webapp
spec:
selector:
app: webapp
ports:
- port: 80
targetPort: 80
type: ClusterIP
---
# ===========================
# 7. Ingress for WebApp via AWS ALB
# ===========================
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: webapp-ingress
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
spec:
rules:
- host: webapp.example.com # Update with your domain or local entry
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webapp-service
port:
number: 80
✅ Deploy It
kubectl apply -f k8s-all.yaml
✅ How External Access Works in EKS
In EKS, to expose a service (like your web app) externally, you use:
๐ธ Step 1: Internal Communication
webapp-service (ClusterIP): Exposes port 80 inside the cluster.
Pods can talk to it, but not accessible from outside.
๐ธ Step 2: Expose via Ingress
webapp-ingress defines routing rules for HTTP requests from outside.
Uses the AWS Load Balancer Controller to provision an ALB (Application Load Balancer).
✅ Flow of External Access
INTERNET
│
▼
[ALB] ← created by Ingress via AWS ALB Controller
│
▼
[Ingress] ──> matches path/host → routes to
│
▼
[webapp-service] (type: ClusterIP)
│
▼
[webapp pods]
๐งช Example: Customer Service Endpoints
Let’s say your FastAPI app exposes:
Endpoint HTTP Verb Description
/customer GET List all customers
/customer POST Add a new customer
/customer/{id} GET Get specific customer
/customer/{id} PUT Update a customer
๐ Accessing Endpoints via ALB
Assume your Ingress sets the host as:
host: webapp.example.com
And AWS ALB provides a DNS:
➡ a1b2c3d4e5f6.elb.us-east-1.amazonaws.com
You can:
๐ Option 1: Map DNS via /etc/hosts (Local Dev)
sudo nano /etc/hosts
Add:
a1b2c3d4e5f6.elb.us-east-1.amazonaws.com webapp.example.com
๐ Option 2: Use Route 53 DNS (Production)
Point webapp.example.com to ALB DNS in a Route 53 Hosted Zone.
๐งช Test from Local
Use curl or Postman:
# List all customers
curl http://webapp.example.com/customer
# Get specific customer
curl http://webapp.example.com/customer/123
# Add new customer (POST)
curl -X POST http://webapp.example.com/customer \
-H "Content-Type: application/json" \
-d '{"name": "John", "email": "john@example.com"}'
# Update customer
curl -X PUT http://webapp.example.com/customer/123 \
-H "Content-Type: application/json" \
-d '{"email": "john.new@example.com"}'
✅ What Are Liveness and Readiness Probes in Kubernetes?
Probes are used by Kubernetes to check the health of your application:
Probe Type Purpose
Liveness Probe Checks if the app is alive and should continue running
Readiness Probe Checks if the app is ready to serve traffic
⚙️ What Happens
Situation Liveness Status Readiness Status Effect
App starts booting up ✅ alive ❌ not ready No traffic routed yet
App fully ready ✅ alive ✅ ready Traffic routed
App gets stuck (infinite loop) ❌ dead ❌ not ready Pod is restarted
App healthy but DB is down ✅ alive ❌ not ready Pod not removed, but traffic not routed
✅ What is a Kubernetes Operator?
A Kubernetes Operator is a method of automating the management of complex, stateful applications on Kubernetes using custom resources and custom controllers.
examle - MondoDB, ArogoCD
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment