Argo Rollouts adalah controller Kubernetes dan serangkaian CustomResourceDefinitions (CRDs) untuk pengiriman progresif. Integrasi Service Mesh (ASM) dengan Argo Rollouts memungkinkan rilis canary yang secara bertahap mengalihkan lalu lintas dari versi stabil ke versi baru berdasarkan persentase bobot yang dapat dikonfigurasi.
Dengan pembaruan rolling native Kubernetes, rasio lalu lintas terikat pada jumlah replika—mengarahkan 1% lalu lintas ke canary memerlukan 99 replika stabil. Rilis canary berbasis ASM memisahkan pembagian lalu lintas dari jumlah Pod dengan menggunakan aturan Istio VirtualService. Dengan demikian, autoscaling tidak mengganggu rasio lalu lintas, dan persentase detail halus tetap berfungsi terlepas dari jumlah replika yang sedang berjalan.
Cara kerja
Rilis canary dengan ASM dan Argo Rollouts mengikuti siklus hidup berikut:
Terapkan resource Rollout yang menentukan strategi canary: langkah-langkah bobot lalu lintas, durasi jeda, dan referensi ke Istio VirtualService.
Buat dua layanan Kubernetes—satu untuk versi stabil dan satu untuk canary—serta sebuah Istio VirtualService yang mengarahkan lalu lintas di antara keduanya.
Saat Anda memperbarui gambar Rollout, controller Argo Rollouts secara otomatis menyesuaikan bobot VirtualService sesuai langkah-langkah yang ditentukan.
Pada setiap langkah, controller menjeda selama durasi yang ditentukan (atau menunggu persetujuan manual) sebelum meningkatkan bobot canary.
Setelah semua langkah selesai, versi canary menjadi versi stabil baru.
Secara opsional, sambungkan AnalysisTemplate berbasis Prometheus untuk memantau tingkat keberhasilan versi canary. Jika tingkat tersebut turun di bawah ambang batas, controller secara otomatis melakukan rollback ke versi stabil.
Panduan ini menunjukkan pemisahan lalu lintas tingkat host, di mana dua layanan terpisah (istio-rollout-stabledanistio-rollout-canary) menangani distribusi lalu lintas. Istio juga mendukung pemisahan lalu lintas tingkat subset menggunakan DestinationRule, yang lebih cocok untuk lalu lintas timur-barat (intra-cluster) karena menghindari komplikasi DNS. Untuk detailnya, lihat Argo Rollouts Istio traffic management.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans ASM versi 1.12.4.50 atau yang lebih baru. Untuk informasi selengkapnya, lihat Buat instans ASM.
Kluster yang ditambahkan ke instans ASM. Untuk informasi selengkapnya, lihat Tambahkan kluster ke instans ASM.
kubectl yang terhubung ke instans ASM. Untuk informasi selengkapnya, lihat Gunakan kubectl pada lapisan kontrol untuk mengakses resource Istio.
Instal Argo Rollouts
Untuk detail instalasi lengkap, lihat Argo Rollouts installation.
Instal controller Argo Rollouts:
kubectl create namespace argo-rollouts kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yamlInstal plugin kubectl Argo Rollouts untuk manajemen berbasis CLI:
brew install argoproj/tap/kubectl-argo-rollouts
Aktifkan akses KubeAPI pada data-plane
Aktifkan akses KubeAPI untuk mengelola resource Istio (VirtualServices, Gateways, DestinationRules) langsung dari kluster data-plane menggunakan kubectl.
Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi sebelah kiri, pilih ASM Instance > Base Information.
Klik Enable di sebelah kanan Enable Data-plane KubeAPI access.

