全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Gunakan jalur lalu lintas dan Plugin penandaan Hash untuk melaksanakan rilis canary berdasarkan segmen pengguna

更新时间:Jul 02, 2025

Service Mesh (ASM) memungkinkan Anda mengisolasi versi atau fitur tertentu dari aplikasi ke dalam lingkungan runtime independen (dikenal sebagai swimlane). Anda dapat mengonfigurasi aturan swimlane untuk merutekan permintaan yang memenuhi aturan tersebut ke versi atau fitur tujuan dari aplikasi. Dalam lingkungan pengembangan, pengembang dapat mengisolasi versi stabil dan versi canary dengan menetapkan swimlane serta merutekan pengguna ke swimlane yang berbeda. Dalam kasus ini, Anda dapat mengarahkan proporsi pengguna tertentu ke versi untuk menguji fungsionalitas, sementara pengguna lainnya dirutekan secara acak ke versi rilis canary berdasarkan aturan routing berbasis bobot. Topik ini menjelaskan cara mengonfigurasi swimlane dan Plugin penandaan Hash untuk melaksanakan rilis canary berdasarkan segmen pengguna.

Prasyarat

Prosedur

Dalam contoh ini, tiga aplikasi dibuat, dan rantai panggilan ditunjukkan pada gambar berikut.

  • mocka dalam versi 1.

  • mockb dalam versi 1.

  • mockc dalam versi 1 dan 2.

Dalam contoh ini, aplikasi mengidentifikasi identitas pengguna berdasarkan header permintaan x-user-id, dan header tersebut dilewatkan di antara aplikasi. Aturan routing lalu lintas adalah sebagai berikut:

  • Permintaan pengguna yang berisi header x-user-id: jason dirutekan ke versi baru aplikasi.

  • Proporsi tertentu dari permintaan pengguna yang berisi header x-user-id dirutekan ke versi baru aplikasi berdasarkan nilai Hash.

Langkah 1: Terapkan aplikasi

  1. Buat file sample.yaml dengan konten berikut.

    Klik untuk melihat file YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mocka-v1
      labels:
        app: mocka
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mocka
          version: v1
          ASM_TRAFFIC_TAG: v1
      template:
        metadata:
          labels:
            app: mocka
            version: v1
            ASM_TRAFFIC_TAG: v1
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v1
            - name: app
              value: mocka
            - name: upstream_url
              value: "http://mockb:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockb-v1
      labels:
        app: mockb
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockb
          version: v1
          ASM_TRAFFIC_TAG: v1
      template:
        metadata:
          labels:
            app: mockb
            version: v1
            ASM_TRAFFIC_TAG: v1
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v1
            - name: app
              value: mockb
            - name: upstream_url
              value: "http://mockc:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockc-v1
      namespace: default
      labels:
        app: mockc
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockc
          version: v1
          ASM_TRAFFIC_TAG: v1
      template:
        metadata:
          labels:
            app: mockc
            version: v1
            ASM_TRAFFIC_TAG: v1
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v1
            - name: app
              value: mockc
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockc-v2
      namespace: default
      labels:
        app: mockc
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockc
          version: v2
          ASM_TRAFFIC_TAG: v2
      template:
        metadata:
          labels:
            app: mockc
            version: v2
            ASM_TRAFFIC_TAG: v2
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v2
            - name: app
              value: mockc
            ports:
            - containerPort: 8000
  2. Jalankan perintah berikut untuk menerapkan aplikasi menggunakan file kubeconfig klaster pada bidang data plane.

    kubectl apply -f sample.yaml

Langkah 2: Buat aturan gateway

Jalankan perintah berikut untuk membuat gateway Istio bernama ingressgateway di namespace Istio-system. Untuk informasi lebih lanjut, lihat Kelola gateway Istio.

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: ingressgateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - '*'

