0
0
Lập trình
Thaycacac
Thaycacac thaycacac

Danh Sách Kiểm Tra Triển Khai Không Gián Đoạn với Docker

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

• 5 phút đọc

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 OK khi 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.ymlapp_blueapp_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 Copy
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 Copy
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 Copy
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 Copy
# 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 Copy
# 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 Copy
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 Copy
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 Copy
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-stream hoặ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:

  1. Mở rộng – Thêm các cột hoặc bảng mới có thể null.
  2. Triển khai – Phát hành mã viết vào cả trường cũ và mới.
  3. 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 đỡ.

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