全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Label Trafik

更新时间:Jul 02, 2025

Service Mesh (ASM) memungkinkan Anda mengonfigurasi label trafik untuk mengelola trafik berdasarkan label tersebut. Anda dapat merutekan trafik aplikasi dengan label tertentu ke layanan atau versi yang berbeda serta melakukan kontrol trafik seperti pemutusan sirkuit dan pembatasan berdasarkan label. ASM menambahkan CustomResourceDefinition (CRD) TrafficLabel, yang dapat digunakan untuk mendefinisikan logika label trafik dan mengonfigurasikannya untuk namespace dan workload. Topik ini menjelaskan cara mengonfigurasi label trafik, memberikan deskripsi bidang dalam CRD, serta menyertakan contoh konfigurasi.

Catatan Penggunaan

  • Instance ASM versi 1.17 atau lebih baru mendukung apiVersion: istio.alibabacloud.com/v1 dalam CRD TrafficLabel. Jika Anda telah mengonfigurasi TrafficLabel di kluster Container Service for Kubernetes (ACK), ubah apiVersion: istio.alibabacloud.com/v1beta1 menjadi apiVersion: istio.alibabacloud.com/v1, lalu konfigurasikan ulang TrafficLabel.

    Tampilkan kode YAML contoh untuk konfigurasi TrafficLabel dalam instance ASM versi 1.17

    apiVersion: istio.alibabacloud.com/v1
    kind: TrafficLabel
    metadata:
      name: example
      namespace: default
    spec:
      workloadSelector:
        labels:
          app: httpbin
      rules:
      - labels:
          - name: asm-labels-test-a
            valueFrom:
            - $getInboundRequestHeader(headerName)
            - $getExternalInboundRequestHeader(contextId, headerName) 
            - $getLocalOutboundRequestHeader(headerName)
            - $getLabel(labelName)  
  • Jika versi instance ASM Anda lebih lama dari 1.17, disarankan untuk memperbarui instance ASM ke versi 1.17 atau lebih baru, atau submit a ticket untuk mendapatkan dukungan teknis.

Deskripsi Bidang

Berikut adalah deskripsi bidang CRD dalam instance ASM versi 1.17 atau lebih baru.

Spec

Bidang

Tipe

Wajib

Deskripsi

workloadSelector

WorkloadSelector

Tidak

Menunjukkan rentang workload di mana pemilih menerapkan label trafik.

Jika bidang ini dibiarkan kosong, pemilih menerapkan label trafik ke semua workload dalam namespace saat ini.

rules

TrafficLabelRule[]

Ya

Mendefinisikan aturan untuk label trafik.

WorkloadSelector

Bidang

Tipe

Wajib

Deskripsi

labels

map<string, string>

Tidak

Label trafik yang diterapkan pada workload. Anda dapat mengonfigurasi satu atau lebih label.

TrafficLabelRule

Bidang

Tipe

Wajib

Deskripsi

labels

Label[]

Ya

Nama dan nilai label yang ingin Anda konfigurasikan.

Label

Bidang

Tipe

Wajib

Deskripsi

name

string

Ya

Nama label trafik. Nama harus sesuai dengan konvensi penamaan Header permintaan HTTP.

valueFrom

string[]

Ya

Nilai label trafik. Nilai diperoleh berdasarkan urutan variabel yang Anda tetapkan. Nilai label diprioritaskan diperoleh dari variabel pertama. Jika tidak tersedia, variabel kedua diperiksa. Jika nilai tidak ditemukan di variabel pertama dan kedua, variabel ketiga diperiksa. Terakhir, jika nilai tidak ditemukan di variabel pertama, kedua, dan ketiga, nilai diperoleh dari variabel keempat.

Untuk informasi lebih lanjut, lihat valueFrom.

valueFrom

Bidang valueFrom mendukung empat variabel berikut. Klik ikon perluasan di bawah tabel untuk melihat deskripsinya.

Variabel

Workload yang didukung

$getInboundRequestHeader(headerName)

Gateways

$getExternalInboundRequestHeader(headerName, contextId)

Proxy sidecar

$getLocalOutboundRequestHeader(headerName)

Proxy sidecar

$getLabel(labelName)

Gateways atau proxy sidecar

Tampilkan deskripsi $getInboundRequestHeader(headerName)

Variabel ini menunjukkan bahwa nilai header bernama headerName diperoleh dari permintaan masuk ke gateway. Nilai label trafik diambil dari header permintaan masuk. Parameter headerName adalah kunci header permintaan. Jika parameter ini dibiarkan kosong, secara default digunakan x-asm-prefer-tag.

