#Argo Rollouts คืออะไร

Argo Rollouts เป็น Kubernetes Controller และชุด Custom Resource Definitions (CRDs) สำหรับจัดการการปล่อยซอฟต์แวร์แบบ Progressive Delivery โดยเพิ่มความสามารถเหนือ Deployment ปกติ เช่น Canary Deployment, Blue-Green Deployment, การ Pause/Promote/Abort และการวิเคราะห์ Metrics ก่อนเลื่อนรุ่นขึ้น Production

แนวคิดหลักคือ ไม่ส่งเวอร์ชันใหม่ให้ผู้ใช้ทั้งหมดในครั้งเดียว แต่ค่อย ๆ เปิดให้บางส่วนก่อน ตรวจสอบผล แล้วจึงเพิ่มสัดส่วนหรือย้อนกลับไปเวอร์ชันเดิม

Developer -> Git -> CI -> Image Registry -> GitOps/Manifest
                                      |
                                      v
                                 Argo Rollouts
                                      |
                         +------------+------------+
                         |                         |
                    Stable v1                 Canary v2
                         |                         |
                         +---------- Service ------+
                                      |
                                   Users

#Kubernetes Deployment ต่างจาก Argo Rollouts อย่างไร

Deployment เหมาะกับ Rolling Update ทั่วไป เช่นค่อย ๆ แทน Pod ของ v1 ด้วย v2 แต่ Argo Rollouts เพิ่มกลยุทธ์ Progressive Delivery ที่ควบคุมขั้นตอนการปล่อยได้ละเอียดกว่า

ความสามารถ Deployment Argo Rollouts


Rolling Update รองรับ รองรับแนวคิดการอัปเดตผ่าน Rollout Canary steps จำกัด รองรับ Blue-Green ต้องออกแบบเพิ่ม รองรับโดยตรง Pause / Promote จำกัด รองรับ Automated Analysis ไม่มีใน Deployment โดยตรง รองรับผ่าน AnalysisRun Metric-based abort ต้องสร้างระบบเพิ่ม รองรับ Traffic Routing ต้องใช้ส่วนประกอบเพิ่ม เชื่อมต่อ traffic provider ได้

#Canary Deployment

สมมติ Production ใช้ my-app:v1 และต้องการปล่อย my-app:v2 เราอาจกำหนดขั้นตอนดังนี้

v2 = 20% -> Pause -> v2 = 50% -> Pause -> v2 = 100%

ตัวอย่าง Rollout:

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: demo-app
spec:
  replicas: 5
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: demo-app
  template:
    metadata:
      labels:
        app: demo-app
    spec:
      containers:
        - name: demo-app
          image: nginx:1.27
          ports:
            - containerPort: 80
  strategy:
    canary:
      steps:
        - setWeight: 20
        - pause:
            duration: 30s
        - setWeight: 50
        - pause:
            duration: 30s
        - setWeight: 100

หมายเหตุ: หากยังไม่ได้กำหนด Traffic Router เช่น Istio/NGINX/ALB การแบ่ง weight จะถูกประมาณจากจำนวน Replica ไม่ใช่การแบ่ง HTTP requests แบบแม่นยำ

#Blue-Green Deployment

Blue-Green จะมี Stable และ Preview แยกกัน เมื่อ Preview ผ่านการตรวจสอบจึงสลับ Active Service ไปยังรุ่นใหม่

Users -> Active Service -> Blue v1

QA ----> Preview Service -> Green v2

หลังอนุมัติ:
Users -> Active Service -> Green v2

ตัวอย่าง strategy:

strategy:
  blueGreen:
    activeService: demo-active
    previewService: demo-preview
    autoPromotionEnabled: false

#Argo CD กับ Argo Rollouts

Argo CD และ Argo Rollouts ทำหน้าที่ต่างกันและสามารถใช้ร่วมกันได้

  • Argo CD: ทำ GitOps และ synchronize desired state จาก Git ไป Kubernetes
  • Argo Rollouts: ควบคุมว่าจะปล่อยเวอร์ชันใหม่อย่างไร เช่น Canary หรือ Blue-Green
Git Repository
     |
     v
  Argo CD
     |
     v
Rollout Resource
     |
     v
Argo Rollouts Controller
     |
 +---+---+
 |       |
v1      v2
Stable  Canary

#Workshop: Canary Deployment ด้วย Argo Rollouts

#เป้าหมาย

หลังจบ Workshop จะสามารถ:

  1. สร้าง Kubernetes Cluster สำหรับทดลอง
  2. ติดตั้ง Argo Rollouts
  3. Deploy Application ด้วย kind: Rollout
  4. Update image เพื่อเริ่ม Canary
  5. ตรวจสอบสถานะ Rollout
  6. Pause, Promote และ Abort การ Deploy

#สิ่งที่ต้องมี

  • Docker
  • kubectl
  • Minikube
  • เครื่องที่สามารถรัน Kubernetes local cluster ได้

ตรวจสอบ:

docker --version
kubectl version --client
minikube version

#Step 1: สร้าง Cluster

minikube start
kubectl get nodes

#Step 2: ติดตั้ง Argo Rollouts

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

ตรวจสอบ:

kubectl get pods -n argo-rollouts

ควรเห็น Controller อยู่ในสถานะ Running.

#Step 3: ติดตั้ง kubectl plugin

