Chiến lược triển khai Blue/Green trên Kubernetes thực hiện thế nào?
Mở đầu
Tiếp tục với bài hôm trước mình đã hướng dẫn mọi người cách triển khai ứng dụng sử dụng chiến lược Canary với Argo Rollouts thì trong bài hôm nay mình sẽ tiếp tục hướng dẫn triển khai ứng dụng với chiến lược Blue/Green sử dụng Argo Rollouts cho các ứng dụng chạy trên Kubernetes.
Bài viết trước: Chiến lược triển khai ứng dụng Canary không hề khó với Argo Rollouts
Chiến lược Blue/Green hoạt động thế nào?
Chiến lược triển khai Blue/Green là một phương pháp triển khai ứng dụng trong môi trường production mà cho phép bạn triển khai phiên bản mới của ứng dụng mà không làm gián đoạn hoạt động của phiên bản đang chạy. Để hình dung dễ hơn hãy tưởng tượng bạn có một website và cần triển khai một phiên bản mới, ta sẽ đi qua từng bước cần thực hiện:
- Bước 1: Tạo môi trường/ Chuẩn bị hạ tầng trên một môi trường mới (được gọi là Green). Môi trường hiện tại đang chạy gọi là Blue
- Bước 2: Triển khai ứng dụng với phiên bản mới trên môi trường Green đã tạo ở Bước 1
- Bước 3: Kiểm tra và xác nhận ứng dụng trên môi trường Green đang chạy bình thường, không có lỗi nghiêm trọng xảy ra. Việc kiểm tra này có thể thực hiện bằng cách mirror traffic từ môi trường Blue qua.
- Bước 4: Sau khi đã xác nhận phiên bản mới chạy ở môi trường Green đã hoạt động tốt thì ta tiến hành chuyển đổi môi trường, hay chuyển lưu lượng người dùng từ môi trường cũ Blue sang môi trường mới Green. Việc chuyển đổi này phụ thuộc vào cách thức và mô hình ứng dụng của bạn, bạn có thể thay đổi định tuyến hay bản ghi DNS để chuyển lưu lượng người dùng. Sau khi chuyển xong môi trường Blue sẽ hoạt động như môi trường dự phòng và môi trường Green sẽ là môi trường production chính phục vụ yêu cầu từ người dùng.
- Bước 5: Xóa môi trường cũ (môi trường Blue).
Cài đặt
Trong bài trước mình đã hướng dẫn mọi người cách cài đặt Argo Rollouts trên cụm Kubernetes và CLI để tương tác với Argo Rollouts rồi, các bạn xem lại ở bài trước nhé!
Bài viết trước: Chiến lược triển khai ứng dụng Canary không hề khó với Argo Rollouts
Thử nghiệm triển khai chiến lược Blue/Green
Tạo Resource cần thiết
Để thực hành thử nghiệm triển khai với chiến lược Blue/Green trên Kubernetes ta cần tạo 3 resouces bao gồm:
- 2 Services: 1 Service cho môi trường Blue và 1 Service cho môi trường Green
- 1 Rollouts: Nhằm mục đích chạy ứng dụng.
Lưu ý: Các bạn cần tạo service trước khi tạo Rollouts không thì Rollouts sẽ không thể tạo pods do thiếu service.
Các file manifest sẽ có nội dung như sau: Services:
# Service cho môi trường Blue
apiVersion: v1
kind: Service
metadata:
name: rollout-bluegreen-active
spec:
selector:
app: rollout-bluegreen
ports:
- protocol: TCP
port: 80
targetPort: 5000
---
# Service cho môi trường Green
apiVersion: v1
kind: Service
metadata:
name: rollout-bluegreen-preview
spec:
selector:
app: rollout-bluegreen
ports:
- protocol: TCP
port: 80
targetPort: 5000
Rollouts:
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollout-bluegreen
spec:
replicas: 2
revisionHistoryLimit
selector:
matchLabels:
app: rollout-bluegreen
template:
metadata:
labels:
app: rollout-bluegreen
spec:
containers:
- name: rollouts-demo
image: nghoangviet/python-api:staging
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000
strategy:
blueGreen:
activeService: rollout-bluegreen-active
previewService: rollout-bluegreen-preview
autoPromotionEnabled: false
Resource Rollouts về cơ bản tương tự như Deployment nhưng được hỗ trợ thêm 1 số trường trong .spec.strategy để phục vụ định nghĩa chiến lược triển khai ứng dụng.
Về cấu hình Service không có gì quá khó hiểu, mình sẽ giải thích 1 số trường trong resource Rollouts
- revisionHistoryLimit: 2 Chỉ định số phiên bản sẽ được lưu lại, hay số lượng replicaSet gần nhất được giữ lại.
- activeService: Định nghĩa service sẽ sử dụng cho môi trường Blue (môi trường chạy thực tế)
- previewService: Định nghĩa service sử dụng cho môi trường Green (môi trường thử nghiệm)
- autoPromotionEnabled: Chỉ định việc tự động chuyển lưu lượng người dùng qua môi trường mới (Green) khi replicaSet môi trường Green chạy thành công. Mặc định giá trị này là true
Sau khi tạo xong lần lượt ta get service, rollouts và pod sẽ có giá trị như hình
Khi lần lượt truy cập vào IP của service rollout-bluegreen-active và rollout-bluegreen-preview ta sẽ nhận được message như hình
Do hiện tại mình đang chỉ có 1 phiên bản hay 1 môi trường Blue đang hoạt động nên cả 2 service này đều được trỏ cùng vào 1 ReplicaSet.
Ngoài ra nếu các bạn có thắc mắc tại sao mình có thể truy cập được service thông qua IP của K8s sử dụng browser thì mình đang sử dụng 1 công cụ tên KubeVPN để tạo tunnel đến cụm K8s. Công cụ này mình sẽ có 1 bài viết khác để giới thiệu đến mọi người Đừng quên follow để đón chờ bài viết này nhé!
Triển khai phiên bản mới
Như vậy ta đã có đầy đủ các resource cần thiết để thử nghiệm chiến lược Blue/Green. Tiếp theo ta chạy lên UI Dashboard của Argo Rollouts bằng câu lệnh
kubectl argo rollouts dashboard
Giao diện bạn sẽ thấy có resource rollout mà chúng ta đã tạo trước đó
Để cập nhật phiên bản mới ta chọn Rollout đó và cập nhật image tại đây
hoặc bạn có thể sử dụng câu lệnh để cập nhật image mới thành nghoangviet/python-api:production
kubectl argo rollouts set image rollout-bluegreen rollouts-demo=nghoangviet/python-api:production
Sau khi cập nhật ta sẽ thấy có 2 pods mới được sinh ra tương ứng với môi trường Green
Giờ đây quá trình triển khai sẽ được tạm hoãn do chúng ta đã cấu hình autoPromotionEnabled: false. Thử truy cập vào 2 service để xem sự thay đổi của message được trả ra.
Đối với service rollout-bluegreen-preview nội dung trả ra đã được thay đổi, hay service rollout-bluegreen-preview đã trỏ sang replicaSet mới với image mới.
Service rollout-bluegreen-active vẫn được trỏ vào replicaSet cũ.
Trong thực tế sau khi xác định được môi trường mới (Green) đã hoạt động ổn định, ta sẽ tiếp tục quá trình triển khai bằng các sử dụng câu lệnh
kubectl argo rollouts promote rollouts-bluegreen
Hoặc thông qua UI tại đây
Sau khi promote, lưu lượng truy cập sẽ được chuyển qua môi trường Green 100% và mặc định sau 30s môi trường Blue sẽ được hủy bỏ, số replicas sẽ được scale về 0.
Kiểm tra lại, thử truy cập vào cả 2 service rollout-bluegreen-active và rollout-bluegreen-preview ta sẽ thấy message đều được trả về là
Kết
Như vậy mình đã hướng dẫn các bạn cách triển khai ứng dụng sử dụng chiến lược Blue/Green bằng công cụ Argo Rollouts trên môi trường Kubernetes. Hy vọng bài viết sẽ giúp các bạn phần nào đó trong công việc
Nếu thấy bài viết hay đừng quên Upvote và Follow nhé, thank all!!!
All Rights Reserved