Seperti yang ditunjukkan pada gambar berikut, ingress gateway menambahkan header permintaan baru ke permintaan keluar. Nama header permintaan adalah nama label (misalnya, userDefinedLabel) yang didefinisikan dalam CRD TrafficLabel, dan nilainya adalah tagValue.$getInboundRequestHeader(headerName)..png

Catatan

Variabel ini hanya berlaku untuk gateway dan tidak berlaku untuk proxy sidecar.

Tampilkan deskripsi $getExternalInboundRequestHeader(headerName, contextId)

Variabel ini menunjukkan bahwa nilai header bernama headerName diperoleh dari permintaan masuk ke proxy sidecar. Nilai label trafik diambil dari konteks permintaan trafik. Variabel ini mencakup parameter berikut:

  • headerName: kunci header permintaan. Nilai parameter ini wajib, seperti x-asm-prefer-tag.

  • contextId: bidang header permintaan yang berjalan sepanjang rantai panggilan. Nilainya bisa berupa header permintaan masuk yang ditentukan atau ID jejak dalam sistem pelacakan. Parameter ini wajib dan tidak boleh dibiarkan kosong.

Proxy sidecar melibatkan trafik masuk dan keluar. Pelabelan trafik dilakukan untuk melabeli trafik keluar. Secara default, proxy sidecar memperoleh nilai dari header permintaan masuk bernama headerName dan menggunakan nilai ini sebagai nilai label tagValue untuk trafik.$getExternalInboundRequestHeader(headerName, contextId)..png

Untuk menambahkan tagValue ke permintaan keluar, proxy sidecar menyimpan map<contextId, tagValue> secara internal. contextId adalah bidang header permintaan yang berjalan sepanjang rantai panggilan. Nilainya bisa berupa header permintaan masuk yang ditentukan atau x-request-id.

Ketika kontainer aplikasi memulai permintaan keluar, proxy sidecar mencari peta konteks menggunakan contextId. Jika tagValue terkait ditemukan, proxy sidecar menambahkan dua header permintaan berikut ke permintaan keluar:

  • Nama salah satu header permintaan adalah headerName, dan nilainya adalah tagValue.

  • Nama header permintaan lainnya adalah nama label (misalnya, userDefinedLabel) yang didefinisikan dalam CRD TrafficLabel, dan nilainya adalah tagValue.

Catatan
  • Variabel ini hanya berlaku untuk proxy sidecar dan tidak berlaku untuk gateway.

  • Secara default, map<contextId, tagValue> disimpan dalam memori proxy Envoy selama 30 detik.

  • Ketika aplikasi terhubung ke sistem pelacakan, ID jejak digunakan dalam permintaan sepanjang rantai panggilan. Oleh karena itu, Anda dapat menggunakan ID jejak sebagai contextId. Sistem pelacakan yang berbeda menggunakan ID jejak yang berbeda. Untuk informasi lebih lanjut, lihat Tracing.

  • Meskipun proxy Istio dapat secara otomatis mengirim rentang pelacakan, mereka membutuhkan beberapa petunjuk untuk mengikat seluruh jejak bersama-sama. Aplikasi perlu menyebarkan header HTTP yang relevan sehingga rentang yang dikirim oleh proxy Istio dapat dikorelasikan dengan benar menjadi satu jejak. Untuk informasi lebih lanjut, lihat Aktifkan pelacakan terdistribusi di ASM.

  • Jika header HTTP yang sesuai tidak disebarkan, trafik keluar tidak dapat dikaitkan dengan contextId. Lalu, proxy sidecar tidak dapat memperoleh nilai label trafik yang sesuai dari map<contextId,tagValue>.

Tampilkan deskripsi $getLocalOutboundRequestHeader(headerName)

Variabel ini menunjukkan bahwa nilai header bernama headerName diperoleh dari permintaan yang dikirim aplikasi ke proxy sidecar. Nilai label trafik diambil dari header permintaan masuk. Parameter headerName adalah kunci header permintaan. Anda dapat menentukan parameter ini berdasarkan header permintaan aktual dari kontainer aplikasi.

Seperti yang ditunjukkan pada gambar berikut, ketika kontainer aplikasi tempat proxy sidecar disuntikkan memulai permintaan keluar, proxy sidecar menambahkan header permintaan ke permintaan keluar. Nama header permintaan adalah nama label (misalnya, userDefinedLabel) yang didefinisikan dalam CRD TrafficLabel, dan nilainya adalah tagValue.$getLocalOutboundRequestHeader(headerName)..png

