全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Konfigurasikan jalur lalu lintas dalam mode longgar dengan ASMHeaderPropagation

更新时间:Mar 12, 2026

Jalur lalu lintas mengarahkan permintaan ke versi layanan tertentu di seluruh rantai panggilan. Misalnya, semua permintaan yang diberi tag v2 mencapai instans v2 dari setiap layanan dalam rantai tersebut. Dalam mode longgar, jika versi yang sesuai tidak tersedia untuk suatu layanan tertentu, lalu lintas secara otomatis dialihkan ke versi garis dasar (baseline) alih-alih gagal. Pendekatan ini memungkinkan rilis canary dan pengujian berbasis versi yang aman pada arsitektur multi-layanan tanpa mewajibkan setiap layanan memiliki semua versi yang dideploy.

Cara kerja

Empat jenis resource bekerja sama untuk mengimplementasikan jalur lalu lintas:

ResourcePeran
OpenTelemetry InstrumentationSecara otomatis menyebarkan header baggage di seluruh panggilan layanan tanpa perubahan kode
ASMHeaderPropagationCRD khusus ASM yang mengekstrak header tertentu (seperti version) dari konteks baggage dan melampirkannya sebagai header permintaan di seluruh rantai panggilan
DestinationRuleMenentukan subset layanan (v1, v2, v3) berdasarkan label pod
VirtualServiceMengarahkan permintaan ke subset yang benar dengan mencocokkan header version yang disebarkan, dengan fallback ke subset garis dasar ketika versi target tidak memiliki titik akhir yang sehat

Alur lalu lintas:

baggage: userId=alice,serverNode=DF%2028,isProduction=false
Field fallback yang digunakan dalam rute VirtualService merupakan ekstensi khusus ASM terhadap API Istio VirtualService standar. Field ini dipicu ketika subset target tidak memiliki titik akhir yang sehat, sehingga lalu lintas dialihkan ke subset fallback yang ditentukan alih-alih mengembalikan error. Field ini tidak tersedia di Istio upstream.

Header baggage

Baggage adalah mekanisme OpenTelemetry untuk menyebarkan konteks pasangan kunci-nilai (key-value) di seluruh proses dalam jejak terdistribusi (distributed trace). Mekanisme ini menggunakan header HTTP:

baggage: userId=alice,serverNode=DF%2028,isProduction=false

Header baggage membawa data konteks seperti ID penyewa, ID jejak, dan kredensial keamanan, memungkinkan analisis jejak dan korelasi log tanpa modifikasi kode.

Untuk informasi lebih lanjut tentang jalur lalu lintas, lihat Ikhtisar jalur lalu lintas.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

Langkah 1: Deploy Operator OpenTelemetry dan konfigurasikan auto-instrumentasi

Operator OpenTelemetry secara otomatis menginstrumentasi pod layanan untuk menyebarkan header baggage di seluruh panggilan tanpa perubahan kode.