ติดตั้ง kubectl-argo-rollouts ตามระบบปฏิบัติการจากเอกสาร Argo Rollouts แล้วตรวจสอบ:

kubectl argo rollouts version

#Step 4: สร้าง Namespace

kubectl create namespace rollout-demo

#Step 5: สร้าง Service

สร้าง service.yaml

apiVersion: v1
kind: Service
metadata:
  name: demo-app
spec:
  selector:
    app: demo-app
  ports:
    - port: 80
      targetPort: 80

Apply:

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

#Step 6: สร้าง Rollout

สร้าง rollout.yaml

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: demo-app
spec:
  replicas: 5
  selector:
    matchLabels:
      app: demo-app
  template:
    metadata:
      labels:
        app: demo-app
    spec:
      containers:
        - name: demo-app
          image: nginx:1.27
          ports:
            - containerPort: 80
  strategy:
    canary:
      steps:
        - setWeight: 20
        - pause: {}
        - setWeight: 50
        - pause:
            duration: 30s
        - setWeight: 100

Deploy:

kubectl apply -f rollout.yaml -n rollout-demo

#Step 7: ดูสถานะ

kubectl argo rollouts get rollout demo-app   -n rollout-demo --watch

ตรวจสอบ Pod:

kubectl get pods -n rollout-demo

#Step 8: เปิด Application

minikube service demo-app -n rollout-demo

หรือดู URL:

minikube service demo-app -n rollout-demo --url

#Step 9: จำลองการออก Version ใหม่

เปลี่ยน image จาก:

image: nginx:1.27

เป็น:

image: nginx:1.28

หรือสั่งโดยตรง:

kubectl argo rollouts set image demo-app   demo-app=nginx:1.28   -n rollout-demo

จากนั้นดูสถานะ:

kubectl argo rollouts get rollout demo-app   -n rollout-demo --watch

Rollout จะหยุดที่ขั้นตอน pause: {} หลังเข้าสู่ Canary ระยะแรก

#Step 10: Promote

หลังตรวจสอบ Canary แล้ว:

kubectl argo rollouts promote demo-app   -n rollout-demo

ระบบจะเดินต่อไปยัง 50% และหลัง pause แบบมีเวลาจะไป 100% ตามลำดับ

หากต้องการข้าม steps ที่เหลือ:

kubectl argo rollouts promote demo-app   -n rollout-demo --full

#Step 11: ทดลอง Abort

เริ่ม revision ใหม่ก่อน เช่น:

kubectl argo rollouts set image demo-app   demo-app=nginx:alpine   -n rollout-demo

จากนั้น Abort:

kubectl argo rollouts abort demo-app   -n rollout-demo

ตรวจสอบ:

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

#Step 12: Undo

ดู revision history:

kubectl argo rollouts history demo-app   -n rollout-demo

ย้อนกลับ revision ก่อนหน้า:

kubectl argo rollouts undo demo-app   -n rollout-demo

#Workshop ขั้นต่อไป: Metrics-based Deployment

ใน Production เราสามารถต่อ Argo Rollouts กับ Prometheus แล้วกำหนด AnalysisTemplate เพื่อวัด เช่น Success Rate, HTTP 5xx และ P95 Latency

Deploy v2
   |
   v
Canary 10%
   |
   v
Prometheus Metrics
   |
 +----------------+
 |                |
Healthy         Failed
 |                |
 v                v
30%             Abort
 |
 v
50%
 |
 v
100%

ตัวอย่างโครงสร้าง:

apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: success-rate
spec:
  metrics:
    - name: success-rate
      interval: 30s
      successCondition: result[0] >= 0.99
      provider:
        prometheus:
          address: http://prometheus.monitoring:9090
          query: |
            sum(rate(http_requests_total{status!~"5.."}[5m]))
            /
            sum(rate(http_requests_total[5m]))

จากนั้นอ้าง Analysis ใน Canary steps เพื่อให้การตัดสินใจ promotion/abort ใช้ telemetry แทนการพิจารณาด้วยคนเพียงอย่างเดียว

#Architecture ที่แนะนำสำหรับ Production

Developer
   |
   v
GitHub
   |
   v
CI Pipeline
Test -> Build -> Push Image
                 |
                 v
             Registry
                 |
                 v
          GitOps Repository
                 |
                 v
              Argo CD
                 |
                 v
           Argo Rollouts
                 |
       +---------+---------+
       |                   |
    Stable               Canary
       |                   |
       +---------+---------+
                 |
                 v
             Prometheus
                 |
                 v
            AnalysisRun
                 |
          +------+------+
          |             |
       Success        Failure
          |             |
       Promote       Abort/
       to 100%       Rollback

#สรุป

Argo Rollouts เหมาะกับระบบ Kubernetes ที่ต้องการลดความเสี่ยงในการ Release โดยเฉพาะระบบ Production ที่ต้องการ Canary, Blue-Green, manual approval หรือ automated metric analysis เมื่อใช้งานร่วมกับ Argo CD และ Prometheus จะได้ workflow ตั้งแต่ GitOps ไปจนถึง Progressive Delivery และ Automated Rollback

สำหรับการเรียนรู้ แนะนำลำดับ Minikube + Canary -> Manual Promote/Abort -> Blue-Green -> Prometheus Analysis -> Argo CD + GitOps -> Traffic Router เพื่อเห็นกลไกแต่ละส่วนอย่างชัดเจนก่อนนำไป Production

#แหล่งศึกษาเพิ่มเติม