0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

🚀 Triển Khai Node.js API Sản Phẩm Trên Kubernetes Với MongoDB

Đăng vào 7 tháng trước

• 6 phút đọc

🚀 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:

Copy
Client → Ingress → Service → Pod(s) chạy Node.js API → MongoDB
                   ↑
                HPA tự động mở rộng pods

📁 Cấu Trúc Dự Án

Copy
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 Copy
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 Copy
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 Copy
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 Copy
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 Copy
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 Copy
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 Copy
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 Copy
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 Copy
echo -n "mongodb://user:pass@host:27017/product-api" | base64

HPA (hpa.yaml)

yaml Copy
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

  1. Đẩy hình ảnh Docker của bạn lên một registry (DockerHub, AWS ECR, GCP Artifact Registry).
  2. Áp dụng các bản kê khai:
bash Copy
kubectl apply -f k8s/
  1. Kiểm tra trạng thái:
bash Copy
kubectl get pods
kubectl get svc
kubectl get ingress
  1. Truy cập API:
bash Copy
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


Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào