🚀 Triển Khai Node.js API Sản Phẩm Trên Kubernetes Với MongoDB
Giới Thiệu
Trong thời đại hiện nay, các ứng dụng hiện đại cần khả năng mở rộng linh hoạt mà vẫn đảm bảo tính ổn định. Kubernetes (K8s) đã trở thành nền tảng lý tưởng cho việc điều phối các ứng dụng container, giúp đảm bảo khả năng mở rộng, tự phục hồi và tính di động.
Hướng dẫn này sẽ giúp bạn xây dựng và triển khai một Node.js Product API với MongoDB trên Kubernetes. Bạn sẽ học cách container hóa ứng dụng, xác định các bản kê khai Kubernetes và kích hoạt tự động mở rộng.
🧩 Chúng Ta Sẽ Xây Dựng Gì
- Một Node.js + Express REST API với CRUD cho sản phẩm
- Cơ sở dữ liệu MongoDB với Mongoose ODM
- Ứng dụng Dockerized
- Tài nguyên Kubernetes: Deployment, Service, Ingress, Secrets
- Horizontal Pod Autoscaler (HPA) cho tự động mở rộng
- Ingress Controller để truy cập từ bên ngoài
Dưới đây là luồng dữ liệu:
Client → Ingress → Service → Pod(s) chạy Node.js API → MongoDB
↑
HPA tự động mở rộng pods
📁 Cấu Trúc Dự Án
nodejs-kubernates/
├── src/
│ ├── config/db.js # Kết nối MongoDB
│ ├── controllers/ # Logic nghiệp vụ
│ ├── models/product.model.js
│ ├── routes/product.routes.js
│ ├── middlewares/ # Xử lý lỗi, xác thực
│ └── server.js # Điểm vào của Express
├── k8s/
│ ├── deployment.yaml # Triển khai ứng dụng
│ ├── service.yaml # Dịch vụ ClusterIP
│ ├── ingress.yaml # Ingress (mở rộng API)
│ ├── secret.yaml # Thông tin xác thực MongoDB
│ └── hpa.yaml # Cấu hình tự động mở rộng
├── Dockerfile
├── docker-compose.yml # Phát triển cục bộ
└── package.json
📝 Bước 1 — Xây Dựng Node.js Product API
Mô hình Product:
javascript
const productSchema = new mongoose.Schema({
name: { type: String, required: true, trim: true },
description: { type: String, default: '' },
price: { type: Number, required: true, min: 0 },
inStock: { type: Boolean, default: true }
}, { timestamps: true });
Các endpoint CRUD sẽ được cung cấp tại /api/products.
Ví dụ yêu cầu:
bash
curl -X POST http://localhost:5000/api/products \
-H "Content-Type: application/json" \
-d '{"name":"Laptop","price":999.99,"inStock":true}'
📦 Bước 2 — Container Hóa Với Docker
Dockerfile:
dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
CMD ["node", "src/server.js"]
Xây dựng và chạy cục bộ:
bash
docker build -t nodejs-kubernates .
docker run -p 5000:5000 \
-e MONGO_URI=mongodb://host.docker.internal:27017/product-api \
nodejs-kubernates
☸️ Bước 3 — Các Bản Kê Khai Kubernetes
Triển Khai (deployment.yaml)
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: product-api
spec:
replicas: 2
selector:
matchLabels:
app: product-api
template:
metadata:
labels:
app: product-api
spec:
containers:
- name: product-api
image: <REGISTRY>/nodejs-kubernates:latest
ports:
- containerPort: 5000
env:
- name: MONGO_URI
valueFrom:
secretKeyRef:
name: app-secrets
key: MONGO_URI
Dịch Vụ (service.yaml)
yaml
apiVersion: v1
kind: Service
metadata:
name: product-api-svc
spec:
selector:
app: product-api
ports:
- port: 80
targetPort: 5000
type: ClusterIP
Ingress (ingress.yaml)
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: product-api-ingress
annotations:
kubernetes.io/ingress.class: alb
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: product-api-svc
port:
number: 80
Secrets (secret.yaml)
yaml
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
MONGO_URI: <base64-encoded-uri>
Mã hóa Mongo URI của bạn:
bash
echo -n "mongodb://user:pass@host:27017/product-api" | base64
HPA (hpa.yaml)
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: product-api-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: product-api
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
🚀 Bước 4 — Triển Khai Lên Kubernetes
- Đẩy hình ảnh Docker của bạn lên một registry (DockerHub, AWS ECR, GCP Artifact Registry).
- Áp dụng các bản kê khai:
bash
kubectl apply -f k8s/
- Kiểm tra trạng thái:
bash
kubectl get pods
kubectl get svc
kubectl get ingress
- Truy cập API:
bash
curl http://<INGRESS-HOST>/api/products
📊 Bước 5 — Mở Rộng & Giám Sát
- HPA tự động mở rộng pods giữa 2–10 dựa trên mức sử dụng CPU/bộ nhớ.
- Liveness & Readiness probes đảm bảo chỉ các pods khỏe mạnh nhận lưu lượng truy cập.
- Ghi nhật ký & Giám sát: Thêm Prometheus + Grafana, hoặc chuyển nhật ký đến ELK/CloudWatch.
🔒 Những Lưu Ý Khi Triển Khai
- Sử dụng MongoDB được quản lý (Atlas, DocumentDB).
- Kích hoạt TLS/HTTPS cho ingress (cert-manager + Let’s Encrypt).
- Lưu trữ bí mật trong Kubernetes Secrets hoặc kho bảo mật bên ngoài.
- Định nghĩa yêu cầu & giới hạn tài nguyên để mở rộng dự đoán.
- Thêm một pipeline CI/CD để tự động xây dựng, đẩy và triển khai.
🎯 Kết Luận
Bạn vừa triển khai thành công một Node.js Product API trên Kubernetes với:
✅ Ứng dụng Dockerized
✅ Triển khai, Dịch vụ & Ingress Kubernetes
✅ Bí mật cho dữ liệu nhạy cảm
✅ Tự động mở rộng với HPA
Thiết lập này cung cấp một nền tảng vững chắc cho các microservices trong sản xuất.
🔗 Kho Lưu Trữ GitHub: manthanank/nodejs-kubernates
🧑💻 Tác Giả: Manthan Ankolekar