0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Danh sách kiểm tra triển khai không ngừng nghỉ với Docker và Nginx

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

• 5 phút đọc

Giới thiệu

Triển khai các phiên bản mới của dịch vụ web mà không làm gián đoạn trải nghiệm của người dùng là một thách thức kinh điển mà bất kỳ trưởng nhóm DevOps nào cũng phải đối mặt. Với Docker phụ trách việc đóng gói ứng dụng và Nginx hoạt động như một proxy ngược đáng tin cậy, bạn có thể thực hiện các phiên bản phát hành không ngừng nghỉ thực sự. Danh sách kiểm tra này sẽ hướng dẫn bạn qua các bước thiết yếu — từ việc xây dựng hình ảnh đến việc chuyển hướng lưu lượng — để bạn có thể triển khai các tính năng một cách tự tin.


1. Lập kế hoạch trước

  • Xác định chiến lược đặt tên phiên bản – Sử dụng định dạng phiên bản ngữ nghĩa (v1.2.3) cho các thẻ Docker.
  • Xác định các điểm kiểm tra sức khỏe/healthz nên trả về 200 OK chỉ khi ứng dụng sẵn sàng.
  • Thiết lập môi trường staging riêng biệt – Giống cấu hình sản xuất nhưng tách biệt lưu lượng.
  • Ghi lại tiêu chí hoàn nguyên – Ví dụ: tỷ lệ lỗi > 2% trong 5 phút sẽ kích hoạt quay lại phiên bản.

2. Xây dựng hình ảnh Docker có thể tái tạo

Một Dockerfile có thể dự đoán giúp loại bỏ những bất ngờ “nó hoạt động trên máy của tôi”.

Copy
# Dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/index.js"]
  • Ghi rõ phiên bản hình ảnh cơ sở (node:20-alpine).
  • Tận dụng xây dựng đa giai đoạn để giữ cho hình ảnh cuối nhỏ gọn.
  • Chạy docker build với --pull để đảm bảo bạn có hình ảnh cơ sở mới nhất.
Copy
docker build -t myservice:1.2.3 --pull .

3. Nginx như một bộ cân bằng tải thông minh

Cấu hình Nginx để chuyển hướng lưu lượng tới hai nhóm upstream – blue (hiện tại) và green (mới).

Copy
# /etc/nginx/conf.d/myservice.conf
upstream blue {
    server 127.0.0.1:3001;
}
upstream green {
    server 127.0.0.1:3002;
}

