Giới Thiệu
Triển khai các phiên bản mới mà không làm gián đoạn người dùng là một kỳ vọng không thể thương lượng đối với các dịch vụ hiện đại. Là một người dẫn đầu DevOps, bạn chắc hẳn đã phải vật lộn với việc khởi động lại từng phần khiến một vài khách hàng phải đối mặt với lỗi 502. Danh sách kiểm tra này sẽ hướng dẫn bạn qua một quy trình triển khai blue-green tập trung vào Docker mà bạn có thể dễ dàng sao chép vào quy trình CI/CD của mình ngay hôm nay.
Tại Sao Triển Khai Không Gián Đoạn Quan Trọng
- Niềm tin của người dùng: Chỉ cần một vài giây ngừng hoạt động có thể làm giảm lòng tin.
- Tác động đến doanh thu: Các doanh nghiệp SaaS mất đi thời gian có thể tính phí với mỗi sự cố.
- Chi phí vận hành: Việc khôi phục thủ công dễ dẫn đến lỗi và tốn kém.
Một chiến lược triển khai không gián đoạn được tổ chức tốt sẽ loại bỏ những rủi ro này bằng cách giữ hai môi trường sẵn sàng sản xuất hoạt động đồng thời và chuyển hướng lưu lượng truy cập một cách nguyên tử.
Điều Kiện Tiên Quyết
Trước khi bắt đầu, hãy đảm bảo rằng bạn đã có:
- Docker Engine ≥ 20.10 được cài đặt trên tất cả các máy chủ.
- Docker Compose (hoặc Docker Swarm) cho việc điều phối nhiều container.
- Một proxy ngược Nginx (hoặc HAProxy) hoạt động như điểm truy cập.
- Một endpoint kiểm tra sức khỏe cơ bản (
/healthz) trong ứng dụng của bạn trả về200 OKkhi dịch vụ đã sẵn sàng.
Nếu bạn đang sử dụng dịch vụ Kubernetes được quản lý, các khái niệm tương tự cũng áp dụng—chỉ cần thay thế các lệnh Docker bằng các lệnh tương đương kubectl.
Danh Sách Kiểm Tra
Dưới đây là danh sách kiểm tra từng bước. Đánh dấu từng ô trước khi chuyển sang giai đoạn tiếp theo.
1️⃣ Chuẩn Bị Tệp Docker Compose Blue-Green
Tạo hai dịch vụ giống hệt nhau trong một tệp docker-compose.yml—app_blue và app_green. Chỉ một trong hai dịch vụ này sẽ được truy cập lưu lượng truy cập tại một thời điểm.
yaml
version: "3.8"
services:
app_blue:
image: myorg/myapp:{{BUILD_TAG}}
environment:
- ENV=production
ports:
- "8081:80" # chỉ nội bộ, không phơi bày ra internet
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/healthz"]
interval: 10s
timeout: 3s
retries: 3
app_green:
image: myorg/myapp:{{BUILD_TAG}}
environment:
- ENV=production
ports:
- "8082:80"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/healthz"]
interval: 10s
timeout: 3s
retries: 3
Mẹo: Giữ lại placeholder
{{BUILD_TAG}}để hệ thống CI của bạn có thể chèn chính xác thẻ hình ảnh.
2️⃣ Xác Minh Kiểm Tra Sức Khỏe Tại Địa Phương
Chạy tệp compose và kiểm tra endpoint sức khỏe cho cả hai container.
bash
docker compose up -d
curl -s http://localhost:8081/healthz # nên trả về 200
curl -s http://localhost:8082/healthz # nên trả về 200
Nếu bất kỳ container nào không vượt qua kiểm tra sức khỏe, hãy sửa lỗi trước khi tiếp tục.
3️⃣ Cấu Hình Nginx Để Chuyển Hướng Lưu Lượng
Sử dụng một khối upstream hướng tới phiên bản đang hoạt động. Bạn có thể thay đổi upstream bằng cách tải lại Nginx.
nginx
upstream myapp {
# Ban đầu chỉ tới blue
server 127.0.0.1:8081;
}
server {
listen 80;
location / {
proxy_pass http://myapp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Khi bạn đã sẵn sàng để chuyển đổi, hãy chỉnh sửa dòng server thành 8082 và chạy nginx -s reload.
4️⃣ Triển Khai Môi Trường Xanh
bash
# Kéo hình ảnh mới và khởi động các container xanh
docker compose up -d app_green
Theo dõi các kiểm tra sức khỏe cho đến khi chúng chuyển sang trạng thái xanh. Chỉ khi đó bạn mới nên xem xét việc chuyển đổi lưu lượng.
5️⃣ Thực Hiện Chuyển Hướng Lưu Lượng Nguyên Tử
bash
# Cập nhật upstream Nginx để chỉ tới xanh (cổng 8082)
sed -i 's/8081/8082/' /etc/nginx/conf.d/myapp.conf
nginx -s reload
Vì Nginx tải lại cấu hình mà không làm mất các kết nối hiện có, người dùng sẽ trải nghiệm một sự chuyển giao mượt mà.
6️⃣ Xác Nhận Triển Khai Xanh
Thực hiện một bài kiểm tra nhanh với URL công khai:
bash
curl -s -o /dev/null -w "%{http_code}" https://api.myapp.com/healthz
Mong đợi một phản hồi 200. Nếu bạn thấy lỗi, hãy quay lại ngay lập tức (xem bước tiếp theo).
7️⃣ Kế Hoạch Quay Lại
Nếu phiên bản xanh có vấn đề, hãy quay lại upstream về phiên bản xanh:
bash
sed -i 's/8082/8081/' /etc/nginx/conf.d/myapp.conf
nginx -s reload
Vì các container xanh vẫn đang chạy, việc quay lại là tức thì.
8️⃣ Gỡ Bỏ Môi Trường Cũ
Khi bạn đã tự tin rằng triển khai xanh ổn định, hãy gỡ bỏ các container xanh để giải phóng tài nguyên.
bash
docker compose rm -sf app_blue
Bây giờ bạn có thể đổi tên app_green thành app_blue cho vòng đời phát hành tiếp theo, giữ cho quy ước đặt tên nhất quán.
9️⃣ Ghi Nhận & Giám Sát
- Chỉ số: Xuất thống kê Docker đến Prometheus (
docker stats --no-streamhoặc cAdvisor). - Nhật ký: Chuyển tiếp stdout/stderr của container đến một stack ELK hoặc Loki trung tâm.
- Cảnh báo: Thiết lập cảnh báo trên các lỗi kiểm tra sức khỏe hoặc các đỉnh 5xx của Nginx.
Việc có khả năng quan sát tích hợp cho phép bạn phát hiện các sự cố trước khi chúng ảnh hưởng đến người dùng.
Thêm: Di Chuyển Cơ Sở Dữ Liệu Không Gián Đoạn
Nếu bản phát hành của bạn bao gồm thay đổi lược đồ, hãy áp dụng mẫu mở rộng-co lại:
- Mở rộng – Thêm các cột hoặc bảng mới có thể null.
- Triển khai – Phát hành mã viết vào cả trường cũ và mới.
- Co lại – Sau một khoảng thời gian an toàn, xóa các cột cũ.
Chạy các di chuyển trong một công việc CI riêng đảm bảo cơ sở dữ liệu đã sẵn sàng trước khi các container xanh bắt đầu.
Kết Luận
Triển khai không gián đoạn là một chuỗi các bước nhỏ, có thể xác minh thay vì một lệnh “ma thuật” duy nhất. Bằng cách coi các môi trường xanh và blue như các dịch vụ Docker không thể thay đổi và để Nginx xử lý lưu lượng một cách nguyên tử, bạn sẽ có được sự tự tin, giảm thiểu rủi ro và giữ cho người dùng của bạn hài lòng. Nếu bạn cần hỗ trợ trong việc triển khai này, đội ngũ tại https://ramerlabs.com có thể giúp đỡ.