0

Lab 18 — Progressive Delivery với Argo Rollouts

Mục tiêu của Lab: Thay vì deploy version mới cho 100% người dùng ngay lập tức, chúng ta sẽ triển khai theo kiểu Canary Release: cho một phần nhỏ traffic đi vào version mới → kiểm tra → tăng traffic dần → nếu có lỗi thì rollback.


🎯 1. Mục tiêu

Sau Lab này, bạn sẽ:

  • Hiểu Progressive Delivery và tại sao Rolling Update đôi khi chưa đủ an toàn.
  • Hiểu Canary Release hoạt động như thế nào.
  • Cài đặt và sử dụng Argo Rollouts.
  • Thực hiện rollout theo từng bước 10% → 30% → 60% → 100%.
  • Biết cách pause, promote và abort một rollout.
  • Hiểu cách kết hợp ArgoCD + Argo Rollouts trong production.

🤔 2. Vấn đề thực tế

Giả sử Todo App đang chạy:

Version v1
10 Pods
100% Traffic

Bạn vừa release v2.

Cách đơn giản nhất là:

v1
 │
 │ Deploy v2
 ▼
v2
100% Traffic

Nếu v2 có bug:

100% Users
     │
     ▼
   v2 ❌
     │
     ▼
HTTP 500

Toàn bộ user đều bị ảnh hưởng.

Kubernetes RollingUpdate đã giúp chúng ta an toàn hơn:

v1 v1 v1 v1 v1
 ↓
v2 v1 v1 v1 v1
 ↓
v2 v2 v1 v1 v1
 ↓
v2 v2 v2 v1 v1
 ↓
v2 v2 v2 v2 v2

Nhưng vẫn có một vấn đề:

Kubernetes biết Pod đã Ready, nhưng không thực sự biết version mới có đang trả HTTP 500, latency cao hay gây lỗi business hay không.

Argo Rollouts giải quyết bài toán này bằng cách cho phép kiểm soát quá trình rollout chi tiết hơn. Nó hỗ trợ Canary, Blue-Green, traffic shifting và có thể kết hợp metrics để quyết định promotion/rollback. ([Argo Rollouts][1])


🧠 3. Hiểu nhanh

3.1 Progressive Delivery là gì?

Thay vì:

v1 ───────────────► v2
     0%       100%

ta làm:

v1 ────────────────►
       │
       ├── 10% v2
       │
       ├── 30% v2
       │
       ├── 60% v2
       │
       └── 100% v2

Mỗi bước đều có thể:

Deploy
  ↓
Observe
  ↓
Healthy?
 ┌───────┴───────┐
Yes              No
 │                │
 ▼                ▼
Continue        Abort

Đây chính là Progressive Delivery.


3.2 Canary Release là gì?

Canary nghĩa là:

Cho một lượng nhỏ traffic chạy vào version mới trước.

Ví dụ:

             ┌─── v1 ─── 90%
Users ───────┤
             └─── v2 ─── 10%

Nếu v2 ổn:

v1 → 70%
v2 → 30%

Sau đó:

v1 → 40%
v2 → 60%

Cuối cùng:

v1 → 0%
v2 → 100%

Argo Rollouts cho phép định nghĩa các bước setWeightpause để điều khiển quá trình này. ([Argo Rollouts][2])


🏗️ 4. Architecture

Trong Lab này, chúng ta sử dụng:

                    Git
                     │
                     ▼
              ┌─────────────┐
              │   ArgoCD    │
              └──────┬──────┘
                     │
                     ▼
              ┌─────────────┐
              │ Argo        │
              │ Rollouts    │
              └──────┬──────┘
                     │
             ┌───────┴────────┐
             │                │
             ▼                ▼
        Stable v1         Canary v2
          90%                10%
             │                │
             └───────┬────────┘
                     │
                     ▼
                   Users

Điểm quan trọng:

ArgoCD và Argo Rollouts có vai trò khác nhau.

ArgoCD
  │
  │ "Cluster phải giống Git"
  ▼
Kubernetes desired state


Argo Rollouts
  │
  │ "Version mới nên được release thế nào?"
  ▼
Progressive Delivery

