全部产品
Search
文档中心

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

更新时间:Jul 06, 2025

Argo Rollouts adalah sebuah controller Kubernetes yang mencakup satu set CustomResourceDefinition (CRDs). Anda dapat mengintegrasikan Service Mesh (ASM) dengan Argo Rollouts untuk memberikan kemampuan lebih kuat dalam rilis canary. Jika ingin memperbarui aplikasi di lingkungan Kubernetes dan mengurangi risiko terkait pembaruan, integrasi ASM dengan Argo Rollouts memungkinkan implementasi rilis canary. Dengan cara ini, Anda dapat secara bertahap mendorong versi baru aplikasi kepada pengguna dalam beberapa batch sambil mengamati kinerjanya secara real-time. Hal ini membantu mengendalikan risiko secara efektif, menjamin stabilitas layanan dan pengalaman pengguna, serta berhasil melakukan iterasi versi tanpa mengganggu kontinuitas bisnis.

Prasyarat

Persiapan

Instal Argo Rollout

Untuk menginstal Argo Rollouts, ikuti langkah-langkah berikut. Untuk informasi lebih lanjut, lihat Instalasi.

  1. Jalankan perintah berikut untuk menginstal server 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. Jalankan perintah berikut untuk menginstal plug-in kubectl Argo Rollout.

    Plug-in kubectl Argo Rollouts menyediakan manajemen berbasis kubectl.

    brew install argoproj/tap/kubectl-argo-rollouts

Aktifkan akses ke sumber daya Istio dari instance ASM pada data plane menggunakan Kubernetes API

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

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

  3. Klik Enable di sebelah kanan Enable Data-plane KubeAPI access.启用数据面KubeAPI访问

  4. Di pesan yang muncul, klik OK.

Implementasikan rilis canary

Contoh berikut menunjukkan cara membuat versi stabil dan versi rilis canary serta bagaimana secara bertahap memindahkan lalu lintas dari versi stabil ke versi rilis canary berdasarkan rasio lalu lintas. Untuk informasi lebih lanjut tentang rilis canary, lihat Konfigurasikan Rilis Canary.

Langkah 1: Buat Aplikasi Rollout dan Layanan

  1. Buat rollout.

    1. Buat file rollout.yaml yang berisi konten berikut:

      Tampilkan File 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:blue
              ports:
              - name: http
                containerPort: 8080
                protocol: TCP
              resources:
                requests:
                  memory: 32Mi
                  cpu: 5m
        strategy:
          canary:
            canaryService: istio-rollout-canary
            stableService: istio-rollout-stable
            trafficRouting:
              istio:
                virtualService:
                  name: istio-rollout-vsvc
                  routes:
                  - primary
            steps:
            - setWeight: 10
            - pause: {}         # Perbarui Rollout secara 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}

      Bidang strategy mendefinisikan kebijakan rilis canary. Berikut ini menjelaskan parameter setWeight dan pause di bawah bidang strategy:

      • setWeight: bobot lalu lintas yang akan diarahkan ke versi rilis canary.

      • pause: menjeda Rollout. Jika tidak ada duration yang ditentukan untuk langkah jeda, Rollout harus diperbarui secara manual. Jika duration ditentukan untuk langkah jeda, sistem akan memperbarui Rollout secara otomatis setelah durasi duration berakhir.

    2. Jalankan perintah berikut untuk menerapkan Rollout ke cluster yang ditambahkan ke instance ASM Anda:

      kubectl apply -f rollout.yaml
  2. Buat layanan.

    1. Buat file service.yaml yang berisi konten berikut:

      apiVersion: v1
      kind: Service
      metadata:
        name: istio-rollout-canary
      spec:
        ports:
        - port: 80
          targetPort: http
          protocol: TCP
          name: http
        selector:
          app: istio-rollout
      
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: istio-rollout-stable
      spec:
        ports:
        - port: 80
          targetPort: http
          protocol: TCP
          name: http
        selector:
          app: istio-rollout
    2. Jalankan perintah berikut untuk menerapkan layanan ke cluster yang ditambahkan ke instance ASM Anda:

      kubectl apply -f service.yaml

Langkah 2: Buat Sumber Daya Istio Terkait

  1. Buat layanan virtual bernama istio-rollout-vsvc.

    Anda telah mengaktifkan akses ke sumber daya Istio dari instance ASM pada data plane menggunakan Kubernetes API. Oleh karena itu, Anda dapat menggunakan file kubeconfig pada data plane untuk mengakses sumber daya Istio seperti layanan virtual, gateway Istio, dan aturan tujuan. Sebagai alternatif, Anda dapat menggunakan Konsol ASM atau file kubeconfig untuk membuat sumber daya Istio.

    1. Buat file istio-rollout-vsvc.yaml yang berisi 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
            route:
              - destination:
                  host: istio-rollout-stable
                weight: 100
              - destination:
                  host: istio-rollout-canary
    2. Jalankan perintah berikut untuk menerapkan istio-rollout-vsvc:

      kubectl apply -f istio-rollout-vsvc.yaml
  2. Buat gateway Istio bernama istio-rollout-gateway.

    1. Buat file istio-rollout-gateway.yaml yang berisi konten berikut:

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: istio-rollout-gateway
      spec:
        selector:
          istio: ingressgateway
        servers:
          - hosts:
              - '*'
            port:
              name: http
              number: 80
              protocol: HTTP
                                      
    2. Jalankan perintah berikut untuk menerapkan istio-rollout-gateway:

      kubectl apply -f istio-rollout-gateway.yaml

