+4

Chiến lược triển khai ứng dụng Canary không hề khó với Argo Rollout

Argo Rollout là gì?

image.png

Argo Rollouts là một công cụ mã nguồn mở được phát triển bởi Argo Project, được sử dụng để quản lý việc triển khai ứng dụng và cập nhật tự động trong môi trường Kubernetes. Một project khác của Argo các bạn chắc đã nghe rất nhiều đó chính là ArgoCD đóng vai trò Continuous Delivery trong quá trình CI/CD.

Argo Rollout hoạt động với vai trò là Kubernetes Controller, Argo Rollout có các CRDs như Rollout, Experiment, Analysisruns, Analysistemplates,... nhằm cung cấp các chiến lược triển khai nâng cao cho ứng dụng chạy trên môi trường K8s như Blue-Green, Canary,...

Mặc định khi cấu hình Deployment trong K8s ta có thể cấu hình trường .spec.strategy.type với 2 giá trị: RollingUpdate hoặc Recreate tương ứng với 2 kiểu triển khai ứng dụng.

Tìm hiểu về 2 chiến lược triển khai RollingUpdate và Recreate tại đây.

Tuy nhiên với 2 chiến lược được cung cấp mặc định từ K8s thì vẫn còn những nhược điểm và chưa đủ đáp ứng cho môi trường thực tế. Chính vì thể Argo Rollout ra đời cung cấp công cụ giúp bạn dễ dàng cập nhật ứng dụng với chiến lược Blue-Green và Canary.

Cài đặt

CLI

Để tương tác được với CRD tạo ra bởi Argo Rollout bạn có thể sử dụng giao diện UI hoặc CLI. Để cài đặt CLI cho Linux bạn chạy các command sau:

curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64 
chmod +x ./kubectl-argo-rollouts-linux-amd64 
sudo mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts

Chạy câu lệnh sau để kiểm tra việc cài đặt đã thành công hay chưa:

kubectl argo rollouts version

Argo Rollout Controller

Argo Rollout Controller là thành phần chạy trên cụm K8s với mục đích giám sát các CRD và điều phối các chiến lược triển khai bạn sẽ thực hiện. Để cài đặt ta chạy câu lệnh sau:

kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml

2 câu lệnh trên sẽ tạo namespace argo-rollouts và các resource liên quan. Sau khi chạy xong bạn sẽ thấy có 1 deployment ở trong namespace argo-rollouts

image.png

Triển khai ứng dụng với chiến lược Canary

Như vậy chúng ta đã cài đặt xong Argo Rollout lên trên cụm K8s và công cụ CLI để tương tác với Argo Rollout, giờ thì ta đã có đầy đủ các thành phần để thử nghiệm triển khai ứng dụng với chiến lược Canary. Tuy nhiên trước hết khi thực hành chiến lược này ta cần hiểu chiến lược này hoạt động thế nào, nếu các bạn đã biết về chiến lược này có thể bỏ qua phần tiếp theo.

Chiến lược triển khai Canary là gì?

image.png

Tên "Canary" hay Chim hoàng yến trong chiến lược triển khai ứng dụng "Canary deployment" được lấy cảm hứng từ cách mà các thợ mỏ sử dụng những con chim hoàng yến để báo động cho họ về sự tồn tại của khí gas độc trong mỏ. Ý tưởng chính của chiến lược Canary deployment là phát triển và triển khai phiên bản mới của ứng dụng ở quy mô nhỏ, an toàn và kiểm tra nó trước khi đưa ra cho người dùng cuối.

Trong triển khai Canary, phiên bản mới của ứng dụng được triển khai song song với phiên bản hiện có. Tuy nhiên, chỉ một phần nhỏ người dùng (như là một nhóm nhỏ hoặc một phần trăm nhất định) được chuyển hướng sang sử dụng phiên bản mới, trong khi phần còn lại vẫn sử dụng phiên bản hiện có.

Qua quá trình theo dõi, người quản lý hệ thống có thể thu thập thông tin về hiệu suất và ổn định của phiên bản mới. Nếu phiên bản Canary không gặp vấn đề và đạt được các chỉ số hiệu suất mong đợi, thì ta có thể tiến hành chuyển hướng toàn bộ người dùng sang phiên bản mới. Ngược lại, nếu có vấn đề, người quản lý có thể ngừng triển khai hoặc chuyển hướng trở lại phiên bản hiện có để tránh tác động đến người dùng.

Các chiến lược triển khai Canary đảm bảo rằng sự thay đổi trong ứng dụng được thử nghiệm và xác minh trước khi được triển khai rộng rãi. Điều này giúp giảm thiểu rủi ro cho người dùng cuối, đồng thời cung cấp khả năng phản hồi nhanh và quản lý tình huống khi có sự cố xảy ra.

Hy vọng đoạn văn bản được gen bằng ChatGPT bên trên đã giúp bạn hiểu được Canary deploy hoạt động thế nào 😄

Triển khai ứng dụng với chiến lược Canary

Argo Rollout cung cấp cho chúng ta một CRD có tên Rollout nhằm thay thế Deployment. Với Rollout ta có thể tích hợp thêm các chiến lược triển khai mới thay vì chỉ RollingUpdate và Recreate như Deployment.