Pada kotak dialog konfirmasi, klik OK.
Terapkan rilis canary
Bagian ini memandu Anda melalui rilis canary lengkap: menerapkan versi stabil (biru), lalu secara progresif mengalihkan lalu lintas ke versi canary (kuning).
Langkah 1: Buat Rollout dan Layanan
Buat Rollout
Buat file
rollout.yamldengan konten berikut:Bidang utama di bawah
strategy.canary:Field Description setWeightPersentase traffic yang diarahkan ke versi canary pada langkah ini pause: {}Jeda tanpa batas hingga Anda menjalankan kubectl argo rollouts promotepause: {duration: 20s}Jeda selama 20 detik, lalu lanjut otomatis ke langkah berikutnya Terapkan Rollout ke kluster yang ditambahkan ke instans ASM Anda:
kubectl apply -f rollout.yaml
Buat Layanan
Buat file
service.yamldengan konten berikut:Kedua layanan menggunakan selector yang sama (
app: istio-rollout). Argo Rollouts mengelola Pod mana yang ditargetkan oleh setiap layanan selama rilis canary.apiVersion: v1 kind: Service metadata: name: istio-rollout-canary # Layanan Canary -- Argo Rollouts memetakan ini ke Pod canary spec: ports: - port: 80 targetPort: http protocol: TCP name: http selector: app: istio-rollout --- apiVersion: v1 kind: Service metadata: name: istio-rollout-stable # Layanan Stabil -- Argo Rollouts memetakan ini ke Pod stabil spec: ports: - port: 80 targetPort: http protocol: TCP name: http selector: app: istio-rolloutTerapkan layanan:
kubectl apply -f service.yaml
Langkah 2: Buat resource Istio
Dengan akses KubeAPI data-plane diaktifkan, gunakan kubectl dari kluster data-plane untuk membuat resource Istio secara langsung. Atau, gunakan Konsol ASM atau kubeconfig lapisan kontrol.
Buat VirtualService
Buat file
istio-rollout-vsvc.yamldengan konten berikut:apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: istio-rollout-vsvc spec: gateways: - istio-rollout-gateway hosts: - '*' http: - match: - uri: prefix: / name: primary # Harus sesuai dengan nama entri rute di Rollout route: - destination: host: istio-rollout-stable # Semua traffic awalnya diarahkan ke stabil weight: 100 - destination: host: istio-rollout-canary # Tujuan canary -- bobot awal 0Terapkan VirtualService:
kubectl apply -f istio-rollout-vsvc.yaml
Buat Gateway
Buat file
istio-rollout-gateway.yamldengan konten berikut:apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: istio-rollout-gateway spec: selector: istio: ingressgateway # Terikat ke gerbang masuk ASM servers: - hosts: - '*' port: name: http number: 80 # Terima traffic HTTP pada Port 80 protocol: HTTPTerapkan Gateway:
kubectl apply -f istio-rollout-gateway.yaml
Langkah 3: Terapkan gerbang masuk
Buat gerbang masuk ASM dengan Port 80 diaktifkan untuk akses layanan.
Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi sebelah kiri, pilih ASM Gateways > Ingress Gateway.
Pada halaman Ingress Gateway, klik Create dan konfigurasikan parameter berikut: Untuk parameter lainnya, lihat Buat gerbang masuk.
Parameter Value Name ingressgatewayGateway types North-South IngressGateway Port Mapping Protocol: HTTP, Service Port: 80 Klik Create.
Langkah 4: Verifikasi status Rollout awal
Jalankan perintah berikut untuk memverifikasi bahwa Rollout dalam kondisi sehat:
kubectl argo rollouts get rollout istio-rollout --watchOutput yang diharapkan:
Name: istio-rollout
Namespace: default
Status: Healthy
Strategy: Canary
Step: 18/18
SetWeight: 100
ActualWeight: 100
Images: argoproj/rollouts-demo:blue (stable)
Replicas:
Desired: 1
Current: 1
Updated: 1
Ready: 1
Available: 1
NAME KIND STATUS AGE INFO
⟳ istio-rollout Rollout Healthy 52s
└──# revision:1
└──⧉ istio-rollout-7f96d86486 ReplicaSet Healthy 52s stable
└──□ istio-rollout-7f96d86486-vpqvb Pod Running 52s ready:2/2Status Healthy dengan gambar argoproj/rollouts-demo:blue (stable) mengonfirmasi bahwa penerapan awal berhasil.
Langkah 5: Uji penerapan awal
Dapatkan alamat IP gerbang masuk:
Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.
Klik nama instans ASM. Di panel navigasi sebelah kiri, pilih ASM Gateways > Ingress Gateway.
Salin Service address gerbang masuk.
Buka
http://<ingress-gateway-ip>/di browser. Halaman tersebut melakukan panggilan konkuren ke/colordan mengisi grid dengan warna yang dikembalikan. Karena versi stabil menggunakan gambarbluedan tidak ada canary yang berjalan, semua grid menampilkan warna biru.
Langkah 6: Lakukan rilis canary
Pada contoh ini, kuning merepresentasikan versi canary. Saat rilis berlangsung, grid secara bertahap berubah dari biru ke kuning.
Perbarui gambar Rollout
Tetapkan versi gambar baru:
kubectl argo rollouts set image istio-rollout "*=argoproj/istio-rollout:yellow"Verifikasi bahwa kedua versi Pod sedang berjalan:
Masuk ke Konsol ACK dan klik Clusters di panel navigasi sebelah kiri.
Klik nama kluster, lalu pilih Workloads > Pods.
Di kolom Name, pastikan Pod untuk versi biru (stabil) dan kuning (canary) ada.