Deploy Operator OpenTelemetry

  1. Sambungkan ke kluster Kubernetes dengan kubectl. Buat namespace opentelemetry-operator-system:

    kubectl create namespace opentelemetry-operator-system
  2. Instal Operator OpenTelemetry dengan Helm:

    helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
    helm install  \
        --namespace=opentelemetry-operator-system \
        --version=0.46.0 \
        --set admissionWebhooks.certManager.enabled=false \
        --set admissionWebhooks.certManager.autoGenerateCert=true \
        --set manager.image.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/opentelemetry-operator" \
        --set manager.image.tag="0.92.1" \
        --set kubeRBACProxy.image.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/kube-rbac-proxy" \
        --set kubeRBACProxy.image.tag="v0.13.1" \
        --set manager.collectorImage.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/opentelemetry-collector" \
        --set manager.collectorImage.tag="0.97.0" \
        --set manager.opampBridgeImage.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/operator-opamp-bridge" \
        --set manager.opampBridgeImage.tag="0.97.0" \
        --set manager.targetAllocatorImage.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/target-allocator" \
        --set manager.targetAllocatorImage.tag="0.97.0" \
        --set manager.autoInstrumentationImage.java.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/autoinstrumentation-java" \
        --set manager.autoInstrumentationImage.java.tag="1.32.1" \
        --set manager.autoInstrumentationImage.nodejs.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/autoinstrumentation-nodejs" \
        --set manager.autoInstrumentationImage.nodejs.tag="0.49.1" \
        --set manager.autoInstrumentationImage.python.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/autoinstrumentation-python" \
        --set manager.autoInstrumentationImage.python.tag="0.44b0" \
        --set manager.autoInstrumentationImage.dotnet.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/autoinstrumentation-dotnet" \
        --set manager.autoInstrumentationImage.dotnet.tag="1.2.0" \
        --set manager.autoInstrumentationImage.go.repository="registry-cn-hangzhou.ack.aliyuncs.com/acs/opentelemetry-go-instrumentation" \
        --set manager.autoInstrumentationImage.go.tag="v0.10.1.alpha-2-aliyun" \
        opentelemetry-operator open-telemetry/opentelemetry-operator
  3. Verifikasi bahwa pod operator sedang berjalan: Output yang diharapkan:

    kubectl get pod -n opentelemetry-operator-system
    NAME                                      READY   STATUS    RESTARTS   AGE
    opentelemetry-operator-854fb558b5-pvllj   2/2     Running   0          1m

Konfigurasikan auto-instrumentasi

Buat file instrumentation.yaml untuk mendeklarasikan propagator baggage. Pilih konfigurasi berdasarkan apakah OpenTelemetry Collector telah dideploy di lingkungan Anda.

Tanpa OpenTelemetry Collector — Menonaktifkan ekspor metrik dan pelacakan (tracing) untuk menghindari error saat tidak tersedia titik akhir collector:

apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: demo-instrumentation
spec:
  env:
  - name: OTEL_METRICS_EXPORTER
    value: none
  propagators:
  - baggage
  sampler:
    argument: "1"
    type: always_off

Dengan OpenTelemetry Collector — Mengaktifkan pelacakan penuh dengan sampling berbasis induk (parent-based):

apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: demo-instrumentation
spec:
  propagators:
    - baggage
  sampler:
    type: parentbased_traceidratio
    argument: "1"

Terapkan resource instrumentasi ke namespace default:

kubectl apply -f instrumentation.yaml
Men-deploy OpenTelemetry Collector untuk mengumpulkan data observabilitas merupakan praktik terbaik. Untuk detail tentang pengumpulan data tracing ASM, lihat Kumpulkan data tracing ASM ke Managed Service for OpenTelemetry.

Langkah 2: Deploy layanan contoh