Langkah 3: Buat grup jalur dan jalur

  1. Buat grup jalur.

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

    2. Di halaman Mesh Management, klik instance ASM target. Di panel navigasi kiri, pilih Traffic Management Center > Traffic Swimlane.

    3. Di halaman Traffic Swimlane, klik Create Swimlane Group. Konfigurasikan pengaturan terkait di panel Create Swimlane Group, dan klik OK.

      Parameter

      Deskripsi

      Name of Swim lane Group

      Dalam contoh ini, masukkan canary.

      Ingress Type

      Pilih ingressgateway.

      Lane Mode

      Pilih Loose Mode.

      Pass-through Mode of Trace Context

      Pilih Pass-through Trace Id.

      Trace ID Request Header

      Dalam contoh ini, atur menjadi x-user-id.

      Request Routing Header

      Aktifkan gateway untuk merutekan trafik ke jalur yang berbeda berdasarkan isi permintaan dan lewatkan header dalam konteks jalur. Parameter ini ditentukan oleh pengguna. Dalam contoh ini, masukkan x-asm-prefer-tag.

      Swimlane Service

      Pilih klaster target di bidang klaster Kubernetes dan pilih default di bidang namespace. Pilih layanan mocka, mockb, dan mockc dalam daftar di bawah, dan klik ikon 移动 untuk menambahkan layanan target ke panel Selected.

  2. Buat swimlane s1 dan s2, dan hubungkan mereka dengan versi 1 dan 2 masing-masing.

    1. Di halaman Traffic Swimlane, klik Create Swimlanes di panel Traffic Rule Definition.

    2. Di kotak dialog Create Swimlanes , konfigurasikan pengaturan terkait, lalu klik OK.

      Parameter

      Deskripsi

      Swimlane Name

      Masukkan s1 dan s2 masing-masing.

      Configure Service Tag

      Label Key: Pilih ASM_TRAFFIC_TAG

      Label Value: Pilih v1 dan v2 untuk dua jalur masing-masing.

      Add Service

      Jalur s1: Pilih mocka(default), mockb(default), mockc(default).

      Jalur s2: Pilih mockc(default).

      Gambar berikut menunjukkan contoh konfigurasi swimlane s1:

      image

      Dua swimlane tersebut adalah sebagai berikut:

      image

      Catatan

      Secara default, jalur pertama yang Anda buat dalam grup jalur berfungsi sebagai jalur dasar. Anda diizinkan untuk memodifikasi layanan dalam jalur dasar ini. Saat permintaan dikirim ke layanan yang tidak ada di jalur lain, permintaan tersebut diteruskan ke jalur dasar melalui mekanisme fallback. Untuk informasi lebih lanjut, lihat Modifikasi jalur dasar dalam mode longgar.

  3. Buat aturan routing permintaan untuk swimlane.

    1. Buat aturan routing permintaan untuk swimlane dengan konten berikut. Aturannya adalah sebagai berikut:

      1. Permintaan yang berisi header x-user-id: jason dirutekan ke swimlane s2. Header x-asm-prefer-tag: s2 yang disediakan untuk permintaan menunjukkan bahwa permintaan tersebut dirutekan ke swimlane s2.

      2. Permintaan yang berisi header x-asm-prefer-tag: s2 dirutekan ke swimlane s2.

      3. Permintaan yang berisi header x-asm-prefer-tag: s1 dirutekan ke swimlane s1.

      Klik untuk melihat konten YAML

      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: swimlane-ingress-vs
        namespace: istio-system
      spec:
        gateways:
        - istio-system/ingressgateway
        hosts:
        - '*'
        http:
        # Aturan routing 1: Permintaan yang berisi header x-user-id: jason dirutekan ke swimlane s2
        # Header x-asm-prefer-tag: s2 yang disediakan untuk permintaan menunjukkan bahwa permintaan tersebut dirutekan ke swimlane s2
        - match:
          - headers:
              x-user-id:
                exact: jason
            uri:
              exact: /
          name: r2
          route:
          - destination:
              host: mocka.default.svc.cluster.local
              subset: s2
            fallback:
              target:
                host: mocka.default.svc.cluster.local
                subset: s1
            headers:
              request:
                set:
                  x-asm-prefer-tag: s2
        # Aturan routing 2: Permintaan yang berisi header x-asm-prefer-tag: s2 dirutekan ke swimlane s2
        - match:
          - headers:
              x-asm-prefer-tag:
                exact: s2
            uri:
              exact: /
          name: r2
          route:
          - destination:
              host: mocka.default.svc.cluster.local
              subset: s2
            # Jika aplikasi mocka tidak termasuk dalam jalur s2, permintaan diteruskan ke mocka di swimlane s1
            fallback:
              target:
                host: mocka.default.svc.cluster.local
                subset: s1
        # Aturan routing 3: Permintaan yang berisi header x-asm-prefer-tag: s1 dirutekan ke swimlane s1
        - match:
          - headers:
              x-asm-prefer-tag:
                exact: s1
            uri:
              exact: /
          name: r1
          route:
          - destination:
              host: mocka.default.svc.cluster.local
              subset: s1

