全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Gunakan jalur lalu lintas dalam mode ketat untuk mengelola lalu lintas ujung ke ujung

更新时间:Jul 02, 2025

Jalur lalu lintas dalam mode ketat memungkinkan Anda mengisolasi versi atau fitur tertentu dari aplikasi ke dalam lingkungan runtime terpisah. Pendekatan ini berguna untuk rilis canary di semua layanan dalam rantai panggilan atau untuk mengisolasi versi aplikasi. Dengan hanya merutekan lalu lintas yang memenuhi aturan tertentu ke versi layanan baru, pendekatan ini memastikan bahwa rilis tersebut andal dan terkendali.

Prasyarat

  • Sebuah instance Service Mesh (ASM) Edisi Enterprise atau Edisi Ultimate telah dibuat dengan versi 1.18.2.111 atau lebih baru. Untuk informasi lebih lanjut, lihat Buat instance ASM atau Tingkatkan instance ASM.

    Catatan

    Jika versi instance ASM Anda adalah 1.17.2.22 atau lebih baru tetapi lebih awal dari 1.18.2.111, lihat Gunakan jalur untuk mengelola lalu lintas untuk informasi tentang manajemen lalu lintas.

  • Kluster telah ditambahkan ke instance ASM.

  • Sebuah gateway ingress ASM bernama ingressgateway telah dibuat. Untuk informasi lebih lanjut, lihat Buat gateway ingress.

  • Sebuah gateway Istio bernama ingressgateway telah dibuat di namespace istio-system. Untuk informasi lebih lanjut, lihat Kelola gateway Istio.

    Tampilkan kode YAML contoh dari 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:
            - '*'

Contoh

Dalam contoh ini, tiga jalur (s1, s2, dan s3) dibuat dan mewakili tiga versi layanan mocka, mockb, dan mockc.image.png

Langkah 1: Sebarkan layanan contoh

  1. Aktifkan injeksi proxy sidecar otomatis untuk namespace default. Untuk informasi lebih lanjut tentang prosedurnya, lihat Aktifkan injeksi proxy sidecar otomatis dalam topik Kelola namespace global.

    Untuk informasi lebih lanjut tentang injeksi proxy sidecar otomatis, lihat Konfigurasikan kebijakan injeksi proxy sidecar.

  2. Jalankan perintah berikut untuk menyebarkan layanan contoh di kluster Container Service for Kubernetes (ACK):

    kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v1/mock-tracing-v1.yaml
    kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v2/mock-tracing-v2.yaml
    kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v3/mock-tracing-v3.yaml

Langkah 2: 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 nama instance ASM. Di panel navigasi kiri, pilih Traffic Management Center > Traffic Lane.

    3. Di halaman Traffic Lane, klik Create Swimlane Group. Di panel Create Swimlane Group, atur parameter dan klik OK.

      Parameter

      Deskripsi

      Name of swim lane group

      Untuk contoh ini, masukkan test.

      Istio gateway for an ingress gateway

      Pilih ingressgateway.

      Lane Mode

      Pilih Strict Mode.

      Swimlane Services

      Pilih kluster ACK tempat Anda menyebarkan layanan contoh dari daftar drop-down Kluster Kubernetes dan pilih default dari daftar drop-down Namespace. Kemudian, pilih mocka, mockb, dan mockc dalam daftar layanan, dan klik ikon 移动 untuk menambahkan layanan ke bagian selected.

  2. Buat jalur s1, s2, dan s3 dan ikat jalur s1 ke versi 1 (v1) dari layanan contoh, jalur s2 ke versi 2 (v2) dari layanan contoh, dan jalur s3 ke versi 3 (v3) dari layanan contoh.

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

    2. Di kotak dialog Create swimlanes, atur parameter dan klik OK.

      Parameter

      Deskripsi

      Swimlane Name

      Beri nama tiga jalur sebagai s1, s2, dan s3 secara berturut-turut.

      Configure Service Tag

      Label Key: Pilih ASM_TRAFFIC_TAG.

      Label Value: Pilih v1 untuk jalur s1, v2 untuk jalur s2, dan v3 untuk jalur s3.

      Gambar berikut menunjukkan konfigurasi jalur s1.

      创建泳道

      Setelah tiga jalur dibuat, Anda dapat melihatnya di bagian Definisi Aturan Lalu Lintas, seperti yang ditunjukkan pada gambar berikut.创建泳道

      Aturan tujuan dan layanan virtual secara otomatis dibuat untuk setiap layanan di jalur. Anda dapat memilih Traffic Management Center > DestinationRule atau VirtualService di panel navigasi kiri untuk melihat aturan tujuan atau layanan virtual. Misalnya, aturan tujuan dan layanan virtual berikut secara otomatis dibuat untuk layanan mocka.

      Perluas untuk melihat kode YAML contoh dari aturan tujuan

      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        labels:
          asm-system: 'true'
          provider: asm
          swimlane-group: test
        name: trafficlabel-dr-test-default-mocka
        namespace: istio-system
      spec:
        host: mocka.default.svc.cluster.local
        subsets:
          - labels:
              ASM_TRAFFIC_TAG: v1
            name: s1
          - labels:
              ASM_TRAFFIC_TAG: v2
            name: s2
          - labels:
              ASM_TRAFFIC_TAG: v3
            name: s3
      

      Perluas untuk melihat kode YAML contoh dari layanan virtual

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        labels:
          asm-system: 'true'
          provider: asm
          swimlane-group: test
        name: trafficlabel-vs-test-default-mocka
        namespace: istio-system
      spec:
        hosts:
          - mocka.default.svc.cluster.local
        http:
          - match:
              - sourceLabels:
                  ASM_TRAFFIC_TAG: v1
            route:
              - destination:
                  host: mocka.default.svc.cluster.local
                  subset: s1
          - match:
              - sourceLabels:
                  ASM_TRAFFIC_TAG: v2
            route:
              - destination:
                  host: mocka.default.svc.cluster.local
                  subset: s2
          - match:
              - sourceLabels:
                  ASM_TRAFFIC_TAG: v3
            route:
              - destination:
                  host: mocka.default.svc.cluster.local
                  subset: s3
      
  3. Buat aturan pengarahan lalu lintas untuk setiap jalur.

    1. Di bagian Traffic Rule Definition halaman Traffic Lane, temukan jalur untuk mana Anda ingin membuat aturan pengarahan lalu lintas, dan klik Ingress traffic rules di kolom Actions.

    2. Di kotak dialog Add drainage rule, atur parameter dan klik OK.

      Contoh ini mengasumsikan bahwa jalur permintaan masuk dari semua layanan di jalur adalah /mock, dan aturan pengarahan lalu lintas yang sama dikonfigurasikan untuk setiap jalur.

      Parameter

      Deskripsi

      Ingress service

      Pilih mocka.default.svc.cluster.local.

      Ingress traffic rules

      Atur parameter Name menjadi r1 dan parameter realm name menjadi *.

      Matching request URI

      Atur parameter Method menjadi Exact dan parameter Content menjadi /mock.

      Add Header Matching Rule

      Klik Add Header Matching Rule. Atur Name menjadi x-asm-prefer-tag, Method menjadi Exact, dan Content menjadi s1, s2, dan s3 secara berturut-turut.

      Gambar berikut menunjukkan konfigurasi aturan pengarahan lalu lintas untuk jalur s1.

      image.png

      Setelah aturan pengarahan lalu lintas dibuat, Anda dapat melihatnya di bagian Definisi Aturan Lalu Lintas, seperti yang ditunjukkan pada gambar berikut.image.png

      Setelah aturan pengarahan lalu lintas dibuat, layanan virtual secara otomatis dibuat untuk jalur. Misalnya, layanan virtual berikut dibuat untuk jalur s1.

      Perluas untuk melihat kode YAML contoh dari layanan virtual

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        labels:
          asm-system: 'true'
          provider: asm
          swimlane-group: test
        name: swimlane-ingress-vs-test-s1
        namespace: istio-system
      spec:
        gateways:
          - istio-system/ingressgateway
        hosts:
          - '*'
        http:
          - match:
              - headers:
                  x-asm-prefer-tag:
                    exact: s1
                uri:
                  exact: /mock
            name: r1
            route:
              - destination:
                  host: mocka.default.svc.cluster.local
                  subset: s1
      

Langkah 3: Verifikasi bahwa fitur rilis canary ujung ke ujung berfungsi

  1. Dapatkan alamat IP publik dari gateway ingress ASM. Untuk informasi lebih lanjut, lihat Langkah 2: Dapatkan alamat IP dari gateway ingress ASM.

  2. Jalankan perintah berikut untuk mengonfigurasi variabel lingkungan.

    xxx.xxx.xxx.xxx adalah alamat IP yang diperoleh di sublangkah 1.

    export ASM_GATEWAY_IP=xxx.xxx.xxx.xxx
  3. Verifikasi bahwa fitur rilis canary ujung ke ujung berfungsi.

    1. Jalankan perintah berikut untuk mengakses layanan di jalur s1.

      Dalam perintah ini, nilai dari x-asm-prefer-tag adalah s1, yang merupakan nama jalur s1 yang Anda konfigurasikan saat membuat jalur s1 di sublangkah 2 dari Langkah 2.

      for i in {1..100};  do curl   -H 'x-asm-prefer-tag: s1' http://${ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;

      Output yang diharapkan:

      -> mocka(version: v1, ip: 172.17.0.54)-> mockb(version: v1, ip: 172.17.0.129)-> mockc(version: v1, ip: 172.17.0.130)

      Output menunjukkan bahwa lalu lintas yang ditentukan oleh header HTTP x-asm-prefer-tag: s1 mengalir ke layanan terkait di jalur s1. Ini sesuai dengan harapan.

    2. Jalankan perintah berikut untuk mengakses layanan di jalur s2.

      Dalam perintah ini, nilai dari x-asm-prefer-tag adalah s2, yang merupakan nama jalur s2 yang Anda konfigurasikan saat membuat jalur s2 di sublangkah 2 dari Langkah 2.

      for i in {1..100};  do curl   -H 'x-asm-prefer-tag: s2' http://${ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;

      Output yang diharapkan:

      -> mocka(version: v2, ip: 172.17.0.9)-> mockb(version: v2, ip: 172.17.0.126)-> mockc(version: v2, ip: 172.17.0.128)

      Output menunjukkan bahwa lalu lintas yang ditentukan oleh header HTTP x-asm-prefer-tag: s2 mengalir ke layanan terkait di jalur s2. Ini sesuai dengan harapan.

    3. Jalankan perintah berikut untuk mengakses layanan di jalur s3.

      Dalam perintah ini, nilai dari x-asm-prefer-tag adalah s3, yang merupakan nama jalur s3 yang Anda konfigurasikan saat membuat jalur s3 di sublangkah 2 dari Langkah 2.

      for i in {1..100};  do curl   -H 'x-asm-prefer-tag: s3' http://${ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;

      Output yang diharapkan:

      -> mocka(version: v3, ip: 172.17.0.132)-> mockb(version: v3, ip: 172.17.0.127)-> mockc(version: v3, ip: 172.17.0.69)

      Output menunjukkan bahwa lalu lintas yang ditentukan oleh header HTTP x-asm-prefer-tag: s3 mengalir ke layanan terkait di jalur s3. Ini sesuai dengan harapan.

Gunakan layanan virtual kustom untuk merutekan lalu lintas untuk jalur lalu lintas dalam mode ketat

Konsol ASM memiliki fitur pembuatan aturan pengarahan permintaan bawaan. Setelah Anda membuat layanan virtual di gateway ingress ASM yang sesuai dengan jalur lalu lintas, aturan pengarahan permintaan dibuat untuk jalur lalu lintas. Dengan cara ini, gateway ingress ASM dapat meneruskan permintaan ke jalur lalu lintas yang berbeda.

Aturan pengarahan permintaan jalur lalu lintas mencakup aturan pencocokan untuk header permintaan dan jalur permintaan. Anda dapat membuat layanan virtual kustom untuk mendefinisikan aturan pencocokan yang lebih kompleks atau membuat rute permintaan kustom.

Catatan

Saat menggunakan layanan virtual kustom untuk merutekan lalu lintas jalur lalu lintas, kami sarankan agar Anda tidak menggunakan fitur pembuatan aturan pengarahan permintaan bawaan untuk membuat aturan pengarahan permintaan untuk jalur lalu lintas. Hal ini karena layanan virtual kustom dapat bertentangan dengan aturan pengarahan permintaan yang dibuat menggunakan fitur pembuatan aturan pengarahan permintaan bawaan. Akibatnya, distribusi lalu lintas yang abnormal atau tidak terduga dapat terjadi.

Buat layanan virtual kustom di gateway ingress ASM

  1. Skenario dalam topik ini adalah contoh. Di sublangkah 3 Buat aturan pengarahan lalu lintas untuk tiga jalur dari Langkah 2, ubah langkah pembuatan aturan pengarahan lalu lintas menjadi langkah pembuatan layanan virtual menggunakan konten berikut. Untuk informasi lebih lanjut, lihat Kelola layanan virtual.

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: swimlane-ingress-vs-custom
      namespace: istio-system
    spec:
      gateways:
        - istio-system/ingressgateway
      hosts:
        - '*'
      http:
        - match: # Aturan pencocokan ini secara tepat mencocokkan header permintaan env: dev.
            - headers:
                env:
                  exact: dev
          name: dev-route
          route:
            - destination:
                host: mocka.default.svc.cluster.local # Layanan tujuan untuk penerusan lalu lintas.
                subset: s2 # Nama jalur lalu lintas.
              weight: 50
            - destination:
                host: mocka.default.svc.cluster.local # Layanan tujuan untuk penerusan lalu lintas.
                subset: s3 # Nama jalur lalu lintas.
              weight: 50
        - name: base-route
          route:
            - destination:
                host: mocka.default.svc.cluster.local # Layanan tujuan untuk penerusan lalu lintas.
                subset: s1 # Nama jalur lalu lintas.
  2. Jalankan perintah di Langkah 3: Verifikasi bahwa fitur rilis canary ujung ke ujung berfungsi. Output berikut dihasilkan saat Anda mengakses layanan di jalur s1, s2, dan s3:

    -> mocka(version: v1, ip: 192.168.0.50)-> mockb(version: v1, ip: 192.168.0.46)-> mockc(version: v1, ip: 192.168.0.48)

    Jalankan perintah berikut untuk memeriksa hasil saat Anda mengakses layanan di jalur s1 dengan header permintaan env: dev:

    for i in {1..100};  do curl -H 'x-asm-prefer-tag: s1' -H 'env: dev' http://${ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;

    Output yang diharapkan:

    Tampilkan output yang diharapkan

    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)

    Output menunjukkan bahwa ketika Anda mengakses layanan di jalur s1 dengan header permintaan env: dev, jejak yang berisi versi V2 dari layanan dan jejak yang berisi versi V3 dari layanan terlibat, dan rasio permintaan dalam dua jenis jejak tersebut sekitar 50:50. Artinya, permintaan dengan header permintaan env: dev dirutekan ke jalur s2 dan s3 dengan rasio 50:50, dan permintaan lainnya diteruskan ke jalur s1.

Layanan virtual sebelumnya menentukan aturan pengarahan kustom di gateway ASM untuk meneruskan lalu lintas ke jalur lalu lintas yang berbeda. Saat membuat layanan virtual kustom untuk merutekan permintaan dalam mode ketat, Anda hanya perlu mengatur bidang route.destination.subset ke nama jalur lalu lintas. Setelah permintaan dirutekan ke jalur lalu lintas, permintaan lain dalam jejak akan ditransmisikan di jalur tersebut.

Buat layanan virtual kustom pada proxy sidecar

Selain membuat layanan virtual kustom di gateway ingress ASM, Anda juga dapat menentukan aturan pengarahan permintaan untuk aplikasi dalam kluster untuk mengakses layanan di jalur lalu lintas dengan membuat layanan virtual pada semua proxy sidecar. Berbeda dengan layanan virtual kustom di gateway ingress ASM, bidang gateway tidak diperlukan untuk layanan virtual pada proxy sidecar. Anda perlu menentukan domain kluster layanan mocka di bidang hosts. Contoh file YAML:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: swimlane-ingress-vs-custom
  namespace: istio-system
spec:
  hosts:
    - mocka.default.svc.cluster.local
  http:
    - match: # Aturan pencocokan ini secara tepat mencocokkan header permintaan env: dev.
        - headers:
            env:
              exact: dev
      name: dev-route
      route:
        - destination:
            host: mocka.default.svc.cluster.local # Layanan tujuan untuk penerusan lalu lintas.
            subset: s2 # Nama jalur lalu lintas.
          weight: 50
        - destination:
            host: mocka.default.svc.cluster.local # Layanan tujuan untuk penerusan lalu lintas.
            subset: s3 # Nama jalur lalu lintas.
          weight: 50
    - name: base-route
      route:
        - destination:
            host: mocka.default.svc.cluster.local # Layanan tujuan untuk penerusan lalu lintas.
            subset: s1 # Nama jalur lalu lintas.
  1. Jalankan perintah berikut untuk mengakses layanan mocka tanpa header permintaan env: dev setelah Anda membuat layanan virtual kustom pada proxy sidecar:

    kubectl exec -it deploy/sleep -c sleep --  sh -c 'for i in $(seq 1 100);  do curl http://mocka:8000;  echo ""; sleep 1; done;'

    Output yang diharapkan:

    -> mocka(version: v1, ip: 192.168.0.50)-> mockb(version: v1, ip: 192.168.0.46)-> mockc(version: v1, ip: 192.168.0.48)

    Output menunjukkan bahwa ketika Anda mengakses layanan di semua jalur tanpa header permintaan env: dev, jejak yang berisi versi V1 dari layanan selalu terlibat. Ini menunjukkan bahwa semua lalu lintas dikirim ke jalur s1.

  2. Jalankan perintah berikut untuk mengakses layanan mocka dengan header permintaan env: dev setelah Anda membuat layanan virtual kustom pada proxy sidecar:

    kubectl exec -it deploy/sleep -c sleep --  sh -c 'for i in $(seq 1 100);  do curl -H "env: dev" http://mocka:8000;  echo ""; sleep 1; done;'

    Output yang diharapkan:

    Tampilkan output yang diharapkan dari mengakses layanan mocka

    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-&> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v2, ip: 192.168.0.47)-> mockb(version: v2, ip: 192.168.0.49)-> mockc(version: v2, ip: 192.168.0.43)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)
    -> mocka(version: v3, ip: 192.168.0.44)-> mockb(version: v3, ip: 192.168.0.42)-> mockc(version: v3, ip: 192.168.0.45)

    Outputnya sama dengan yang ada di Buat layanan virtual kustom pada gateway ingress ASM. Saat Anda mengakses layanan mocka dengan header permintaan env: dev, lalu lintas dirutekan ke jalur s2 dan s3 dengan rasio 50:50.

Mirip dengan Buat layanan virtual kustom pada gateway ingress ASM, ketika layanan dalam kluster memanggil layanan mocka dalam jalur lalu lintas, permintaan berikutnya dalam jejak selalu dirutekan ke jalur tersebut.

Referensi

  • Jalur lalu lintas memiliki dua mode: ketat dan permissif. Untuk informasi lebih lanjut tentang kedua mode dan perbedaan di antara mereka, lihat Ikhtisar jalur lalu lintas.

  • Jalur lalu lintas dalam mode permissif dapat digunakan dalam lebih banyak skenario saat menggunakan header permintaan pass-through ujung ke ujung. Misalnya, ketika hanya versi baru dari beberapa layanan dalam jejak yang dirilis, Anda dapat menggunakan jalur lalu lintas dalam mode permissif untuk menguji versi baru ini. Untuk informasi lebih lanjut, lihat Gunakan jalur lalu lintas dalam mode permissif untuk mengelola lalu lintas ujung ke ujung.

  • Anda dapat mengonfigurasi jalur lalu lintas dengan menentukan layanan virtual dan aturan tujuan. Anda juga dapat menggunakan aturan-aturan ini untuk mengonfigurasi pengalihan lalu lintas, yang merutekan lalu lintas ke versi dengan prioritas lebih rendah atau aplikasi dengan karakteristik tertentu ketika versi tujuan atau aplikasi tidak tersedia. Untuk informasi lebih lanjut, lihat Gunakan aturan lalu lintas untuk mengonfigurasi jalur lalu lintas dan pengalihan lalu lintas.