Langkah ini mendeploy tiga layanan — mocka, mockb, dan mockc — masing-masing dengan tiga versi (v1, v2, v3). Layanan-layanan ini membentuk rantai panggilan: mocka -> mockb -> mockc. Setiap pod diberi anotasi untuk auto-instrumentasi Java, sehingga header baggage disebarkan secara otomatis.

  1. Aktifkan injeksi proxy sidecar otomatis untuk namespace default. Lihat Kelola namespace global.

    Untuk informasi lebih lanjut tentang injeksi sidecar, lihat Aktifkan injeksi proxy sidecar otomatis.
  2. Buat file mock.yaml dengan konten berikut.

    Tampilkan mock.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: mocka
      labels:
        app: mocka
        service: mocka
    spec:
      ports:
      - port: 8000
        name: http
      selector:
        app: mocka
    ---
    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
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v1
            - name: app
              value: mocka
            - name: upstream_url
              value: "http://mockb:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mockb
      labels:
        app: mockb
        service: mockb
    spec:
      ports:
      - port: 8000
        name: http
      selector:
        app: mockb
    ---
    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
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v1
            - name: app
              value: mockb
            - name: upstream_url
              value: "http://mockc:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mockc
      labels:
        app: mockc
        service: mockc
    spec:
      ports:
      - port: 8000
        name: http
      selector:
        app: mockc
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockc-v1
      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
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v1
            - name: app
              value: mockc
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mocka-v2
      labels:
        app: mocka
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mocka
          version: v2
          ASM_TRAFFIC_TAG: v2
      template:
        metadata:
          labels:
            app: mocka
            version: v2
            ASM_TRAFFIC_TAG: v2
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v2
            - name: app
              value: mocka
            - name: upstream_url
              value: "http://mockb:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockb-v2
      labels:
        app: mockb
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockb
          version: v2
          ASM_TRAFFIC_TAG: v2
      template:
        metadata:
          labels:
            app: mockb
            version: v2
            ASM_TRAFFIC_TAG: v2
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v2
            - name: app
              value: mockb
            - name: upstream_url
              value: "http://mockc:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockc-v2
      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
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v2
            - name: app
              value: mockc
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mocka-v3
      labels:
        app: mocka
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mocka
          version: v3
          ASM_TRAFFIC_TAG: v3
      template:
        metadata:
          labels:
            app: mocka
            version: v3
            ASM_TRAFFIC_TAG: v3
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v3
            - name: app
              value: mocka
            - name: upstream_url
              value: "http://mockb:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockb-v3
      labels:
        app: mockb
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockb
          version: v3
          ASM_TRAFFIC_TAG: v3
      template:
        metadata:
          labels:
            app: mockb
            version: v3
            ASM_TRAFFIC_TAG: v3
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v3
            - name: app
              value: mockb
            - name: upstream_url
              value: "http://mockc:8000/"
            ports:
            - containerPort: 8000
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mockc-v3
      labels:
        app: mockc
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mockc
          version: v3
          ASM_TRAFFIC_TAG: v3
      template:
        metadata:
          labels:
            app: mockc
            version: v3
            ASM_TRAFFIC_TAG: v3
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/container-names: "default"
        spec:
          containers:
          - name: default
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-mock:v0.1-java
            imagePullPolicy: IfNotPresent
            env:
            - name: version
              value: v3
            - name: app
              value: mockc
            ports:
            - containerPort: 8000

    Poin penting mengenai manifes YAML:

    KonfigurasiTujuan
    Label ASM_TRAFFIC_TAGMemberi tag setiap pod dengan versinya (v1, v2, atau v3) untuk routing jalur lalu lintas
    instrumentation.opentelemetry.io/inject-java: "true"Memicu auto-instrumentasi OpenTelemetry untuk kontainer Java
    instrumentation.opentelemetry.io/container-names: "default"Menentukan kontainer mana yang akan diinstrumentasi
    Variabel lingkungan upstream_urlMenentukan rantai panggilan: mocka -> mockb -> mockc
  3. Deploy layanan: Dengan auto-instrumentasi yang telah diterapkan, pod secara otomatis menyebarkan header baggage di seluruh rantai panggilan.

    kubectl apply -f mock.yaml

Langkah 3: Buat aturan routing untuk jalur lalu lintas

Langkah ini membuat destination rule, CRD ASMHeaderPropagation, virtual service, dan aturan gerbang masuk. Bersama-sama, resource ini mengarahkan permintaan ke versi layanan yang benar berdasarkan header version yang disebarkan, dengan fallback ke v1 ketika versi tersebut tidak tersedia.

Buat destination rule

Destination rule menentukan subset layanan berdasarkan label pod. Tidak semua layanan memiliki ketiga versi tersebut — hal ini sengaja dilakukan untuk menunjukkan perilaku fallback mode longgar.

LayananSubset yang tersedia
mockav1, v2, v3
mockbv1, v3
mockcv1, v2
  1. Buat file dr-mock.yaml dengan konten berikut.

    Tampilkan dr-mock.yaml

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: dr-mock-default-mocka
    spec:
      host: mocka.default.svc.cluster.local
      subsets:
        - labels:
            version: v1
          name: v1
        - labels:
            version: v2
          name: v2
        - labels:
            version: v3
          name: v3
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: dr-mock-default-mockb
    spec:
      host: mockb.default.svc.cluster.local
      subsets:
        - labels:
            version: v1
          name: v1
        - labels:
            version: v3
          name: v3
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: dr-mock-default-mockc
    spec:
      host: mockc.default.svc.cluster.local
      subsets:
        - labels:
            version: v1
          name: v1
        - labels:
            version: v2
          name: v2
  2. Sambungkan ke instans ASM dengan kubectl dan terapkan destination rule:

    kubectl apply -f dr-mock.yaml

