All Products
Search
Document Center

Alibaba Cloud Service Mesh:Label traffic

Last Updated:Mar 11, 2026

Saat layanan mikro berkomunikasi melalui mesh, Anda sering perlu mengarahkan permintaan tertentu ke versi layanan tertentu—misalnya untuk rilis canary, pengujian A/B, atau isolasi lingkungan. Pelabelan traffic di Alibaba Cloud Service Mesh (ASM) menyambungkan tag kustom ke permintaan saat melewati mesh, sehingga aturan routing arah hilir, kebijakan pembatasan kecepatan, dan pemutus sirkuit dapat bertindak berdasarkan tag tersebut.

ASM menyediakan CustomResourceDefinition (CRD) TrafficLabel untuk menentukan aturan pelabelan. Terapkan resource TrafficLabel ke namespace atau workload tertentu, dan ASM secara otomatis menyuntikkan logika pelabelan ke dalam filter proxy Envoy.

Kasus penggunaan

  • Rilis canary — Arahkan persentase traffic ke versi baru dengan mencocokkan nilai header.

  • Pengujian A/B — Bagi traffic antar varian menggunakan aturan routing berbasis label.

  • Isolasi lingkungan — Beri tag traffic sebagai staging atau production dan arahkan ke backend yang sesuai.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Instans ASM yang menjalankan versi 1.17 atau lebih baru

  • Kluster Kubernetes yang terkait dengan instans ASM Anda

  • kubectl yang dikonfigurasi untuk terhubung ke kluster

Catatan

ASM 1.17 memperkenalkan apiVersion: istio.alibabacloud.com/v1 untuk CRD TrafficLabel. Jika sebelumnya Anda mengonfigurasi TrafficLabel di kluster Container Service for Kubernetes (ACK) menggunakan apiVersion: istio.alibabacloud.com/v1beta1, ubah apiVersion menjadi istio.alibabacloud.com/v1 dan terapkan ulang resource tersebut. Untuk memperbarui instans ASM Anda, lihat Update an ASM instance. Untuk versi ASM yang lebih lama, submit a ticket untuk mendapatkan bantuan.

Cara kerja pelabelan traffic

Resource TrafficLabel menentukan dua hal:

  1. Lingkup — Workload mana yang akan diberi label (semua workload dalam namespace, atau subset yang dipilih berdasarkan label Pod).

  2. Aturan — Dari mana nilai label diambil (header permintaan, label Pod, atau konteks jejak).

Saat permintaan memasuki gerbang atau proxy sidecar, proxy mengevaluasi aturan TrafficLabel, menentukan nilai label, lalu menyambungkannya sebagai header baru pada permintaan arah keluar. Layanan arah hilir kemudian dapat mencocokkan header ini untuk pengambilan keputusan routing.

Ikhtisar struktur CRD

Kerangka berikut menunjukkan cara field TrafficLabel saling bersarang:

apiVersion: istio.alibabacloud.com/v1
kind: TrafficLabel
metadata:
  name: <label-name>              # Nama resource TrafficLabel ini
  namespace: <namespace>          # Namespace tempat resource ini berlaku
spec:
  workloadSelector:               # (Opsional) Abaikan untuk menerapkan ke semua workload di namespace
    labels:
      <key>: <value>              # Cocokkan workload berdasarkan label, contoh: app: productpage
  rules:
  - labels:
    - name: <traffic-label-name>  # Nama header untuk label (harus mengikuti aturan penamaan header HTTP)
      valueFrom:
      - <variable-1>             # Sumber utama nilai label
      - <variable-2>             # Cadangan jika variable-1 menghasilkan nilai kosong

Referensi field

Spec

FieldTypeWajibDeskripsi
workloadSelectorWorkloadSelectorTidakMemilih workload yang akan diberi label. Jika diabaikan, pelabelan berlaku untuk semua workload di namespace.
rulesTrafficLabelRule[]YaSatu atau beberapa aturan pelabelan.

WorkloadSelector

FieldTypeWajibDeskripsi
labelsmap<string, string>TidakPasangan kunci-nilai yang mencocokkan label workload.

TrafficLabelRule

FieldTypeWajibDeskripsi
labelsLabel[]YaLabel traffic yang akan disambungkan.

Label

FieldTypeWajibDeskripsi
namestringYaNama label traffic. Harus mematuhi konvensi penamaan header permintaan HTTP.
valueFromstring[]YaDaftar variabel terurut. Proxy mengevaluasinya secara berurutan dan menggunakan hasil pertama yang tidak kosong. Lihat valueFrom variables.

Variabel valueFrom

Field valueFrom menerima daftar variabel terurut. Proxy mengevaluasinya secara berurutan dan menggunakan hasil pertama yang tidak kosong sebagai nilai label.

Keempat variabel dibagi menjadi dua kelompok berdasarkan tempat penerapannya:

VariabelBerlaku untukSumber nilai label
$getInboundRequestHeader(headerName)Hanya GatewayHeader permintaan arah masuk di gerbang
$getExternalInboundRequestHeader(headerName, contextId)Hanya proxy sidecarHeader permintaan arah masuk, dikorelasikan sepanjang rantai panggilan melalui peta konteks
$getLocalOutboundRequestHeader(headerName)Hanya proxy sidecarHeader permintaan arah keluar yang ditetapkan oleh aplikasi
$getLabel(labelName)Gerbang dan proxy sidecarLabel Pod pada gerbang atau Pod beban kerja

Variabel gerbang

$getInboundRequestHeader(headerName)

Membaca header headerName dari permintaan arah masuk yang memasuki gerbang. Gerbang menambahkan header arah keluar baru menggunakan nama label yang ditentukan dalam CRD TrafficLabel sebagai kunci dan nilai yang diekstraksi sebagai nilainya.

Jika headerName dibiarkan kosong, gerbang secara default membaca x-asm-prefer-tag.

Aliran data:

Permintaan klien                    Gerbang                         Layanan hulu
     |                              |                                   |
     |-- headerName: tagValue ----->|                                   |
     |                              |-- userDefinedLabel: tagValue ---->|
     |                              |                                   |
Data flow for $getInboundRequestHeader

Variabel proxy sidecar

$getExternalInboundRequestHeader(headerName, contextId)

Membaca header headerName dari permintaan arah masuk yang memasuki proxy sidecar dan menyimpan nilainya dalam peta konteks internal yang dikunci oleh contextId. Peta ini bertahan selama 30 detik dalam memori Envoy.

Parameter (keduanya wajib):

ParameterDeskripsiContoh
headerNameKunci header permintaan yang akan dibaca.x-asm-prefer-tag
contextIdBidang header yang bertahan sepanjang rantai panggilan, digunakan untuk mengorelasikan traffic arah masuk dan arah keluar. Biasanya berupa ID jejak.x-request-id

Cara kerja peta konteks:

  1. Permintaan arah masuk tiba di sidecar. Proxy membaca headerName untuk mendapatkan tagValue dan menyimpan map<contextId, tagValue>.

  2. Saat aplikasi memulai permintaan arah keluar, proxy mencari contextId dalam peta konteks.

  3. Jika ditemukan kecocokan, proxy menambahkan dua header ke permintaan arah keluar:

    • headerName: tagValue

    • userDefinedLabel: tagValue (menggunakan nama label dari CRD TrafficLabel)

Aliran data:

Permintaan arah masuk       Proxy sidecar (peta konteks)          Permintaan arah keluar
     |                         |                                 |
     |-- headerName: tagValue  |                                 |
     |-- contextId: ctx123 --->| store: ctx123 -> tagValue       |
     |                         |                                 |
     |          Aplikasi memulai permintaan arah keluar                   |
     |                         |-- contextId: ctx123 ----------->|
     |                         |   (lookup: ctx123 -> tagValue)  |
     |                         |-- headerName: tagValue -------->|
     |                         |-- userDefinedLabel: tagValue -->|
Data flow for $getExternalInboundRequestHeader
Catatan
  • Peta konteks (map<contextId, tagValue>) disimpan dalam memori proxy Envoy selama 30 detik secara default.

  • Saat aplikasi Anda terhubung ke sistem pelacakan, gunakan ID jejak sebagai contextId. Sistem pelacakan yang berbeda menggunakan ID jejak yang berbeda. Untuk detailnya, lihat Tracing.

  • Aplikasi harus menyebarkan header HTTP yang relevan agar proxy Istio dapat mengorelasikan rentang menjadi jejak lengkap. Lihat Enable distributed tracing in ASM.

  • Jika aplikasi tidak menyebarkan contextId, proxy sidecar tidak dapat mencari nilai label dari peta konteks, sehingga permintaan arah keluar tidak akan diberi label.

$getLocalOutboundRequestHeader(headerName)

Membaca header headerName dari permintaan arah keluar yang dikirim aplikasi ke proxy sidecar. Proxy menambahkan header arah keluar baru menggunakan nama label dari CRD TrafficLabel sebagai kunci dan nilai yang diekstraksi sebagai nilainya.

Gunakan variabel ini ketika aplikasi itu sendiri menetapkan header pada permintaan arah keluarnya.

Aliran data:

Kontainer aplikasi          Proxy sidecar              Layanan hulu
     |                              |                          |
     |-- headerName: tagValue ----->|                          |
     |                              |-- userDefinedLabel: tagValue -->|
     |                              |                          |
Data flow for $getLocalOutboundRequestHeader

Variabel label Pod

$getLabel(labelName)

Membaca label labelName dari Pod gerbang atau Pod workload sidecar dan menambahkan nilainya ke traffic arah keluar. Jika labelName kosong, proxy secara default membaca label ASM_TRAFFIC_TAG.

Contoh: Jika Pod Penyebaran memiliki label ASM_TRAFFIC_TAG: test, variabel $getLabel(ASM_TRAFFIC_TAG) mengembalikan test.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: productpage-v1
  labels:
    app: productpage
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: productpage
      version: v1
  template:
    metadata:
      annotations:
        sidecar.istio.io/logLevel: debug
      labels:
        app: productpage
        version: v1
        ASM_TRAFFIC_TAG: test    # Nilai ini dibaca oleh $getLabel(ASM_TRAFFIC_TAG)
    spec:
      serviceAccountName: bookinfo-productpage
      containers:
      - name: productpage
        image: docker.io/istio/examples-bookinfo-productpage-v1:1.16.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
      volumes:
      - name: tmp
        emptyDir: {}

Label traffic untuk workload tertentu

Contoh ini memberi label traffic workload productpage. Nilai label ditentukan dari header permintaan arah masuk header1 (dikorelasikan oleh x-request-id), dengan cadangan berupa label Pod header2.

Kedua contoh pada halaman ini memerlukan ASM 1.17 atau lebih baru dan menggunakan aplikasi sampel Bookinfo.

  1. Deploy aplikasi Bookinfo. Lihat Deploy an application in an ASM instance.

  2. Simpan YAML berikut ke productpage-trafficlabel.yaml:

       apiVersion: istio.alibabacloud.com/v1
       kind: TrafficLabel
       metadata:
         name: productpage
         namespace: default
       spec:
         workloadSelector:
           labels:
             app: productpage          # Hanya berlaku untuk workload productpage
         rules:
         - labels:
           - name: asm-labels-test-a   # Nama header arah keluar untuk label
             valueFrom:
             - $getExternalInboundRequestHeader(header1, x-request-id)  # Utama: baca dari header arah masuk
             - $getLabel(header2)                                        # Cadangan: baca dari label Pod
  3. Terapkan resource tersebut:

       kubectl apply -n default -f productpage-trafficlabel.yaml
  4. Verifikasi bahwa filter Envoy telah disuntikkan ke proxy productpage: Cari filter com.aliyun.traffic_label di bawah dynamic_listeners atau http_filters:

       kubectl exec -it -n default deploy/productpage-v1 -c istio-proxy -- \
         curl localhost:15000/config_dump
       {
         "name": "com.aliyun.traffic_label",
         "typed_config": {
           "@type": "type.googleapis.com/envoy.config.filter.traffic_label.v3alpha.TrafficLabel",
           ...
         }
       }
  5. Konfirmasi bahwa workload yang tidak dipilih tidak terpengaruh. Jalankan pemeriksaan yang sama terhadap Pod details: Hasil kosong mengonfirmasi bahwa tidak ada filter pelabelan yang disuntikkan, sebagaimana diharapkan.

       kubectl exec -it -n default deploy/details-v1 -c istio-proxy -- \
         curl localhost:15000/config_dump | grep traffic_label

Label traffic di tingkat namespace

Abaikan workloadSelector untuk memberi label traffic semua workload dalam namespace. Contoh ini memberi label semua workload di namespace default.

  1. Simpan YAML berikut ke all-workload-for-ns-trafficlabel.yaml:

       apiVersion: istio.alibabacloud.com/v1
       kind: TrafficLabel
       metadata:
         name: all-workload-for-ns
         namespace: default
       spec:
         rules:                        # Tidak ada workloadSelector — berlaku untuk setiap workload di "default"
         - labels:
           - name: asm-labels-test-b
             valueFrom:
             - $getExternalInboundRequestHeader(header1, x-request-id)
             - $getLabel(header2)
  2. Terapkan resource tersebut:

       kubectl apply -n default -f all-workload-for-ns-trafficlabel.yaml
  3. Verifikasi bahwa filter pelabelan kini ada di semua workload. Periksa Pod details: Output yang diharapkan: Filter kini disuntikkan ke setiap workload di namespace.

       kubectl exec -it -n default deploy/details-v1 -c istio-proxy -- \
         curl localhost:15000/config_dump | grep traffic_label
       "@type": "type.googleapis.com/envoy.config.filter.traffic_label.v3alpha.TrafficLabel",

Topik terkait