server {
    listen 80;
    location / {
        proxy_pass http://blue;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
    location /healthz {
        proxy_pass http://green/healthz;
    }
}
  • Giữ proxy_pass hướng tới blue ban đầu.
  • Cung cấp một điểm kiểm tra sức khỏe riêng biệt để kiểm tra container green.
  • Tải lại Nginx một cách nhẹ nhàng với nginx -s reload – không có kết nối bị mất.

4. Quy trình triển khai Blue-Green

Bước Hành động
1 Triển khai container mới trên một cổng khác (ví dụ: 3002).
2 Chạy các kiểm tra sức khỏe cho đến khi /healthz báo cáo thành công.
3 Cập nhật upstream Nginx từ blue sang green.
4 Theo dõi các chỉ số trong một khoảng thời gian ổn định ngắn.
5 Ngừng hoạt động container cũ (blue).

4.1 Triển khai Container Green

Copy
docker run -d --name myservice-green -p 3002:3000 \
    -e NODE_ENV=production \
    myservice:1.2.3
  • Sử dụng --restart unless-stopped để tăng độ bền.
  • Đính kèm một kịch bản kiểm tra sức khỏe kiểm tra /healthz mỗi 5 giây.

4.2 Chuyển đổi lưu lượng

Copy
# Cập nhật upstream trong cấu hình đang chạy (bạn có thể sử dụng envsubst hoặc một công cụ lập khuôn)
sed -i 's/blue/green/g' /etc/nginx/conf.d/myservice.conf
nginx -s reload

Vì Nginx tải lại các worker một cách nhẹ nhàng, các kết nối hiện có sẽ hoàn thành trên upstream cũ trong khi các yêu cầu mới sẽ được chuyển đến green.

5. Quan sát và Cảnh báo

  • Chỉ số: Xuất các bộ đếm Prometheus cho độ trễ yêu cầu, tỷ lệ lỗi và số lần khởi động lại container.
  • Nhật ký: Tập trung nhật ký Docker với Loki hoặc Elasticsearch; gán thẻ với service=myservicedeployment=green.
  • Ngưỡng cảnh báo:
    • Tỷ lệ 5xx > 1% trong 2 phút.
    • Số lần khởi động lại container > 3 trong 5 phút.

Ví dụ về quy tắc Prometheus:

Copy
# alerts.yml
- alert: HighErrorRate
  expr: sum(rate(http_requests_total{status=~"5..",service="myservice"}[1m]))
        / sum(rate(http_requests_total{service="myservice"}[1m])) > 0.01
  for: 2m
  labels:
    severity: critical
  annotations:
    summary: "Tỷ lệ lỗi 5xx cao trên myservice"
    description: "Tỷ lệ lỗi vượt quá 1% trong 2 phút vừa qua."

6. Kế hoạch hoàn nguyên tự động

Ngay cả với việc kiểm tra kỹ lưỡng, mọi thứ có thể diễn ra không theo kế hoạch. Hãy chuẩn bị một kịch bản hoàn nguyên chỉ với một cú nhấp chuột:

Copy
#!/usr/bin/env bash
# rollback.sh – hoàn nguyên về phiên bản blue trước đó
sed -i 's/green/blue/g' /etc/nginx/conf.d/myservice.conf
nginx -s reload
# Dừng container green
docker stop myservice-green && docker rm myservice-green
# Khởi động lại blue nếu nó đã dừng
docker start myservice-blue
  • Lưu trữ kịch bản trong hệ thống quản lý phiên bản cùng với kho triển khai của bạn.
  • Kết hợp nó với một tác nhân của PagerDuty hoặc OpsGenie để thực hiện nhanh chóng.

7. Danh sách kiểm tra tăng cường bảo mật

  • Chạy các container dưới người dùng không phải root – thêm USER node trong Dockerfile.
  • Giới hạn khả năngdocker run --cap-drop ALL.
  • Xử lý TLS – để Nginx xử lý HTTPS với một bộ mã hóa mạnh mẽ.
  • Quản lý bí mật – tiêm các khóa API qua bí mật Docker hoặc đối tượng Secret của Kubernetes, không bao giờ mã hóa cứng.

8. Danh sách kiểm tra xác nhận cuối cùng

  • [ ] Hình ảnh Docker được xây dựng với thẻ không thay đổi (myservice:1.2.3).
  • [ ] Điểm kiểm tra sức khỏe trả về 200 trong vòng 30 giây.
  • [ ] Cấu hình Nginx trỏ đến blue trước khi chuyển.
  • [ ] Container green chạy trên cổng tách biệt và ghi nhật ký về kho trung tâm.
  • [ ] Lưu lượng được chuyển đổi thông qua việc tải lại Nginx; không có 502/504 được ghi nhận.
  • [ ] Cảnh báo Prometheus im lặng trong 5 phút sau khi chuyển.
  • [ ] Kịch bản hoàn nguyên được kiểm tra trong môi trường staging.
  • [ ] Tất cả bí mật được tải từ kho an toàn.

Kiểm tra từng mục sẽ giảm thiểu khả năng thất bại tĩnh vào sản xuất.


Kết luận

Việc triển khai không ngừng nghỉ trở nên dễ dàng hơn khi bạn tích hợp các bước này vào quy trình CI/CD của mình. Tự động hóa việc xây dựng hình ảnh, kiểm tra sức khỏe và tải lại Nginx, và bạn sẽ có nhiều thời gian hơn để cung cấp giá trị thay vì phải xử lý các vấn đề trong quá trình phát hành. Nếu bạn cần trợ giúp trong việc triển khai này, đội ngũ tại https://ramerlabs.com có thể hỗ trợ bạn.

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