Langkah 4: Terapkan Plugin penandaan Hash

  1. Buat file wasm.yaml dengan konten berikut.

    apiVersion: extensions.istio.io/v1alpha1
    kind: WasmPlugin
    metadata:
      name: hash-tagging
      namespace: istio-system
    spec:
      imagePullPolicy: IfNotPresent 
      selector:
        matchLabels:
          istio: ingressgateway
      url: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-wasm-hash-tagging:v1.22.6.2-g72656ba-aliyun 
      phase: AUTHN
      pluginConfig:
        rules:
          - header: x-user-id
            modulo: 100
            tagHeader: x-asm-prefer-tag
            policies:
              # 20% dari permintaan pengguna dirutekan ke swimlane s2
              - range: 20
                tagValue: s2
              # 80% dari permintaan pengguna dirutekan ke swimlane s1
              - range: 100
                tagValue: s1
  2. Jalankan perintah berikut untuk menerapkan Plugin penandaan Hash menggunakan file kubeconfig instance ASM.

    kubectl apply -f wasm.yaml

Langkah 5: Verifikasi aturan routing

  1. Jalankan perintah berikut untuk mengonfigurasi variabel lingkungan sementara untuk alamat gateway ingress.

    export GATEWAY_ADDRESS=`kubectl get svc -n istio-system | grep istio-ingressgateway | awk '{print $4}'`
  2. Jalankan perintah berikut untuk mengakses aplikasi sebagai Jason.

    curl ${GATEWAY_ADDRESS} -H 'x-user-id: jason'

    Output yang diharapkan:

    -> mocka(version: v1, ip: 10.0.0.15)-> mockb(version: v1, ip: 10.0.0.130)-> mockc(version: v2, ip: 10.0.0.133)%     

    Hasilnya menunjukkan bahwa permintaan langsung dirutekan ke versi 2 aplikasi mockc.

  3. Jalankan perintah berikut untuk merutekan pengguna tertentu ke versi baru.

     for i in 'bob' 'stacy' 'jessie' 'vance' 'jack'; do curl ${GATEWAY_ADDRESS} -H "x-user-id: $i";echo "   user $i requested"; done

    Output yang diharapkan:

    -> mocka(version: v1, ip: 10.0.0.15)-> mockb(version: v1, ip: 10.0.0.130)-> mockc(version: v1, ip: 10.0.0.131)   user bob requested
    -> mocka(version: v1, ip: 10.0.0.15)-> mockb(version: v1, ip: 10.0.0.130)-> mockc(version: v1, ip: 10.0.0.131)   user stacy requested
    -> mocka(version: v1, ip: 10.0.0.15)-> mockb(version: v1, ip: 10.0.0.130)-> mockc(version: v2, ip: 10.0.0.133)   user jessie requested
    -> mocka(version: v1, ip: 10.0.0.15)-> mockb(version: v1, ip: 10.0.0.130)-> mockc(version: v1, ip: 10.0.0.131)   user vance requested
    -> mocka(version: v1, ip: 10.0.0.15)-> mockb(version: v1, ip: 10.0.0.130)-> mockc(version: v2, ip: 10.0.0.133)   user jack requested

    Hasilnya menunjukkan bahwa permintaan dari pengguna Jessie dan Jack langsung dirutekan ke versi 2 aplikasi mockc, sedangkan permintaan dari pengguna lain dirutekan ke versi 1.