Argo Rollouts là một Kubernetes controller riêng và không bắt buộc phải có ArgoCD. Tuy nhiên, hai công cụ kết hợp rất tốt trong GitOps. ([Argo Rollouts][3])


🛠️ 5. Chuẩn bị môi trường

Lab này giả sử bạn đã có:

  • Kubernetes Cluster.
  • kubectl.
  • ArgoCD.
  • Todo App hoặc một application đơn giản.
  • kubectl có thể truy cập cluster.

Kiểm tra:

kubectl get nodes

Kiểm tra ArgoCD:

kubectl get pods -n argocd

📦 6. Cài đặt Argo Rollouts

6.1 Tại sao cần cài Argo Rollouts?

ArgoCD có nhiệm vụ:

Git → Kubernetes

Nhưng ArgoCD không phải công cụ chuyên xử lý:

10% → 30% → 60% → 100%

Argo Rollouts đảm nhận phần này.

Cài controller:

kubectl create namespace argo-rollouts
kubectl apply \
  -n argo-rollouts \
  -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/manifests/install.yaml

Kiểm tra:

kubectl get pods -n argo-rollouts

Kết quả mong đợi:

NAME                            READY   STATUS
argo-rollouts-xxxxx             1/1     Running

🔧 7. Cài Argo Rollouts CLI

CLI giúp chúng ta quan sát rollout dễ hơn.

Ví dụ:

kubectl argo rollouts get rollout todo-app

Bạn có thể kiểm tra CLI:

kubectl argo rollouts version

Nếu command chưa tồn tại, hãy cài plugin kubectl-argo-rollouts theo hướng dẫn chính thức của Argo Rollouts.

Argo Rollouts Documentation


🧪 8. Tạo Application

Để tập trung vào Progressive Delivery, chúng ta dùng một app đơn giản.

Tạo namespace:

kubectl create namespace progressive-demo

8.1 Version v1

Tạo file:

rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: demo-app
  namespace: progressive-demo

spec:
  replicas: 5

  selector:
    matchLabels:
      app: demo-app

  template:
    metadata:
      labels:
        app: demo-app

    spec:
      containers:
        - name: demo-app
          image: argoproj/rollouts-demo:blue

          ports:
            - containerPort: 8080

  strategy:
    canary:
      steps:
        - setWeight: 10
        - pause: {}

        - setWeight: 30
        - pause: {}

        - setWeight: 60
        - pause: {}

        - setWeight: 100

Tạo Service:

apiVersion: v1
kind: Service
metadata:
  name: demo-app
  namespace: progressive-demo

spec:
  selector:
    app: demo-app

  ports:
    - port: 80
      targetPort: 8080

Apply:

kubectl apply -f rollout.yaml
kubectl apply -f service.yaml

👀 9. Kiểm tra Rollout

Chạy:

kubectl argo rollouts get rollout demo-app \
  -n progressive-demo

Bạn sẽ thấy đại loại:

Name:            demo-app
Namespace:       progressive-demo

Status:          Healthy
Strategy:        Canary

Replicas:
  Desired:       5
  Current:       5
  Updated:       5
  Ready:         5

Version đầu tiên được deploy bình thường.


🚀 10. Deploy Version mới

Bây giờ giả sử team release:

v1 → v2

Thay image:

argoproj/rollouts-demo:blue

thành:

argoproj/rollouts-demo:yellow

Thực hiện:

kubectl argo rollouts set image \
  demo-app \
  demo-app=argoproj/rollouts-demo:yellow \
  -n progressive-demo

Theo dõi:

kubectl argo rollouts get rollout demo-app \
  -n progressive-demo \
  -w

🔍 11. Observe Result

Rollout sẽ đi qua các bước:

Step 1
10% Canary
90% Stable
     │
     ▼
   PAUSE

Sau khi tiếp tục:

Step 2
30% Canary
70% Stable
     │
     ▼
   PAUSE

Tiếp tục:

Step 3
60% Canary
40% Stable
     │
     ▼
   PAUSE

Cuối cùng:

Step 4
100% Canary
0% Stable

Đây là điểm quan trọng nhất của Lab:

Version mới không được đưa lên toàn bộ hệ thống ngay lập tức.


▶️ 12. Promote Rollout

