Quay lại

Triển khai ứng dụng Node.js + PostgreSQL trên Kubernetes với Ingress – Hướng dẫn thực chiến từ A-Z Chuyên mục Devops    2025-06-17    1 Lượt xem    1 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Ảnh nhìn tổng quan

Bài viết này sẽ hướng dẫn bạn triển khai một ứng dụng Node.js kết nối PostgreSQL trên Kubernetes (Minikube), kết hợp với Ingress Controller để truy cập qua domain local simple.local.

Chúng ta sẽ:

  • Tạo Dockerfile cho Node.js

  • Viết Deployment/Service/Postgres YAML

  • Dùng Ingress Controller routing domain

  • Kết nối API với DB qua Service

  • Debug khi gặp lỗi 404, không resolve domain


1. Cài đặt Minikube + Ingress

minikube start --driver=docker
minikube addons enable ingress

Lấy IP Minikube:

minikube ip
# Ví dụ: 192.168.49.2

Chính sửa /etc/hosts

sudo nano /etc/hosts

Thêm dòng:

192.168.49.2  simple.local

2. Cấu trúc project

my-app/
├── Dockerfile
├── server.js
├── package.json
└── k8s/
    ├── api.yaml
    ├── postgres.yaml
    └── ingress.yaml

3. Viết app Node.js

server.js

const express = require('express');
const { Client } = require('pg');

const app = express();
const client = new Client({
  host: process.env.PGHOST || 'postgres-service',
  user: 'postgres',
  password: 'postgres',
  database: 'mydb',
});

client.connect()
  .then(() => console.log('Connected to PostgreSQL'))
  .catch(err => console.error('Connection error', err.stack));

app.get('/', async (req, res) => {
  const result = await client.query('SELECT NOW()');
  res.send(`Time from DB: ${result.rows[0].now}`);
});

app.listen(3000, () => console.log('Server running on port 3000'));

package.json

{
  "name": "simple-api",
  "version": "1.0.0",
  "main": "server.js",
  "dependencies": {
    "express": "^4.18.2",
    "pg": "^8.11.1"
  }
}

Dockerfile

FROM node:18-alpine
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3000
CMD ["node", "server.js"]

4. Build & Push image

docker build -t yourdockerhub/simple-api .
docker push yourdockerhub/simple-api

(Thay yourdockerhub bằng Docker Hub cá nhân) nhớ đăng nhập vào docker trước nhé !

docker login

5. Viết YAML triển khai

postgres.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:15
          env:
            - name: POSTGRES_PASSWORD
              value: postgres
            - name: POSTGRES_DB
              value: mydb
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgres-storage
      volumes:
        - name: postgres-storage
          persistentVolumeClaim:
            claimName: postgres-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: postgres-service
spec:
  selector:
    app: postgres
  ports:
    - port: 5432

api.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: simple-api
spec:
  replicas: 2
  selector:
    matchLabels:
      app: simple-api
  template:
    metadata:
      labels:
        app: simple-api
    spec:
      containers:
        - name: simple-api
          image: yourdockerhub/simple-api
          ports:
            - containerPort: 3000
          env:
            - name: PGHOST
              value: postgres-service
---
apiVersion: v1
kind: Service
metadata:
  name: simple-api-service
spec:
  selector:
    app: simple-api
  ports:
    - port: 80
      targetPort: 3000

ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-api-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: simple.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: simple-api-service
                port:
                  number: 80

6. Triển khai Kubernetes

kubectl apply -f k8s/postgres.yaml
kubectl apply -f k8s/api.yaml
kubectl apply -f k8s/ingress.yaml

Truy cập: http://simple.local


7. Kiểm tra & Debug

Xem log container

kubectl logs deployment/simple-api
kubectl logs deployment/postgres

Kiểm tra ingress routing

kubectl get ingress
kubectl describe ingress simple-api-ingress

Curl test:

curl -H "Host: simple.local" http://$(minikube ip)

8. Kết luận

Đây là một project mẫu hoàn chỉnh dễ hiểu và cực kỳ thïch hợp cho beginner làm quen Kubernetes:

  • Dựng app backend nối DB qua service

  • Dùng Ingress để routing domain

  • Build image tự viết và deploy trên local

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday