All Products
Search
Document Center

Alibaba Cloud Service Mesh:Gunakan jalur lalu lintas dan penandaan hash untuk melakukan pengujian canary berbasis pengguna

Last Updated:Jun 21, 2026

Service Mesh (ASM) memungkinkan Anda mengisolasi beberapa versi atau fitur aplikasi ke dalam lingkungan runtime independen—yang disebut jalur lalu lintas—dan mengarahkan lalu lintas permintaan yang sesuai ke versi atau fitur target dengan menentukan aturan jalur. Di lingkungan produksi, Anda dapat mengisolasi versi stabil dan versi rilis canary menggunakan jalur lalu lintas, lalu mengarahkan lalu lintas ke jalur berbeda berdasarkan identitas pengguna. Secara khusus, permintaan dari pengguna tertentu dapat diarahkan langsung ke versi canary untuk pengujian, sementara sebagian lalu lintas pengguna lainnya diarahkan ke versi canary berdasarkan bobot acak. Topik ini menjelaskan cara menggabungkan jalur lalu lintas dan penandaan hash untuk menerapkan pengujian canary berbasis pengguna.

Prasyarat

Procedure

Contoh skenario ini membuat tiga aplikasi dengan rantai pemanggilan berikut:

  • mocka, dengan versi v1.

  • mockb, dengan versi v1.

  • mockc, dengan versi v1 dan v2.

Aplikasi menggunakan header permintaan x-user-id untuk mengidentifikasi identitas pengguna, dan header ini diteruskan melalui panggilan layanan. Skenario ini menunjukkan hal-hal berikut:

  • Ketika x-user-id: jason, permintaan diarahkan ke versi baru.

  • Untuk semua pengguna lainnya, sistem menghitung hash dari nilai x-user-id dan mengarahkan persentase pengguna tertentu ke versi baru berdasarkan hasil hash tersebut.

Langkah 1: Deploy aplikasi sampel

  1. Buat file bernama sample.yaml dengan konten berikut.

    Expand to view YAML content

    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. Menggunakan kubeconfig kluster bidang data Anda, jalankan perintah berikut untuk deploy aplikasi sampel.

    kubectl apply -f sample.yaml

Langkah 2: Buat aturan gateway

Buat resource Gateway bernama ingressgateway di namespace istio-system menggunakan konfigurasi berikut. Untuk informasi selengkapnya, lihat Manage gateway rules.

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 ASM console. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.

    2. Di halaman Mesh Management, klik nama instans target. Di panel navigasi sebelah kiri, pilih Traffic Management Center > Traffic Lane.

    3. Di halaman Traffic Lane, klik Create Swimlane Group. Di panel Create Swimlane Group, konfigurasikan pengaturan dan klik OK.

      Configuration item

      Description

      Name of swim lane group

      Diatur ke canary pada contoh ini.

      Entrance gateway

      Pilih ingressgateway.

      Lane Mode

      Pilih Permissive Mode.

      Pass-through Mode of Trace Context

      Pilih Pass Through Trace ID.

      Trace ID Request Header

      Diatur ke x-user-id pada contoh ini.

      Routing Request Header

      Tentukan header yang digunakan gateway untuk mengarahkan trafik ke jalur berbeda dan mempertahankan konteks jalur. Anda dapat menetapkan nilai apa pun. Pada contoh ini, atur ke x-asm-prefer-tag.

      Swimlane Services

      Pilih kluster Kubernetes target Anda dan namespace default. Di daftar di bawah, pilih layanan mocka, mockb, dan mockc, lalu klik ikon 移动 untuk menambahkannya ke area selected.

  2. Buat dua jalur, s1 dan s2, dan bind ke versi v1 dan v2 masing-masing.

    1. Di halaman Traffic Lane, di bagian Traffic Rule Definition, klik Create swimlanes.

    2. Di kotak dialog Create swimlanes, konfigurasikan pengaturan dan klik OK.

      Configuration item

      Description

      Swimlane Name

      Diatur ke s1 dan s2 masing-masing.

      Configure Service Tag

      Label Key: Pilih ASM_TRAFFIC_TAG.

      Label Value: Pilih v1 untuk satu jalur dan v2 untuk jalur lainnya.

      Add Service

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

      Jalur s2: Pilih mockc(default).

      Gambar berikut menunjukkan contoh pembuatan jalur s1:

      image

      Setelah kedua jalur dibuat, hasilnya akan tampak seperti ini:

      image

      Catatan

      Secara default, jalur pertama yang Anda buat dalam grup jalur menjadi jalur garis dasar. Anda dapat mengubah jalur garis dasar sehingga ketika lalu lintas menargetkan layanan yang tidak ada di jalur lain, permintaan akan dialihkan ke jalur garis dasar. Untuk informasi selengkapnya, lihat Change the baseline lane in loose mode.

  3. Buat aturan routing untuk jalur-jalur tersebut.

    1. Gunakan konfigurasi berikut untuk membuat aturan routing gateway untuk jalur-jalur tersebut. Aturan ini terdiri dari tiga bagian:

      1. Permintaan dengan x-user-id: jason diarahkan ke jalur s2, dan sistem menambahkan header x-asm-prefer-tag: s2 untuk menandai permintaan tersebut untuk jalur s2.

      2. Permintaan dengan x-asm-prefer-tag: s2 diarahkan ke jalur s2.

      3. Permintaan dengan x-asm-prefer-tag: s1 diarahkan ke jalur s1.

      Expand to view YAML content

      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: swimlane-ingress-vs
        namespace: istio-system
      spec:
        gateways:
        - istio-system/ingressgateway
        hosts:
        - '*'
        http:
        # Routing rule 1: Requests with x-user-id: jason go to lane s2
        # and add x-asm-prefer-tag: s2 to mark the request for lane 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
        # Routing rule 2: Requests with x-asm-prefer-tag: s2 go to lane s2
        - match:
          - headers:
              x-asm-prefer-tag:
                exact: s2
            uri:
              exact: /
          name: r2
          route:
          - destination:
              host: mocka.default.svc.cluster.local
              subset: s2
            # If mocka is not in lane s2, fall back to mocka in lane s1
            fallback:
              target:
                host: mocka.default.svc.cluster.local
                subset: s1
        # Routing rule 3: Requests with x-asm-prefer-tag: s1 go to lane 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: Deploy plugin penandaan hash

  1. Buat file bernama 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:
              # Route 20% of user traffic to lane s2
              - range: 20
                tagValue: s2
              # Route 80% of user traffic to lane s1
              - range: 100
                tagValue: s1
  2. Menggunakan kubeconfig instans ASM Anda, jalankan perintah berikut untuk deploy plugin penandaan.

    kubectl apply -f wasm.yaml

Langkah 5: Verifikasi pengaturan

  1. Jalankan perintah berikut untuk menetapkan variabel lingkungan sementara untuk alamat gerbang masuk.

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

    Permintaan diarahkan langsung ke versi v2 aplikasi mockc.

  3. Anda dapat menjalankan perintah berikut untuk mengarahkan pengguna acak 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

    Permintaan dari pengguna Jessie dan Jack diarahkan ke versi v2 mockc, sedangkan yang lainnya diarahkan ke versi v1.