Khi kiểm tra thấy version mới ổn, chúng ta cho rollout tiếp tục.

kubectl argo rollouts promote \
  demo-app \
  -n progressive-demo

Kiểm tra:

kubectl argo rollouts get rollout demo-app \
  -n progressive-demo

Nếu đang ở bước 30%, command này sẽ cho Rollout tiến tới bước tiếp theo.


🛑 13. Thử tình huống Production có lỗi

Đây mới là phần thú vị.

Giả sử:

v1 = Stable
v2 = Canary

Traffic:

v1 → 70%
v2 → 30%

Bạn phát hiện:

v2
 ├── HTTP 500 tăng
 ├── latency tăng
 └── error rate tăng

Không nên tiếp tục rollout.

Abort:

kubectl argo rollouts abort \
  demo-app \
  -n progressive-demo

Kiểm tra:

kubectl argo rollouts get rollout demo-app \
  -n progressive-demo

🧠 14. Điều gì vừa xảy ra?

Hãy nhìn lại:

             Release v2
                  │
                  ▼
             ┌─────────┐
             │   10%   │
             └────┬────┘
                  │
              Observe
                  │
            ┌─────┴─────┐
            │           │
          Good          Bad
            │           │
            ▼           ▼
           30%        Abort
            │           │
            ▼           ▼
           60%       Rollback
            │
            ▼
          100%

Đây chính là tư duy của Progressive Delivery:

Release nhỏ → quan sát → tăng dần → chỉ promote khi đủ an toàn.


🔄 15. Canary không chỉ là "chia Pod"

Đây là điểm người mới rất dễ nhầm.

Có hai khái niệm:

Cách đơn giản

5 Pods

v1: 4 Pods
v2: 1 Pod

Có vẻ giống:

80% v1
20% v2

Nhưng số Pod không đảm bảo chính xác tỷ lệ traffic.

Ví dụ:

v1: 4 Pods
v2: 1 Pod

không đồng nghĩa chắc chắn:

v1 = 80%
v2 = 20%

Traffic còn phụ thuộc vào cách Kubernetes Service, Ingress hoặc traffic router phân phối request.

Khi cần traffic shifting chính xác, Argo Rollouts có thể kết hợp với Ingress hoặc Service Mesh để điều khiển traffic giữa stable và canary. ([Argo Rollouts][4])


🌐 16. Traffic Routing

Production thường có kiến trúc:

                    Users
                      │
                      ▼
                 Load Balancer
                      │
                      ▼
                 Ingress / Mesh
                      │
             ┌────────┴────────┐
             │                 │
           90%               10%
             │                 │
             ▼                 ▼
        Stable v1         Canary v2

Argo Rollouts có thể quản lý traffic routing thông qua các integration như NGINX, Istio, ALB và các traffic-routing plugin/Gateway API providers. ([Argo Rollouts][4])

Khi đó:

setWeight: 10

thực sự có ý nghĩa:

10% traffic → Canary
90% traffic → Stable

thay vì chỉ đơn giản là tạo ra 10% số Pod.


🔗 17. Kết hợp với ArgoCD

Đây là mục tiêu quan trọng nhất của Phase GitOps.

Thay vì:

kubectl argo rollouts set image ...

trong production, chúng ta đưa manifest vào Git.

Ví dụ:

gitops-repo/
│
├── apps/
│   └── todo/
│       ├── rollout.yaml
│       └── service.yaml
│
└── argocd/
    └── todo-app.yaml

ArgoCD:

Git
 │
 │ Sync
 ▼
ArgoCD
 │
 ▼
Rollout
 │
 ├── 10%
 ├── 30%
 ├── 60%
 └── 100%

Như vậy:

ArgoCD
    │
    │ Desired State
    ▼
Argo Rollouts
    │
    │ Progressive Delivery
    ▼
Kubernetes

ArgoCD quyết định "deploy cái gì".

Argo Rollouts quyết định "deploy version đó như thế nào".


📊 18. Production thực tế