Buat CRD ASMHeaderPropagation

CRD ASMHeaderPropagation memberi tahu ASM header mana yang harus diekstrak dari konteks baggage dan disebarkan di seluruh rantai panggilan. Dalam contoh ini, header version diekstrak agar layanan downstream menerima konteks routing yang benar.

  1. Buat file propagation.yaml:

    FieldDeskripsi
    apiVersionistio.alibabacloud.com/v1beta1 — grup API khusus ASM
    kindASMHeaderPropagation — CRD untuk propagasi header dari konteks baggage
    spec.headersDaftar nama header yang akan diekstrak dari baggage dan disebarkan sebagai header permintaan
    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMHeaderPropagation
    metadata:
      name: version-propagation
    spec:
      headers:
        - version
  2. Sambungkan ke instans ASM dengan kubectl dan terapkan CRD:

    kubectl apply -f propagation.yaml

Buat virtual service

Virtual service mengarahkan permintaan ke subset yang benar dengan mencocokkan header version. Setiap aturan mencakup target fallback yang mengarah ke v1 (versi garis dasar). Dalam mode longgar, ketika permintaan menargetkan versi yang tidak tersedia (misalnya, mockb tidak memiliki v2), ASM mengarahkan lalu lintas ke subset fallback alih-alih mengembalikan error.

  1. Buat file vs-mock.yaml dengan konten berikut.

    Tampilkan vs-mock.yaml

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-mock-default-mocka
    spec:
      hosts:
        - mocka.default.svc.cluster.local
      http:
        - match:
            - headers:
                version:
                  exact: v1
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: v1
              fallback:
                target:
                  host: mocka.default.svc.cluster.local
                  subset: v1
        - match:
            - headers:
                version:
                  exact: v2
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: v2
              fallback:
                target:
                  host: mocka.default.svc.cluster.local
                  subset: v1
        - match:
            - headers:
                version:
                  exact: v3
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: v3
              fallback:
                target:
                  host: mocka.default.svc.cluster.local
                  subset: v1
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-mock-default-mockb
    spec:
      hosts:
        - mockb.default.svc.cluster.local
      http:
        - match:
            - headers:
                version:
                  exact: v1
          route:
            - destination:
                host: mockb.default.svc.cluster.local
                subset: v1
              fallback:
                target:
                  host: mockb.default.svc.cluster.local
                  subset: v1
        - match:
            - headers:
                version:
                  exact: v2
          route:
            - destination:
                host: mockb.default.svc.cluster.local
                subset: v2
              fallback:
                target:
                  host: mockb.default.svc.cluster.local
                  subset: v1
        - match:
            - headers:
                version:
                  exact: v3
          route:
            - destination:
                host: mockb.default.svc.cluster.local
                subset: v3
              fallback:
                target:
                  host: mockb.default.svc.cluster.local
                  subset: v1
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-mock-default-mockc
    spec:
      hosts:
        - mockc.default.svc.cluster.local
      http:
        - match:
            - headers:
                version:
                  exact: v1
          route:
            - destination:
                host: mockc.default.svc.cluster.local
                subset: v1
              fallback:
                target:
                  host: mockc.default.svc.cluster.local
                  subset: v1
        - match:
            - headers:
                version:
                  exact: v2
          route:
            - destination:
                host: mockc.default.svc.cluster.local
                subset: v2
              fallback:
                target:
                  host: mockc.default.svc.cluster.local
                  subset: v1
        - match:
            - headers:
                version:
                  exact: v3
          route:
            - destination:
                host: mockc.default.svc.cluster.local
                subset: v3
              fallback:
                target:
                  host: mockc.default.svc.cluster.local
                  subset: v1

    Pola routing untuk setiap layanan mengikuti struktur berikut:

    # Untuk setiap pencocokan versi, tentukan destinasi utama dan fallback
    - match:
        - headers:
            version:
              exact: v2        # Cocokkan header version yang disebarkan
      route:
        - destination:
            host: <service>.default.svc.cluster.local
            subset: v2         # Utama: arahkan ke versi yang cocok
          fallback:
            target:
              host: <service>.default.svc.cluster.local
              subset: v1       # Fallback: arahkan ke garis dasar jika v2 tidak memiliki titik akhir yang sehat
  2. Sambungkan ke instans ASM dengan kubectl dan terapkan virtual service:

    kubectl apply -f vs-mock.yaml

