Skip to main content
BlogDevOps

Progressive Delivery dengan Argo Rollouts: Canary & Blue-Green

Cara saya rilis ke Kubernetes dengan Argo Rollouts — strategi canary dan blue-green, analisis berbasis Prometheus, dan rollback otomatis saat SLO terlanggar.

Matthews Wong

Software Engineer

Juli 20269 menit baca
Progressive Delivery dengan Argo Rollouts: Canary & Blue-Green

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.

Objek Rollout menggantikan Deployment Anda

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: geser trafik dalam langkah berbobot

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: alihkan semua trafik setelah preview

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: 30

AnalysisTemplate: biarkan Prometheus yang memutuskan

Inti 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.

Rollback otomatis saat SLO terlanggar

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.

  • Pantau rollout secara langsung dengan plugin kubectl — ia menampilkan tiap langkah, bobot saat ini, dan putusan AnalysisRun dalam satu tampilan.
  • Pilih SLO yang mencerminkan derita pengguna, bukan noise infrastruktur: rasio sukses, latensi p95/p99, dan kode error bisnis lebih baik daripada CPU mentah.
  • Beri tiap metrik interval yang cukup panjang untuk meredam jitter scrape; scrape Prometheus 30 detik butuh rate window minimal 1–2 menit.
  • Jaga AnalysisTemplate tetap terparameter dengan args agar satu template melayani setiap service ketimbang menyalin-tempel query.

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.

Canary versus blue-green: cara saya memilih

AspekCanaryBlue-green
Perpindahan trafikBertahap, langkah berbobotSekaligus setelah preview
Biaya pod ekstraRendah — hanya potongan canaryTinggi — stack kedua penuh
Dampak build burukTerbatas pada bobot saat iniNol pra-alih, penuh pasca-alih
Butuh pembagian trafikYa untuk bobot presisiTidak — satu tukar service
Paling cocokAPI HTTP statelessRilis 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.

FAQ

Pertanyaan Umum

Jawaban singkat untuk pertanyaan yang paling sering diajukan pembaca tentang topik ini.

Apa perbedaan antara Deployment Kubernetes dan Rollout Argo Rollouts?

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.

Bagaimana Argo Rollouts memutuskan untuk rollback otomatis?

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.

Kapan saya harus memakai canary alih-alih blue-green dengan Argo Rollouts?

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.

Apakah saya butuh service mesh untuk canary deployment Argo Rollouts?

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.

Apakah rollback otomatis juga mengembalikan repositori Git saya dalam setup GitOps?

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.