All Products
Search
Document Center

Alibaba Cloud Service Mesh:Integrasikan ASM dengan Argo Rollouts untuk menerapkan rilis canary

Last Updated:Mar 11, 2026

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:

  1. Terapkan resource Rollout yang menentukan strategi canary: langkah-langkah bobot lalu lintas, durasi jeda, dan referensi ke Istio VirtualService.

  2. Buat dua layanan Kubernetes—satu untuk versi stabil dan satu untuk canary—serta sebuah Istio VirtualService yang mengarahkan lalu lintas di antara keduanya.

  3. Saat Anda memperbarui gambar Rollout, controller Argo Rollouts secara otomatis menyesuaikan bobot VirtualService sesuai langkah-langkah yang ditentukan.

  4. Pada setiap langkah, controller menjeda selama durasi yang ditentukan (atau menunggu persetujuan manual) sebelum meningkatkan bobot canary.

  5. 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-stable dan istio-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:

Instal Argo Rollouts

Untuk detail instalasi lengkap, lihat Argo Rollouts installation.

  1. 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.yaml
  2. Instal 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.

  1. Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.

  2. Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi sebelah kiri, pilih ASM Instance > Base Information.

  3. Klik Enable di sebelah kanan Enable Data-plane KubeAPI access.

    Enable Data-plane KubeAPI access

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

  1. Buat file rollout.yaml dengan konten berikut:

    Show rollout.yaml

    apiVersion: argoproj.io/v1alpha1
    kind: Rollout
    metadata:
      name: istio-rollout
    spec:
      revisionHistoryLimit: 2               # Jumlah Set Replika lama yang dipertahankan
      selector:
        matchLabels:
          app: istio-rollout
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "true"  # Aktifkan injeksi sidecar Istio
          labels:
            app: istio-rollout
        spec:
          containers:
          - name: istio-rollout
            image: argoproj/rollouts-demo:blue  # Versi stabil awal
            ports:
            - name: http
              containerPort: 8080
              protocol: TCP
            resources:
              requests:
                memory: 32Mi
                cpu: 5m
      strategy:
        canary:
          canaryService: istio-rollout-canary   # Layanan yang menargetkan Pod canary
          stableService: istio-rollout-stable   # Layanan yang menargetkan Pod stabil
          trafficRouting:
            istio:
              virtualService:
                name: istio-rollout-vsvc        # VirtualService yang bobotnya diperbarui oleh controller
                routes:
                - primary                       # Nama entri rute di dalam VirtualService
          steps:
          - setWeight: 10          # Arahkan 10% traffic ke canary
          - pause: {}              # Tunggu persetujuan manual (kubectl argo rollouts promote)
          - setWeight: 20          # Arahkan 20% traffic ke canary
          - pause: {duration: 20s} # Tunggu 20 detik, lalu lanjut otomatis
          - setWeight: 30
          - pause: {duration: 20s}
          - setWeight: 40
          - pause: {duration: 20s}
          - setWeight: 50
          - pause: {duration: 20s}
          - setWeight: 60
          - pause: {duration: 20s}
          - setWeight: 70
          - pause: {duration: 20s}
          - setWeight: 80
          - pause: {duration: 20s}
          - setWeight: 90
          - pause: {duration: 20s}

    Bidang utama di bawah strategy.canary:

    FieldDescription
    setWeightPersentase traffic yang diarahkan ke versi canary pada langkah ini
    pause: {}Jeda tanpa batas hingga Anda menjalankan kubectl argo rollouts promote
    pause: {duration: 20s}Jeda selama 20 detik, lalu lanjut otomatis ke langkah berikutnya
  2. Terapkan Rollout ke kluster yang ditambahkan ke instans ASM Anda:

    kubectl apply -f rollout.yaml

Buat Layanan

  1. Buat file service.yaml dengan 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-rollout
  2. Terapkan 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

  1. Buat file istio-rollout-vsvc.yaml dengan 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 0
  2. Terapkan VirtualService:

    kubectl apply -f istio-rollout-vsvc.yaml

Buat Gateway

  1. Buat file istio-rollout-gateway.yaml dengan 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: HTTP
  2. Terapkan Gateway:

    kubectl apply -f istio-rollout-gateway.yaml

Langkah 3: Terapkan gerbang masuk

Buat gerbang masuk ASM dengan Port 80 diaktifkan untuk akses layanan.

  1. Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.

  2. Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi sebelah kiri, pilih ASM Gateways > Ingress Gateway.

  3. Pada halaman Ingress Gateway, klik Create dan konfigurasikan parameter berikut: Untuk parameter lainnya, lihat Buat gerbang masuk.

    ParameterValue
    Nameingressgateway
    Gateway typesNorth-South IngressGateway
    Port MappingProtocol: HTTP, Service Port: 80
  4. 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 --watch

Output 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/2

Status Healthy dengan gambar argoproj/rollouts-demo:blue (stable) mengonfirmasi bahwa penerapan awal berhasil.

Langkah 5: Uji penerapan awal

  1. Dapatkan alamat IP gerbang masuk:

    1. Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.

    2. Klik nama instans ASM. Di panel navigasi sebelah kiri, pilih ASM Gateways > Ingress Gateway.

    3. Salin Service address gerbang masuk.

  2. Buka http://<ingress-gateway-ip>/ di browser. Halaman tersebut melakukan panggilan konkuren ke /color dan mengisi grid dengan warna yang dikembalikan. Karena versi stabil menggunakan gambar blue dan tidak ada canary yang berjalan, semua grid menampilkan warna biru.

    Initial blue grid display

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

  1. Tetapkan versi gambar baru:

    kubectl argo rollouts set image istio-rollout "*=argoproj/istio-rollout:yellow"
  2. Verifikasi bahwa kedua versi Pod sedang berjalan:

    1. Masuk ke Konsol ACK dan klik Clusters di panel navigasi sebelah kiri.

    2. Klik nama kluster, lalu pilih Workloads > Pods.

    3. Di kolom Name, pastikan Pod untuk versi biru (stabil) dan kuning (canary) ada.

    Both pod versions running

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.

10% canary traffic

Langkah pertama menentukan pause: {} tanpa durasi, sehingga Rollout menunggu persetujuan manual sebelum melanjutkan.

Lanjutkan rilis

  1. Setujui Rollout untuk melanjutkan melewati jeda manual:

    kubectl argo rollouts promote istio-rollout
  2. Buka 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.

    Progressive traffic shift

Verifikasi rilis yang telah selesai

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

    All yellow -- canary release complete

  2. 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 --watch
    Name:            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-rollout

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

  1. Buat file istio-success-rate.yaml dengan 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])
              )
  2. 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.

  1. Buat file rollout.yaml baru dengan konten berikut:

    Show rollout.yaml

    apiVersion: argoproj.io/v1alpha1
    kind: Rollout
    metadata:
      name: istio-rollout
    spec:
      revisionHistoryLimit: 2
      selector:
        matchLabels:
          app: istio-rollout
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "true"
          labels:
            app: istio-rollout
        spec:
          containers:
          - name: istio-rollout
            image: argoproj/rollouts-demo:yellow   # Versi stabil saat ini
            ports:
            - name: http
              containerPort: 8080
              protocol: TCP
            resources:
              requests:
                memory: 32Mi
                cpu: 5m
      strategy:
        canary:
          canaryService: istio-rollout-canary
          stableService: istio-rollout-stable
          analysis:
            startingStep: 1                        # Mulai analisis dari langkah kedua
            templates:
            - templateName: istio-success-rate     # Referensi AnalysisTemplate
            args:
            - name: service
              value: canary
            - name: namespace
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace    # Selesaikan namespace otomatis
          trafficRouting:
            istio:
              virtualService:
                name: istio-rollout-vsvc
                routes:
                - primary
          steps:
          - setWeight: 10
          - pause: {}              # Tunggu persetujuan manual
          - setWeight: 20
          - pause: {duration: 20s}
          - setWeight: 30
          - pause: {duration: 20s}
          - setWeight: 40
          - pause: {duration: 20s}
          - setWeight: 50
          - pause: {duration: 20s}
          - setWeight: 60
          - pause: {duration: 20s}
          - setWeight: 70
          - pause: {duration: 20s}
          - setWeight: 80
          - pause: {duration: 20s}
          - setWeight: 90
          - pause: {duration: 20s}
  2. Perbarui Rollout:

    kubectl apply -f rollout.yaml

Langkah 4: Picu rilis canary dengan analisis

  1. 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"

    Orange canary traffic

  2. Setujui Rollout untuk memulai progresi canary otomatis dengan pemantauan Prometheus:

    kubectl argo rollouts promote istio-rollout
  3. Pantau status Rollout:

    kubectl argo rollouts get rollout istio-rollout --watch

    Rollout status with analysis

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

Canary release in progress with errors

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

Automatic rollback to stable version

Langkah selanjutnya