Buat aturan gerbang masuk

Gerbang masuk mendistribusikan lalu lintas masuk ke berbagai versi layanan berdasarkan bobot dan menetapkan header version pada setiap permintaan agar sesuai dengan versi target.

  1. Buat file gw-mock.yaml dengan konten berikut.

    Tampilkan gw-mock.yaml

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: mockgw
      namespace: default
    spec:
      selector:
        istio: ingressgateway
      servers:
        - hosts:
            - '*'
          port:
            name: http
            number: 80
            protocol: HTTP
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: swimlane-ingress-vs-weighted-mock
      namespace: default
    spec:
      gateways:
        - default/mockgw
      hosts:
        - '*'
      http:
        - name: mock-weighted
          route:
            - destination:
                host: mocka.default.svc.cluster.local
                subset: v1
              headers:
                request:
                  set:
                    version: v1
              weight: 40
            - destination:
                host: mocka.default.svc.cluster.local
                subset: v2
              headers:
                request:
                  set:
                    version: v2
              weight: 30
            - destination:
                host: mocka.default.svc.cluster.local
                subset: v3
              headers:
                request:
                  set:
                    version: v3
              weight: 30

    Konfigurasi ini mendistribusikan lalu lintas ke v1, v2, dan v3 dari mocka dengan rasio 40:30:30. Untuk setiap permintaan, gerbang menetapkan header version ke versi target sehingga layanan downstream dalam rantai panggilan menerima konteks routing yang benar melalui propagasi baggage.

  2. Sambungkan ke instans ASM dengan kubectl dan terapkan aturan gerbang:

    kubectl apply -f gw-mock.yaml

Langkah 4: Verifikasi routing jalur lalu lintas

  1. Dapatkan Alamat IP publik gerbang masuk. Lihat Dapatkan alamat IP gerbang masuk ASM.

  2. Tetapkan IP gerbang sebagai variabel lingkungan: Ganti <gateway-ip> dengan alamat IP yang sebenarnya.

    export ASM_GATEWAY_IP=<gateway-ip>
  3. Kirim permintaan berulang untuk mengamati distribusi lalu lintas: Output contoh:

    for i in {1..100}; do curl http://${ASM_GATEWAY_IP}; echo ''; sleep 1; done
    -> mocka(version: v1, ip: 192.168.1.27)-> mockb(version: v1, ip: 192.168.1.30)-> mockc(version: v1, ip: 192.168.1.14)
    -> mocka(version: v2, ip: 192.168.1.28)-> mockb(version: v1, ip: 192.168.1.30)-> mockc(version: v2, ip: 192.168.1.1)
    -> mocka(version: v3, ip: 192.168.1.26)-> mockb(version: v3, ip: 192.168.1.29)-> mockc(version: v1, ip: 192.168.1.14)
  4. Verifikasi hasilnya. Output tersebut mengonfirmasi dua perilaku: Distribusi berbasis bobot: Lalu lintas terbagi di antara v1, v2, dan v3 dengan rasio sekitar 40:30:30. Fallback mode longgar: Ketika suatu versi tidak tersedia untuk layanan tertentu, lalu lintas dialihkan ke v1:

    • Jalur v2: mocka-v2 -> mockb-v1 (tidak ada mockb-v2, sehingga lalu lintas dialihkan ke v1) -> mockc-v2

    • Jalur v3: mocka-v3 -> mockb-v3 -> mockc-v1 (tidak ada mockc-v3, sehingga lalu lintas dialihkan ke v1)

    Jalurmockamockbmockc
    v1v1v1v1
    v2v2v1 (tidak ada v2, fallback)v2
    v3v3v3v1 (tidak ada v3, fallback)