Langkah 3: Terapkan Gateway Ingress

Buat gateway ingress dengan port 80 diaktifkan untuk pengujian akses layanan.

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

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

  3. Di halaman Ingress Gateway, klik Create. Atur parameter gateway ingress dan klik Create.

    Tabel berikut hanya menjelaskan beberapa parameter gateway ingress. Untuk informasi lebih lanjut tentang parameter lainnya dari gateway ingress, lihat Buat Gateway Ingress.

    Parameter

    Deskripsi

    Name

    Nama gateway ingress. Untuk contoh ini, atur parameter menjadi ingressgateway.

    Gateway types

    Tipe gateway ingress. Untuk contoh ini, atur parameter menjadi North-South IngressGateway.

    Port Mapping

    Pemetaan port gateway ingress. Klik Add Port. Di baris yang muncul, atur parameter Protocol menjadi HTTP dan parameter Service Port menjadi 80.

Langkah 4: Lihat Status Rollout

Jalankan perintah berikut untuk melihat status Rollout:

kubectl argo rollouts get rollout istio-rollout

Output yang diharapkan:

kubectl argo rollouts get rollout istio-rollout
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

Langkah 5: Uji Status Awal Rollout

  1. Dapatkan alamat IP gateway ingress.

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

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

    3. Dapatkan Service address dari gateway ingress.

  2. Gunakan browser untuk mengakses http://{alamat IP gateway ingress}/.

    Gambar berikut menunjukkan hasil akses. Panggilan bersamaan ke http://{alamat IP gateway ingress}/color dipanggil di halaman ini untuk mengisi kotak-kotak dengan warna yang diperoleh. Warna yang ditentukan dalam Rollout istio-rollout adalah biru, dan rilis canary belum dimulai. Oleh karena itu, warna biru ditampilkan.蓝色效果

Langkah 6: Perbarui Rollout

Dalam contoh ini, kuning digunakan untuk menunjukkan versi rilis canary. Ketika warna kotak-kotak di halaman http://{alamat IP gateway ingress}/ berubah dari biru menjadi kuning, rilis canary diimplementasikan.

  1. Perbarui versi gambar kontainer untuk Rollout.

    1. Jalankan perintah berikut untuk memperbarui versi gambar:

      kubectl argo rollouts set image istio-rollout "*=argoproj/istio-rollout:kuning"
    2. Lihat versi gambar kontainer yang sesuai.

      1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

      2. Di halaman Clusters, temukan cluster yang diinginkan dan klik namanya. Di panel kiri, pilih Workloads > Pods.

      3. Di kolom Name, lihat versi gambar kontainer yang sesuai.

        Pod di mana versi kuning (versi rilis canary) berjalan dibuat, tetapi pod di mana versi biru (versi stabil) berjalan juga masih ada, seperti yang ditunjukkan pada gambar berikut.

        镜像版本

  2. Gunakan browser untuk mengakses http://{alamat IP gateway ingress}/.

    Hasilnya menunjukkan bahwa 10% kotak biru berubah menjadi kuning, seperti yang ditunjukkan pada gambar berikut. 黄色与蓝色效果Ini karena bobot lalu lintas layanan virtual yang dikonfigurasi berubah. Secara spesifik, bobot lalu lintas versi stabil (versi biru) berubah dari 100 menjadi 90, sedangkan bobot lalu lintas versi rilis canary (versi kuning) berubah dari 0 menjadi 10. Rollout mengontrol bobot lalu lintas layanan virtual. Bobot lalu lintas yang Anda tentukan untuk versi rilis canary pada langkah pertama diatur ke 10 saat Rollout dibuat. Oleh karena itu, ketika Rollout dimulai, controller Argo Rollouts mengubah bobot lalu lintas yang dikonfigurasi untuk layanan virtual di Rollout sesuai dengan itu. Selain itu, parameter pause dibiarkan kosong. Ini berarti Rollout perlu dikonfirmasi secara manual untuk melanjutkan ke tahap berikutnya.

  3. Lanjutkan riliscanary.

    1. Jalankan perintah berikut untuk melanjutkan rilis canary:

      kubectl argo rollouts promote istio-rollout
    2. Gunakan browser untuk mengakses http://{alamat IP gateway ingress}/.

      Gambar berikut menunjukkan hasilnya. Bobot lalu lintas layanan virtual terus disesuaikan berdasarkan konfigurasi di Rollout. Pada tahap ini, durasi pause ditentukan. Untuk informasi lebih lanjut, lihat Langkah 1. Oleh karena itu, sistem secara otomatis menyesuaikan bobot lalu lintas layanan virtual setelah durasi jeda yang ditentukan berakhir.继续发布

  4. Periksa apakah rilis canary berhasil.

    1. Tunggu sejenak. Kemudian, gunakan browser untuk mengakses http://{alamat IP gateway ingress}/.

      Semua kotak biru diubah menjadi kuning, seperti yang ditunjukkan pada gambar berikut.黄色效果

    2. Jalankan perintah berikut untuk melihat status Rollout:

      kubectl argo rollouts get rollout istio-rollout --watch

      Output yang diharapkan:

      Name:            istio-rollout
      Namespace:       default
      Status:           Sehat
      Strategy:        Canary
        Step:          18/18
        SetWeight:     100
        ActualWeight:  100
      Images:          argoproj/rollouts-demo:yellow (stabil)
      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  stabil
      │     └──□ istio-rollout-5fcf5864c4-vw6kh  Pod          Running     26m  ready:2/2
      ├──# revision:3
      │  └──

      Output menunjukkan bahwa versi gambar kontainer untuk Rollout diperbarui menjadi yellow.

