Kubernetes Orchestration
Learn container orchestration with Docker Compose and Kubernetes for managing microservices deployments. This is a foundational concept in server-side JavaScript development that professional developers rely on daily. The explanations below are written to be beginner-friendly while covering the depth and nuance that comes from real-world Node.js experience. Take your time with each section and practice the examples
Docker Compose for Microservices
Docker Compose allows you to define and run multi-container Docker applications, perfect for local microservices development.. This is an essential concept that every Node.js developer must understand thoroughly. In professional development environments, getting this right can mean the difference between code that works reliably and code that breaks in production. The following sections break this down into clear, digestible pieces with practical examples you can try immediately
Docker Compose Configuration
# docker-compose.yml
version: '3.8'
services:
# API Gateway
api-gateway:
build: ./api-gateway
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- USER_SERVICE_URL=http://user-service:3001
- PRODUCT_SERVICE_URL=http://product-service:3002
- ORDER_SERVICE_URL=http://order-service:3003
depends_on:
- user-service
- product-service
- order-service
networks:
- microservices
# User Service
user-service:
build: ./user-service
ports:
- "3001:3001"
environment:
- NODE_ENV=production
- MONGODB_URL=mongodb://mongo:27017/users
depends_on:
- mongo
networks:
- microservices
# Product Service
product-service:
build: ./product-service
ports:
- "3002:3002"
environment:
- NODE_ENV=production
- MONGODB_URL=mongodb://mongo:27017/products
depends_on:
- mongo
networks:
- microservices
# Order Service
order-service:
build: ./order-service
ports:
- "3003:3003"
environment:
- NODE_ENV=production
- MONGODB_URL=mongodb://mongo:27017/orders
- RABBITMQ_URL=amqp://rabbitmq:5672
depends_on:
- mongo
- rabbitmq
networks:
- microservices
# Database
mongo:
image: mongo:5.0
ports:
- "27017:27017"
volumes:
- mongo_data:/data/db
networks:
- microservices
# Message Queue
rabbitmq:
image: rabbitmq:3-management
ports:
- "5672:5672"
- "15672:15672"
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=admin
volumes:
- rabbitmq_data:/var/lib/rabbitmq
networks:
- microservices
# Redis for caching
redis:
image: redis:6-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- microservices
volumes:
mongo_data:
rabbitmq_data:
redis_data:
networks:
microservices:
driver: bridgeKubernetes Deployment
# user-service-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service
labels:
app: user-service
spec:
replicas: 3
selector:
matchLabels:
app: user-service
template:
metadata:
labels:
app: user-service
spec:
containers:
- name: user-service
image: user-service:latest
ports:
- containerPort: 3001
env:
- name: NODE_ENV
value: "production"
- name: MONGODB_URL
valueFrom:
secretKeyRef:
name: mongodb-secret
key: url
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 3001
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 3001
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
selector:
app: user-service
ports:
- protocol: TCP
port: 80
targetPort: 3001
type: ClusterIPService Mesh with Istio
# istio-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: microservices-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "microservices.local"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: microservices-routes
spec:
hosts:
- "microservices.local"
gateways:
- microservices-gateway
http:
- match:
- uri:
prefix: /api/users
route:
- destination:
host: user-service
port:
number: 80
- match:
- uri:
prefix: /api/products
route:
- destination:
host: product-service
port:
number: 80Monitoring & Observability
# prometheus-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
data:
prometheus.yml: |
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'microservices'
static_configs:
- targets: ['user-service:3001', 'product-service:3002', 'order-service:3003']
metrics_path: /metrics
scrape_interval: 5sMini-Project: Complete Kubernetes Setup
# Complete Kubernetes deployment for microservices
# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: microservices
---
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: microservices-config
namespace: microservices
data:
NODE_ENV: "production"
LOG_LEVEL: "info"
---
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: microservices-secrets
namespace: microservices
type: Opaque
data:
mongodb-url: <base64-encoded-url>
jwt-secret: <base64-encoded-secret>
---
# api-gateway-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-gateway
namespace: microservices
spec:
replicas: 2
selector:
matchLabels:
app: api-gateway
template:
metadata:
labels:
app: api-gateway
spec:
containers:
- name: api-gateway
image: api-gateway:latest
ports:
- containerPort: 3000
envFrom:
- configMapRef:
name: microservices-config
- secretRef:
name: microservices-secrets
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
---
# api-gateway-service.yaml
apiVersion: v1
kind: Service
metadata:
name: api-gateway
namespace: microservices
spec:
selector:
app: api-gateway
ports:
- port: 80
targetPort: 3000
type: LoadBalancer
---
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: microservices-ingress
namespace: microservices
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: microservices.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-gateway
port:
number: 80