Ta tạo resource Rollout với cấu hình như sau:

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: rollouts-canary
spec:
  replicas: 5
  strategy:
    canary:
      steps:
      - setWeight: 20
      - pause: {}
      - setWeight: 40
      - pause: {duration: 10}
      - setWeight: 60
      - pause: {duration: 10}
      - setWeight: 80
      - pause: {duration: 10}
  revisionHistoryLimit: 5
  selector:
    matchLabels:
      app: rollouts-canary
  template:
    metadata:
      labels:
        app: rollouts-canary
    spec:
      containers:
      - name: rollouts-canary
        image: nghoangviet/python-api:staging
        ports:
        - name: http
          containerPort: 5000
          protocol: TCP

Bạn sẽ thấy cấu hình của Rollout có phần tương đồng với Deployment chỉ khác ở phần **.spec.strategy** . Ở phần **.spec.strategy.steps** sẽ khai báo cách thức mà quá trình triển khai dạng Canary sẽ diễn ra. Với ví dụ trên các bước sẽ diễn ra như sau:
  • setWeight: 20 => Khi quá trình triển khai được diễn ra, pod với image mới sẽ được sinh ra và nhận 20% số lượng request, hay 20% số lượng người dùng đang được chuyển sang dùng phiên bản mới.
  • pause: {} => Quá trình triển khai sẽ được tạm ngừng vô thời hạn để đánh giá ảnh hưởng. Bước này yêu cầu sẽ cần hành động xác nhận thủ công để chuyển sang bước tiếp theo.
  • setWeight: 40 => Số lượng request chuyển sang phiên bản mới tăng lên 40%
  • pause: {duration: 10} => Tạm dừng quá trình 10 giây. Nếu bạn muốn thay đổi thành 10 phút thì khai báo duration: 10m, tương tự 10h, 10d,...
  • setWeight: 60 => Số lượng request chuyển sang phiên bản mới tăng lên 60%
  • pause: {duration: 10} => Tạm dừng quá trình 10 giây.
  • setWeight: 80 => Số lượng request chuyển sang phiên bản mới tăng lên 80%
  • pause: {duration: 10} => Tạm dừng quá trình 10 giây.
  • Cuối cùng chuyển toàn bộ lưu lượng về phiên bản mới.

Tiếp theo ta tạo Service với type là Nodeport để có thể truy cập được service từ bên ngoài cụm.

apiVersion: v1
kind: Service
metadata:
  name: rollouts-demo
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 5000
    protocol: TCP
    name: http
  selector:
    app: rollouts-canary

Sau khi tạo xong ta get pod và service sẽ thấy như hình, truy cập qua IP Node với port 31449 ta sẽ nhận được message "Login Required - Staging Env"

image.png

Tiếp theo ta sẽ tiếp hành cập nhật phiên bản mới cho ứng dụng này. Trong bài này mình sẽ hướng dẫn các bạn dùng cả CLI và UI, để khởi động UI ta chạy câu lệnh sau

kubectl argo rollouts dashboard

Truy cập vào localhost ở port 3100 sau đó truy cập Rollout có tên rollout-canary bạn sẽ thấy giao diện như hình dưới:

image.png

Để cập nhật phiên bản mới bạn thay đổi thông tin trong phần khoanh đỏ thành: nghoangviet/python-api:production Hoặc sử dụng CLI với câu lệnh sau để cập nhật image cho rollout:

kubectl argo rollouts set image rollouts-canary rollouts-canary=nghoangviet/python-api:production

Sau khi thay đổi image ta thấy 1 pod mới được sinh ra nhằm đáp ứng 20% số lượng request, đồng thời ở phiên bản cũ 1 pod bị xóa đi. Quá trình cập nhật sẽ được dừng lại vô thời hạn như dự định.

image.png

Tiếp theo ta sẽ chạy câu lệnh đơn giản để xem có thực sự 20% request được chạy qua phiên bản mới hay chưa. Ở đây mình sẽ dùng bash curl mỗi 0,5s đến ứng dụng

while true; do curl 192.168.49.2:31449; echo ''; sleep 0.5; done

192.168.49.2:31449 là địa chỉ mình truy cập ứng dụng thông qua NodePort, hãy thay đổi lại cho phù hợp với trường hợp của bạn.

image.png

Sau khi chạy thì ta thấy có 1 số lượng nhỏ request trả về mới message "Login Required" tương ứng đã chạy qua phiên bản mới thành công.

Trong thực tế, sau khi đã xem xét và đánh giá các request chạy qua phiên bản mới không có vấn đề gì ta sẽ tiếp tục quá trình triển khai. Để tiếp tục quá trình này ta có thể sử dụng nút Promote trên UI

image.png

Hoặc sử dụng câu lệnh

kubectl argo rollouts promote rollouts-canary

Các step tiếp theo sẽ lần lượt được triển khai và cuối cùng sẽ chỉ còn toàn bộ các pod của version mới. Như vậy ta đã hoàn thành xong quá trình triển khai ứng dụng theo chiến lược canary.

image.png

Kết

Hy vọng bài viết này đã giúp bạn có thêm kiến thức gì đó mới. Nếu thấy bài viết hay thì Follow và Upvote cho mình để đón chờ bài viết triển khai ứng dụng với chiến lược Blue - Green sử dụng ArgoRollout nhé. Cám ơn bạn đã đọc đến đây!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí