Giới thiệu
Nếu bạn là một trưởng nhóm DevOps có nhiệm vụ giữ cho dịch vụ web hoạt động liên tục 24/7, chắc hẳn bạn đã từng đối mặt với cảnh báo "dịch vụ ngừng hoạt động" trong quá trình triển khai. Tin tốt là với Docker, Nginx và quy trình làm việc blue-green có kỷ luật, bạn có thể triển khai mã mới mà không bao giờ làm mất đi một yêu cầu nào. Danh sách kiểm tra này sẽ hướng dẫn bạn qua các bước cụ thể, từ việc xây dựng hình ảnh đến giám sát, giúp bạn tự tin trong việc triển khai các thay đổi.
1. Xây Dựng Hình Ảnh Docker Sẵn Sàng Sản Xuất
1.1 Sử Dụng Xây Dựng Đa Giai Đoạn
Một hình ảnh cuối cùng nhẹ giúp giảm bề mặt tấn công và tăng tốc độ tải xuống. Bắt đầu với một giai đoạn xây dựng chứa tất cả các phụ thuộc thời gian biên dịch, sau đó sao chép chỉ các thành phần cần thiết.
dockerfile
# ---- Giai Đoạn Xây Dựng ----
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# ---- Giai Đoạn Thực Thi ----
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm ci --production
EXPOSE 3000
CMD ["node", "dist/index.js"]
1.2 Gán Nhãn Hình Ảnh với Các Phiên Bản Ngữ Nghĩa
Không bao giờ dựa vào nhãn latest trong sản xuất. Gán nhãn mỗi lần xây dựng với vMAJOR.MINOR.PATCH và cũng đẩy một digest sha256 để tham chiếu không thay đổi.
bash
docker build -t myapp:v1.4.2 .
docker tag myapp:v1.4.2 myregistry.example.com/myapp:v1.4.2
docker push myregistry.example.com/myapp:v1.4.2
2. Cấu Hình Nginx Làm Reverse Proxy
Nginx sẽ đứng trước các container của bạn, xử lý việc kết thúc TLS, kiểm tra sức khỏe và tải lại một cách nhẹ nhàng.
nginx
# /etc/nginx/conf.d/app.conf
upstream app_blue {
server 10.0.1.10:3000;
server 10.0.1.11:3000;
}
upstream app_green {
server 10.0.2.10:3000;
server 10.0.2.11:3000;
}
server {
listen 80;
server_name api.example.com;
# Chuyển đổi giữa blue và green qua biến
set $backend app_blue;
if ($http_x_deploy_color = "green") {
set $backend app_green;
}
location / {
proxy_pass http://$backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
- TLS – Sử dụng Let’s Encrypt hoặc PKI nội bộ của bạn và kết thúc tại Nginx.
- Kiểm Tra Sức Khỏe – Bật
proxy_next_upstreamđể bỏ qua các container không khỏe mạnh.
3. Quy Trình Triển Khai Blue-Green
3.1 Khởi Tạo Môi Trường Mới
- Triển khai hình ảnh Docker mới vào một swarm/cluster green.
- Xác minh các điểm cuối sức khỏe (
/healthz) trả về200. - Chạy các bài kiểm tra tích hợp đối với ngăn xếp green.
3.2 Chuyển Đổi Lưu Lượng Một Cách Nguyên Tử
Đặt một tiêu đề tùy chỉnh X-Deploy-Color: green trên bộ cân bằng tải hoặc sử dụng dịch vụ cờ tính năng. Nginx sẽ bắt đầu định tuyến các yêu cầu mới đến upstream green trong khi các kết nối hiện tại hoàn tất trên blue.
bash
# Ví dụ sử dụng curl để kiểm tra ngăn xếp green trước khi chuyển đổi
curl -H "Host: api.example.com" -H "X-Deploy-Color: green" http://nginx.example.com/healthz
3.3 Ngừng Hoạt Động Ngăn Xếp Cũ
Khi môi trường green đã xử lý một khoảng thời gian lưu lượng đầy đủ (ví dụ: 5 phút), hãy tắt nhẹ nhàng các container blue:
bash
docker service rm myapp_blue
Nếu có điều gì đó sai, bạn có thể quay lại ngay lập tức bằng cách loại bỏ tiêu đề X-Deploy-Color hoặc đặt lại thành blue.
4. Di Chuyển Cơ Sở Dữ Liệu Không Gián Đoạn
Ngay cả với việc hoán đổi container hoàn hảo, thay đổi schema vẫn có thể gây ra sự cố. Tuân theo các mẫu này:
- Di Chuyển chỉ thêm – Giới thiệu các cột mới với giá trị mặc định, tránh việc xóa cột cho đến khi mã cũ không còn sử dụng.
- Điền dữ liệu trong nền – Sử dụng hàng đợi công nhân để populate các trường mới mà không khóa bảng.
- API có phiên bản – Giữ phiên bản cuối điểm cũ sống trong khi phiên bản mới được triển khai.
Ví dụ Di Chuyển (PostgreSQL)
sql
-- 2024-09-23: Thêm cờ `is_active` với giá trị mặc định là true
ALTER TABLE users ADD COLUMN is_active BOOLEAN NOT NULL DEFAULT true;
-- Populate cho các hàng cũ (nếu cần)
UPDATE users SET is_active = true WHERE is_active IS NULL;
Chạy các di chuyển trước khi bạn chuyển lưu lượng đến môi trường green.
5. Quan Sát: Ghi Log & Thống Kê
Một triển khai không gián đoạn chỉ tốt như mức độ hiển thị mà bạn có.
5.1 Ghi Log Tập Trung
- Gửi stdout/stderr của container đến một bộ tổng hợp log (ví dụ: Loki, Elasticsearch).
- Gán mỗi dòng log với
deployment_color(blue/green).
yaml
# đoạn mã docker-compose.yml cho driver Loki
logging:
driver: "json-file"
options:
tag: "{{.Name}}-{{.Label "deployment_color"}}"
5.2 Thống Kê & Cảnh Báo
- Xuất các thống kê Prometheus từ cả dịch vụ blue và green.
- Tạo cảnh báo trên các đỉnh tỷ lệ lỗi, suy giảm độ trễ hoặc giảm đột ngột trong số lượng yêu cầu.
5.3 Quay Lại Tự Động
Nếu một cảnh báo được kích hoạt trong vòng 10 phút đầu tiên của việc chuyển đổi, hãy kích hoạt một công việc CI/CD mà:
- Loại bỏ tiêu đề
X-Deploy-Color: green. - Khởi động lại các dịch vụ blue nếu chúng đã bị giảm quy mô.
6. Tích Hợp Pipelines CI/CD
Kết nối mọi thứ với một quy trình làm việc GitHub Actions đơn giản.
yaml
name: Triển Khai Blue-Green
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Xây dựng hình ảnh Docker
run: |
TAG=$(git rev-parse --short HEAD)
docker build -t myregistry.example.com/myapp:$TAG .
docker push myregistry.example.com/myapp:$TAG
deploy-green:
needs: build
runs-on: ubuntu-latest
steps:
- name: Triển khai vào swarm green
run: |
docker service update --image myregistry.example.com/myapp:$TAG myapp_green
- name: Kiểm tra khói
run: |
curl -sSf -H "Host: api.example.com" -H "X-Deploy-Color: green" http://nginx.example.com/healthz
- name: Thúc đẩy lưu lượng
run: |
curl -X POST -H "Authorization: Bearer $TOKEN" https://nginx.example.com/api/switch-green
Quy trình làm việc này xây dựng, đẩy, triển khai vào ngăn xếp green, xác nhận sức khỏe và cuối cùng chuyển lưu lượng qua một điểm API nhỏ mà bạn mở trên Nginx.
7. Tóm Tắt Danh Sách Kiểm Tra
- Docker: Đa giai đoạn, nhãn ngữ nghĩa, hình ảnh runtime tối thiểu.
- Nginx: Upstream cho blue/green, kết thúc TLS, kiểm tra sức khỏe.
- Các bước Blue-Green: Triển khai green, kiểm tra khói, chuyển lưu lượng, ngừng hoạt động blue.
- Di Chuyển DB: Chỉ thêm, điền dữ liệu, API có phiên bản.
- Quan Sát: Ghi log tập trung, thống kê Prometheus, quay lại dựa trên cảnh báo.
- CI/CD: Xây dựng tự động, triển khai green, xác minh, thúc đẩy lưu lượng.
Hãy tuân thủ danh sách này cho mỗi lần phát hành và bạn sẽ loại bỏ được khoảng thời gian ngừng hoạt động đáng sợ.
Kết Luận
Triển khai không gián đoạn không phải là phép thuật; đó là kết quả của tự động hóa có kỷ luật, phân tách rõ ràng các môi trường và giám sát mạnh mẽ. Bằng cách coi blue và green như là những công dân hàng đầu trong ngăn xếp Docker-Nginx của bạn, bạn có khả năng tiến lên hoặc quay lại chỉ với một thay đổi tiêu đề. Nếu bạn cần hỗ trợ trong việc triển khai này, đội ngũ tại ramerlabs.com có thể giúp bạn.