Progressive Delivery dengan Argo Rollouts: Canary & Blue-Green

Foto oleh Charles J. Sharp via Wikimedia Commons (CC BY-SA 4.0)
Deployment hanya menawarkan rolling update yang dijaga readiness probe, yang memastikan proses hidup tetapi bukan bahwa ia melayani respons benar. Rollout adalah pengganti CRD drop-in yang spec-nya nyaris identik tetapi menambahkan blok strategy untuk canary atau blue-green plus analisis berbasis metrik. Itu membuat Anda bisa menggerbang promosi pada SLO nyata, bukan sekadar liveness.
Anda melampirkan AnalysisTemplate yang menanyakan provider seperti Prometheus pada interval tertentu dan mengevaluasi successCondition. Tiap sampel gagal dihitung terhadap failureLimit; begitu batas itu terlewati, AnalysisRun gagal, Rollouts menandai rollout Degraded, membatalkan progresi, dan mengecilkan bobot canary ke nol. Trafik kembali ke ReplicaSet stabil terakhir nyaris seketika tanpa langkah pipeline.
Pakai canary untuk service HTTP stateless yang bisa mentoleransi dua versi melayani sekaligus dan menginginkan dampak kecil dengan biaya pod rendah. Pakai blue-green saat versi bersamaan akan merusak sesuatu — misalnya perubahan skema yang tidak backward compatible — dan Anda sanggup menjalankan stack kedua penuh selama cutover. Keduanya memakai mekanisme AnalysisTemplate yang sama.
Tidak secara ketat. Dengan objek Service biasa, Rollouts mendekati bobot trafik lewat jumlah pod, jadi langkah 20 persen butuh minimal lima pod agar bermakna. Untuk pembobotan presisi di level request, Anda sebaiknya mengintegrasikan ingress controller atau service mesh seperti NGINX, Istio, atau Kubernetes Gateway API.
Tidak. Abort me-rollback cluster dengan menggeser trafik ke ReplicaSet stabil sebelumnya, tetapi tag image yang di-commit di Git masih yang buruk. Dengan Argo CD, sync berikutnya bisa memicu ulang rollout gagal yang sama dalam loop, jadi Anda harus memperbaiki atau me-revert tag di Git setelah abort otomatis.