Một hệ thống production tốt hơn sẽ có thêm monitoring:

                 Git
                  │
                  ▼
                ArgoCD
                  │
                  ▼
             Argo Rollouts
                  │
          ┌───────┴────────┐
          │                │
       Stable            Canary
          │                │
          └───────┬────────┘
                  │
                  ▼
             Prometheus
                  │
                  ▼
            Error Rate
            Latency
            Request Rate
                  │
                  ▼
             Rollout
          ┌───────┴───────┐
          │               │
        Healthy          Failed
          │               │
       Promote           Abort

Ví dụ:

10% Canary
   │
   ▼
Error Rate < 1% ?
   │
 ┌─┴─────┐
Yes      No
 │        │
 ▼        ▼
30%      Abort

Đây chính là bước tiến từ:

Manual Canary

sang:

Automated Canary Analysis

Argo Rollouts có thể truy vấn metrics từ các provider để đánh giá rollout và hỗ trợ promotion/rollback tự động. ([Argo Rollouts][1])


⚠️ 19. Những lỗi thường gặp

❌ 1. Nghĩ rằng Canary = chia số Pod

Không chính xác.

Pod ratio ≠ Traffic ratio

Nếu muốn kiểm soát traffic chính xác, cần traffic routing phù hợp. ([Argo Rollouts][4])


❌ 2. Canary nhưng không monitoring

Bạn có thể deploy:

10% v2

nhưng nếu không quan sát:

Error Rate
Latency
HTTP 5xx
CPU
Memory
Business Metrics

thì bạn cũng không biết v2 có thực sự tốt hay không.

Canary không thay thế Monitoring.


❌ 3. Canary quá lâu

Progressive Delivery không có nghĩa:

v2 chạy 2 tuần ở 10%

Argo Rollouts khuyến nghị dùng cho các rollout tương đối ngắn; tài liệu best practices đề cập khoảng 15–20 phút hoặc tối đa 1–2 giờ tùy use case. ([Argo Rollouts][3])


❌ 4. Không có Abort/Rollback Plan

Production cần trả lời được:

"Nếu v2 lỗi thì chúng ta quay lại v1 bằng cách nào?"

Không nên đến lúc production lỗi mới nghĩ câu này.


🧪 20. Exercise

Exercise 1 — Canary cơ bản

Thay đổi:

10% → 30% → 60% → 100%

thành:

5% → 25% → 50% → 100%

Quan sát Rollout.


Exercise 2 — Pause thủ công

Tạo:

steps:
  - setWeight: 10
  - pause: {}

  - setWeight: 50
  - pause: {}

  - setWeight: 100

Sau đó:

kubectl argo rollouts promote demo-app

Quan sát từng bước.


Exercise 3 — Abort

Deploy version mới:

blue → yellow

Khi Rollout đang pause:

kubectl argo rollouts abort demo-app

Kiểm tra:

kubectl argo rollouts get rollout demo-app

Hãy trả lời:

Version nào đang phục vụ user sau khi abort?


Exercise 4 — GitOps

Đưa Rollout manifest vào Git repository.

Sau đó:

Git
 ↓
ArgoCD
 ↓
Argo Rollouts
 ↓
Canary

Mục tiêu là không còn phải deploy manifest bằng tay.


🧠 21. Tổng kết

Trước Lab:

Deploy v2
    ↓
100% Users

Sau Lab:

Deploy v2
    ↓
   10%
    ↓
 Observe
    ↓
   30%
    ↓
 Observe
    ↓
   60%
    ↓
 Observe
    ↓
  100%

Nếu có lỗi:

Canary
  ↓
Detect Problem
  ↓
Abort
  ↓
Stable Version

Hãy nhớ 3 công cụ theo đúng vai trò:

┌───────────────┐
│     Git       │
│ Source of     │
│ Truth         │
└───────┬───────┘
        │
        ▼
┌───────────────┐
│    ArgoCD     │
│ Deploy / Sync │
└───────┬───────┘
        │
        ▼
┌───────────────┐
│ Argo Rollouts │
│ Progressive   │
│ Delivery      │
└───────┬───────┘
        │
        ▼
   Kubernetes

ArgoCD giúp bạn deploy đúng thứ đang có trong Git. Argo Rollouts giúp bạn release version mới một cách an toàn.

Đó là nền tảng để xây dựng một hệ thống GitOps Production thực tế.


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í