Gunakan Prometheus untuk mengimplementasikan rollback otomatis

Selama rilis canary, Anda dapat menjalankan perintah kubectl argo rollouts abort istio-rollout untuk kembali ke versi stabil. Anda juga dapat menggunakan sistem Prometheus untuk memantau status kesehatan aplikasi yang terlibat dalam rilis canary. Jika anomali metrik terjadi, versi rilis canary secara otomatis dikembalikan ke versi stabil dan ditandai sebagai Degraded.

  1. Aktifkan Prometheus di ASM. Untuk informasi lebih lanjut, lihat Integrasi Managed Service for Prometheus untuk Memantau Instance ASM atau Pantau Instance ASM Menggunakan Instance Prometheus yang Dikelola Sendiri.

  2. Konfigurasikan Argo AnalysisTemplate.

    1. Buat file istio-success-rate.yaml yang berisi konten berikut.

      Atur parameter address dari AnalysisTemplate ke titik akhir instance Prometheus yang terhubung ke ASM.

      apiVersion: argoproj.io/v1alpha1
      kind: AnalysisTemplate
      metadata:
        name: istio-success-rate
      spec:
        args:
        - name: service
        - name: namespace
        metrics:
        - name: success-rate
          initialDelay: 60s
          interval: 20s
          successCondition: result[0] > 0.90
          provider:
            prometheus:
              address: http://xxx.aliyuncs.com: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. Jalankan perintah berikut untuk menerapkan Argo AnalysisTemplate:

      kubectl apply -f istio-success-rate.yaml
  3. Hubungkan Analisis dengan Rollout.

    1. Buat file rollout.yaml yang berisi konten berikut.

      Atur parameter analysis di bawah strategy sehingga Analisis dapat digunakan untuk pemantauan dan rollback otomatis mulai langkah kedua. Versi gambar awal kontainer untuk Rollout adalah yellow.

      Tampilkan File 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
              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
              templates:
              - templateName: istio-success-rate
              args:
              - name: service
                value: canary
              - name: namespace
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.namespace
            trafficRouting:
              istio:
                virtualService:
                  name: istio-rollout-vsvc
                  routes:
                  - primary
            steps:
            - setWeight: 10
            - pause: {}         # Perbarui Rollout secara 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. Jalankan perintah berikut untuk memperbarui Rollout:

      kubectl apply -f rollout.yaml
  4. Jalankan perintah berikut untuk memperbarui versi gambar:

    kubectl argo rollouts set image istio-rollout "*=argoproj/rollouts-demo:orange"

    Gunakan browser untuk mengakses http://{alamat IP gateway ingress}/. Gambar berikut menunjukkan hasilnya.橙色效果

  5. Konfirmasi pembaruan Rollout secara manual.

    1. Jalankan perintah berikut untuk melanjutkan rilis canary.

      Setelah Anda menjalankan perintah tersebut, rilis canary otomatis dimulai. Selain itu, pemantauan Prometheus diaktifkan mulai langkah kedua. Dalam hal ini, jika versi rilis canary memiliki tingkat kesalahan lebih dari 90%, rollback akan dipicu.

      kubectl argo rollouts promote istio-rollout
    2. Jalankan perintah berikut untuk melihat status Rollout:

      kubectl argo rollouts get rollout istio-rollout --watch

      Keluaran yang diharapkan:监控服务状态

  6. Konfigurasikan tingkat kesalahan.

    Dalam rilis progresif berikutnya, Anda dapat menyesuaikan tingkat kesalahan untuk versi rilis canary secara manual. Jika bilah kemajuan kesalahan mencapai 100%, semua grid oranye (versi rilis canary) dibingkai merah untuk menunjukkan kesalahan. Setelah beberapa saat, semua versi rilis canary secara otomatis dikembalikan ke versi stabil mereka (grid kuning).

    Gambar 1. Gambar berikut menunjukkan bahwa rilis canary sedang dilaksanakan.金丝雀中

    Gambar 2. Gambar berikut menunjukkan bahwa semua versi rilis canary telah dikembalikan secara otomatis ke versi stabil mereka.自动回滚到稳定版