Amati pergeseran traffic pertama
Buka http://<ingress-gateway-ip>/ di browser. Sekitar 10% grid kini menampilkan warna kuning. Controller Argo Rollouts telah memperbarui bobot VirtualService: stabil (biru) turun dari 100 ke 90, dan canary (kuning) naik dari 0 ke 10.

Langkah pertama menentukan pause: {} tanpa durasi, sehingga Rollout menunggu persetujuan manual sebelum melanjutkan.
Lanjutkan rilis
Setujui Rollout untuk melanjutkan melewati jeda manual:
kubectl argo rollouts promote istio-rolloutBuka
http://<ingress-gateway-ip>/di browser. Bobot VirtualService terus menyesuaikan secara otomatis melalui langkah-langkah tersisa (20%, 30%, ... 90%), menjeda selama 20 detik di antara setiap langkah.
Verifikasi rilis yang telah selesai
Setelah semua langkah selesai, buka
http://<ingress-gateway-ip>/di browser. Semua grid kini menampilkan warna kuning, mengonfirmasi bahwa versi canary telah sepenuhnya menggantikan versi stabil.
Verifikasi status Rollout: Output yang diharapkan: Gambar kini menampilkan
argoproj/rollouts-demo:yellow (stable), mengonfirmasi bahwa versi canary telah dipromosikan.kubectl argo rollouts get rollout istio-rollout --watchName: istio-rollout Namespace: default Status: Healthy Strategy: Canary Step: 18/18 SetWeight: 100 ActualWeight: 100 Images: argoproj/rollouts-demo:yellow (stable) Replicas: Desired: 1 Current: 1 Updated: 1 Ready: 1 Available: 1 NAME KIND STATUS AGE INFO ⟳ istio-rollout Rollout Healthy 48m ├──# revision:4 │ └──⧉ istio-rollout-5fcf5864c4 ReplicaSet Healthy 27m stable │ └──□ istio-rollout-5fcf5864c4-vw6kh Pod Running 26m ready:2/2 ├──# revision:3 │ └──⧉ istio-rollout-897cb5b6d ReplicaSet ScaledDown 27m └──# revision:1 └──⧉ istio-rollout-7f96d86486 ReplicaSet ScaledDown 48m
Konfigurasi rollback otomatis dengan Prometheus
Alih-alih mengandalkan pengamatan manual, konfigurasikan analisis berbasis Prometheus untuk secara otomatis melakukan rollback rilis canary ketika tingkat keberhasilan turun di bawah ambang batas.
Untuk melakukan rollback manual kapan saja selama rilis canary, jalankan:
kubectl argo rollouts abort istio-rolloutLangkah 1: Aktifkan Prometheus di ASM
Aktifkan pemantauan Prometheus untuk instans ASM. Untuk informasi selengkapnya, lihat:
Langkah 2: Buat AnalysisTemplate
AnalysisTemplate menentukan kueri Prometheus yang menghitung tingkat keberhasilan permintaan untuk versi canary. Jika tingkat keberhasilan turun ke 0,90 atau di bawahnya (artinya lebih dari 10% permintaan mengembalikan error 5xx), Rollout ditandai sebagai Degraded dan secara otomatis dilakukan rollback.
Buat file
istio-success-rate.yamldengan konten berikut: Ganti<your-prometheus-endpoint>dengan endpoint aktual instans Prometheus yang terhubung ke ASM.apiVersion: argoproj.io/v1alpha1 kind: AnalysisTemplate metadata: name: istio-success-rate spec: args: - name: service # Nama layanan, diteruskan dari Rollout - name: namespace # Namespace, diselesaikan otomatis dari Rollout metrics: - name: success-rate initialDelay: 60s # Tunggu 60 detik agar traffic mengalir sebelum pemeriksaan pertama interval: 20s # Evaluasi ulang setiap 20 detik successCondition: result[0] > 0.90 # Lolos jika tingkat keberhasilan > 90%; gagal jika tidak provider: prometheus: address: http://<your-prometheus-endpoint>:9090/api/v1/prometheus/ query: >+ sum(irate(istio_requests_total{ reporter="source", destination_service=~"{{args.service}}.{{args.namespace}}.svc.cluster.local", response_code!~"5.*"}[40s]) ) / sum(irate(istio_requests_total{ reporter="source", destination_service=~"{{args.service}}.{{args.namespace}}.svc.cluster.local"}[40s]) )Terapkan AnalysisTemplate:
kubectl apply -f istio-success-rate.yaml
Langkah 3: Hubungkan AnalysisTemplate ke Rollout
Perbarui Rollout untuk menyertakan bagian analysis yang mereferensikan AnalysisTemplate. Analisis dimulai dari langkah kedua (startingStep: 1), memberi waktu bagi versi canary untuk menerima lalu lintas sebelum metrik dievaluasi.
Buat file
rollout.yamlbaru dengan konten berikut:Perbarui Rollout:
kubectl apply -f rollout.yaml
Langkah 4: Picu rilis canary dengan analisis
Perbarui gambar untuk memulai rilis canary baru: Buka
http://<ingress-gateway-ip>/di browser. Grid oranye mulai muncul seiring lalu lintas canary mengalir.kubectl argo rollouts set image istio-rollout "*=argoproj/rollouts-demo:orange"
Setujui Rollout untuk memulai progresi canary otomatis dengan pemantauan Prometheus:
kubectl argo rollouts promote istio-rolloutPantau status Rollout:
kubectl argo rollouts get rollout istio-rollout --watch
Langkah 5: Uji rollback otomatis
Untuk menguji perilaku rollback, tingkatkan laju error untuk versi canary menggunakan slider laju error di halaman aplikasi demo. Saat laju error melebihi 10% (tingkat keberhasilan turun di bawah 0,90), AnalysisTemplate menandai Rollout sebagai Degraded, dan controller secara otomatis melakukan rollback ke versi stabil (kuning).

Setelah jeda singkat, semua lalu lintas kembali ke versi stabil:

Langkah selanjutnya
Konfigurasikan rilis canary — Pelajari konsep rilis canary dan opsi konfigurasi tambahan.
Argo Rollouts Istio traffic management — Jelajahi opsi lanjutan termasuk pemisahan lalu lintas tingkat subset dan pengaturan multicluster.