- Argo Rollouts คืออะไร
- Kubernetes Deployment ต่างจาก Argo Rollouts อย่างไร
- Canary Deployment
- Blue-Green Deployment
- Argo CD กับ Argo Rollouts
- Workshop: Canary Deployment ด้วย Argo Rollouts
- Workshop ขั้นต่อไป: Metrics-based Deployment
#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 จะสามารถ:
- สร้าง Kubernetes Cluster สำหรับทดลอง
- ติดตั้ง Argo Rollouts
- Deploy Application ด้วย
kind: Rollout - Update image เพื่อเริ่ม Canary
- ตรวจสอบสถานะ Rollout
- 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
#แหล่งศึกษาเพิ่มเติม
- Argo Rollouts Documentation: https://argoproj.github.io/rollouts/
- Argo Rollouts GitHub: https://github.com/argoproj/argo-rollouts
- Argo CD Documentation: https://argo-cd.readthedocs.io/