Catatan

Variabel ini hanya berlaku untuk proxy sidecar dan tidak berlaku untuk gateway.

Tampilkan deskripsi $getLabel(labelName)

Variabel ini menunjukkan bahwa nilai label bernama labelName diperoleh dari pod gateway atau pod kontainer sidecar, dan nilainya ditambahkan ke trafik keluar. Jika labelName dibiarkan kosong, variabel ini memperoleh nilai label ASM_TRAFFIC_TAG dari pod workload secara default.

Dalam contoh berikut, nilai ASM_TRAFFIC_TAG dari workload adalah test. Anda dapat menggunakan variabel $getLabel(ASM_TRAFFIC_TAG) untuk memperoleh nilai test.

Tampilkan kode YAML contoh

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
    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: {}

Contoh Konfigurasi

Dalam contoh berikut, instance ASM adalah versi 1.17 atau lebih baru. Untuk informasi lebih lanjut tentang cara memperbarui instance ASM, lihat Perbarui instance ASM.

Contoh 1: Label trafik untuk workload

Anda dapat mendefinisikan workloadSelector untuk memilih workload berdasarkan label dan melabeli trafik workload dalam namespace.

  1. Sebarkan aplikasi Bookinfo. Untuk informasi lebih lanjut, lihat Sebarkan aplikasi dalam kluster ACK yang ditambahkan ke instance ASM.

  2. Buat file bernama productpage-trafficlabel.yaml dan salin konten berikut ke file:

    apiVersion: istio.alibabacloud.com/v1
    kind: TrafficLabel
    metadata:
      name: productpage
      namespace: default
    spec:
      workloadSelector:
        labels:
          app: productpage
      rules:
      - labels:
          - name: asm-labels-test-a
            valueFrom:
            - $getExternalInboundRequestHeader(header1, x-request-id)
            - $getLabel(header2)
  3. Jalankan perintah berikut untuk melabeli trafik workload productpage:

     kubectl apply -n default  -f productpage-trafficlabel.yaml
  4. Jalankan perintah berikut untuk melihat konfigurasi proxy dari workload productpage:

    kubectl exec -it -n default deploy/productpage-v1 -c istio-proxy -- curl localhost:15000/config_dump

    Output yang Diharapkan:

    {
                  "name": "com.aliyun.traffic_label",
                  "typed_config": {
                   "@type": "type.googleapis.com/envoy.config.filter.traffic_label.v3alpha.TrafficLabel",
                   
                  }
                 },

    Anda dapat melihat konfigurasi filter di atas dalam type.googleapis.com/envoy.config.listener.v3.Listener/envoy.filters.network.http_connection_manager/http_filters di bawah Listener Config (type.googleapis.com/envoy.admin.v3.ListenersConfigDump) atau dynamic_listeners. Ini menunjukkan bahwa label trafik telah dikonfigurasi.

  5. Jalankan perintah berikut untuk melihat konfigurasi proxy dari workload lain, seperti pod details:

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

    Hasil yang dikembalikan kosong, menunjukkan bahwa tidak ada filter yang relevan. Hasil ini sesuai dengan harapan.

Contoh 2: Label trafik di tingkat namespace

Jika Anda membiarkan bidang workloadSelector kosong, label ditambahkan ke trafik semua workload dalam namespace. Contoh berikut melabeli trafik semua workload dalam namespace default.

  1. Buat file bernama all-workload-for-ns-trafficlabel.yaml dan salin konten berikut ke file:

    apiVersion: istio.alibabacloud.com/v1
    kind: TrafficLabel
    metadata:
      name: all-workload-for-ns
      namespace: default
    spec:
      rules:
      - labels:
          - name: asm-labels-test-b
            valueFrom:
            - $getExternalInboundRequestHeader(header1, x-request-id)
            - $getLabel(header2)
  2. Jalankan perintah berikut untuk melabeli trafik semua workload dalam namespace default:

     kubectl apply -n default -f all-workload-for-ns-trafficlabel.yaml

  3. Jalankan perintah berikut untuk melihat konfigurasi proxy dari workload, seperti pod details:

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

    Output yang Diharapkan:

     "@type": "type.googleapis.com/envoy.config.filter.traffic_label.v3alpha.TrafficLabel",

    Output di atas menunjukkan bahwa label trafik telah dikonfigurasi.