Foto oleh Charles J. Sharp via Wikimedia Commons (CC BY-SA 4.0)
Ringkasan Utama
Argo Rollouts mengganti objek Deployment Kubernetes dengan CRD Rollout yang merilis versi baru secara bertahap. Canary menggeser trafik dalam langkah berbobot; blue-green mengalihkan seluruh trafik sekaligus setelah preview. AnalysisTemplate menanyakan Prometheus di tengah rollout, dan saat SLO seperti error rate atau latensi melewati ambang, rollout dibatalkan dan dikembalikan otomatis.
Deployment Kubernetes biasa hanya memberi satu tuas keamanan: rolling update. Ia menukar pod beberapa sekaligus dan mengawasi readiness probe — tetapi readiness probe hanya memberi tahu bahwa proses hidup, bukan bahwa ia melayani respons yang benar dengan latensi wajar. Saya pernah merilis build yang lolos semua probe tetapi tetap menggandakan p95 pada jalur checkout. Pod-nya sehat; penggunanya tidak.
Progressive delivery menutup celah itu. Alih-alih memercayai sebuah probe, Anda mengekspos versi baru ke sepotong trafik nyata, mengukur apa yang benar-benar dilakukannya lewat metrik nyata, dan hanya memperluas dampak jika angkanya bertahan. Argo Rollouts adalah tool CNCF yang saya andalkan untuk ini di Kubernetes. Proyek Argo lulus (graduated) di CNCF pada Desember 2022, dan Rollouts kini di lini 1.8 — cukup matang untuk dijalankan di produksi tanpa kejutan.
Anda tidak menambahkan Argo Rollouts di samping Deployment — Anda mengonversi Deployment menjadi Rollout. Spec-nya hampir identik: template pod sama, selector sama, jumlah replika sama. Bedanya ada di blok strategy, tempat Anda mendeklarasikan canary atau blueGreen alih-alih rolling update bawaan. Semua hal lain yang sudah dipahami tim tentang spec pod tetap sama, dan itulah yang membuat migrasi murah.
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: checkout-api
spec:
replicas: 6
selector:
matchLabels:
app: checkout-api
template:
metadata:
labels:
app: checkout-api
spec:
containers:
- name: checkout-api
image: registry.example.com/checkout-api:1.4.2
ports:
- containerPort: 8080
strategy:
canary:
steps:
- setWeight: 20
- pause: { duration: 2m }
- setWeight: 50
- pause: { duration: 5m }
- setWeight: 80
- pause: { duration: 5m }Canary adalah pilihan default saya untuk service HTTP stateless. Array steps dibaca dari atas ke bawah: kirim 20 persen trafik ke versi baru, tahan dua menit, lalu 50, lalu 80, lalu Rollouts mempromosikan canary ke 100 secara otomatis begitu langkah terakhir lolos. Pause tanpa duration berhenti tanpa batas sampai Anda promosikan manual — berguna untuk rilis produksi pertama saat Anda ingin manusia menatap dashboard sebelum memperluas.
Langkah berbobot hanya merutekan trafik akurat jika ada yang benar-benar bisa membaginya. Dengan objek Service biasa, pembagian didekati lewat jumlah pod, jadi 20 persen butuh minimal lima pod agar bermakna. Untuk bobot presisi, hubungkan Rollouts ke ingress controller atau service mesh (NGINX, Istio, atau Kubernetes Gateway API) yang melakukan pembobotan sungguhan di level request.
Blue-green cocok untuk rilis yang tidak boleh punya dua versi melayani sekaligus — perubahan skema yang tidak backward compatible, atau service yang respons campurannya bisa merusak alur kerja. Rollouts menyalakan seluruh stack green secara paralel, mengeksposnya di Service preview terpisah agar bisa Anda smoke-test, dan baru mengalihkan Service aktif saat Anda (atau sebuah analisis) menyetujui. Komprominya adalah biaya: Anda menjalankan pod dua kali lipat selama cutover, jadi lebih berat dari canary.
strategy:
blueGreen:
activeService: checkout-api-active
previewService: checkout-api-preview
autoPromotionEnabled: false
prePromotionAnalysis:
templates:
- templateName: success-rate
scaleDownDelaySeconds: 30Inti dari progressive delivery adalah menyingkirkan manusia dari jalur normal. AnalysisTemplate adalah objek yang dapat dipakai ulang, menanyakan provider metrik pada interval tertentu dan mengevaluasi sebuah kondisi. Rujuk ia dari langkah canary atau prePromotionAnalysis blue-green, dan Rollouts menjalankannya sebagai AnalysisRun yang terikat ke rollout tersebut. Field kuncinya adalah interval (seberapa sering sampel), count (berapa sampel), successCondition (ekspresi yang harus terpenuhi), dan failureLimit (berapa sampel gagal yang ditoleransi sebelum seluruh analisis dinyatakan gagal).
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: success-rate
spec:
args:
- name: service-name
metrics:
- name: success-rate
interval: 30s
count: 6
successCondition: result[0] >= 0.99
failureLimit: 2
provider:
prometheus:
address: http://prometheus.monitoring.svc:9090
query: |
sum(rate(http_requests_total{
service="{{args.service-name}}", code!~"5.."
}[2m]))
/
sum(rate(http_requests_total{
service="{{args.service-name}}"
}[2m]))Template itu menyampel rasio sukses non-5xx setiap 30 detik, enam kali. successCondition mensyaratkan minimal 99 persen sukses; failureLimit 2 berarti beberapa lonjakan noise dimaafkan, tetapi sampel gagal ketiga membuat analisis gagal. Saya biasanya menjalankannya sebagai background analysis agar dievaluasi terus-menerus di setiap langkah canary, bukan hanya di satu pause — regresi yang muncul di bobot 80 persen tetap harus tertangkap.
Inilah hasilnya. Saat AnalysisRun melewati failureLimit-nya, Rollouts menandai rollout sebagai Degraded, membatalkan progresi, dan mengecilkan bobot canary ke nol — trafik langsung kembali ke versi stabil terakhir tanpa langkah pipeline dan tanpa pager. Karena Rollout melacak ReplicaSet stabil sebelumnya, revert-nya nyaris instan; Anda tidak membangun ulang image atau menjalankan ulang deploy, hanya menggeser bobot kembali ke pod yang sudah berjalan.
Abort tidak mengembalikan state Git Anda. Dalam setup GitOps dengan Argo CD, tag image yang diinginkan di repo masih yang buruk, sehingga sync berikutnya bisa memicu ulang rollout gagal yang sama dalam loop. Setelah abort otomatis, perbaiki atau revert tag di Git sebelum ada yang re-sync — cluster sudah rollback, sumber kebenaran Anda belum.
| Aspek | Canary | Blue-green |
|---|---|---|
| Perpindahan trafik | Bertahap, langkah berbobot | Sekaligus setelah preview |
| Biaya pod ekstra | Rendah — hanya potongan canary | Tinggi — stack kedua penuh |
| Dampak build buruk | Terbatas pada bobot saat ini | Nol pra-alih, penuh pasca-alih |
| Butuh pembagian trafik | Ya untuk bobot presisi | Tidak — satu tukar service |
| Paling cocok | API HTTP stateless | Rilis tak backward compatible |
Dalam praktik saya menjalankan canary untuk mayoritas besar service dan menyimpan blue-green untuk segelintir yang dua versi bersamaannya benar-benar merusak sesuatu. Kedua strategi memakai mekanisme AnalysisTemplate yang sama persis, jadi investasi pada query Prometheus yang baik terbayar apa pun pilihan sebuah service. Mulai dengan satu service non-kritis, pasang satu analisis success-rate, dan buktikan abort otomatis bekerja dengan sengaja merilis sesuatu yang buruk di staging.