Tüm Ürünler
Search
Belge Merkezi

Alibaba Cloud Service Mesh:Label traffic

Son Güncelleme:Oct 07, 2026

Mikro hizmetler bir ağ üzerinde iletişim kurduğunda, canary sürümleri, A/B testleri veya ortam izolasyonu gibi durumlarda belirli istekleri belirli hizmet sürümlerine yönlendirmeniz gerekebilir. Alibaba Cloud Service Mesh (ASM) içindeki trafik etiketleme, istekler ağ üzerinden akarken bunlara özel etiketler ekler. Bu sayede aşağı akıştaki yönlendirme kuralları, kısıtlama ilkeleri ve devre kesiciler bu etiketlere göre işlem yapabilir.

ASM, etiketleme kurallarını tanımlamak için TrafficLabel CustomResourceDefinition (CRD) kaynağını sunar. Bir TrafficLabel kaynağını bir ad alanına veya belirli bir iş yüküne uyguladığınızda ASM, etiketleme mantığını otomatik olarak Envoy proxy filtrelerine enjekte eder.

Kullanım senaryoları

  • Canary sürümleri -- Bir başlık değerini eşleştirerek trafiğin bir yüzdesini yeni bir sürüme yönlendirin.

  • A/B testi -- Etiket tabanlı yönlendirme kurallarını kullanarak varyantlar arasında trafiği bölün.

  • Ortam izolasyonu -- Trafiği staging veya production olarak etiketleyin ve ilgili arka uçlara yönlendirin.

Ön koşullar

Başlamadan önce şunlara sahip olduğunuzdan emin olun:

  • 1,17 veya sonraki bir sürümü çalışan bir ASM örneği

  • ASM örneğinizle ilişkili bir Kubernetes kümesi

  • Kümeye bağlanacak şekilde yapılandırılmış kubectl

Not

ASM 1.17, TrafficLabel CRD için apiVersion: istio.alibabacloud.com/v1 sürümünü tanıttı. Daha önce Container Service for Kubernetes (ACK) kümesinde TrafficLabel'ı apiVersion: istio.alibabacloud.com/v1beta1 ile yapılandırdıysanız apiVersion değerini istio.alibabacloud.com/v1 olarak değiştirin ve kaynağı yeniden uygulayın. ASM örneğinizi güncellemek için bkz. ASM örneğini güncelleme. Daha eski ASM sürümleri için yardım almak üzere destek talebi oluşturun.

Trafik etiketlemenin çalışma biçimi

Bir TrafficLabel kaynağı iki unsuru tanımlar:

  1. Kapsam -- Hangi iş yüklerinin etiketleneceği (bir ad alanındaki tüm iş yükleri veya pod etiketleriyle seçilen bir alt küme).

  2. Kurallar -- Etiket değerinin nereden alınacağı (istek başlıkları, pod etiketleri veya izlem bağlamı).

Bir istek bir ağ geçidine veya sidecar proxy'sine girdiğinde proxy, TrafficLabel kurallarını değerlendirir, bir etiket değeri çözümler ve bunu giden isteklere yeni bir başlık olarak ekler. Aşağı akış hizmetleri daha sonra yönlendirme kararları için bu başlığı eşleştirebilir.

CRD yapısına genel bakış

Aşağıdaki iskelet, TrafficLabel alanlarının nasıl iç içe geçtiğini gösterir:

apiVersion: istio.alibabacloud.com/v1
kind: TrafficLabel
metadata:
  name: <label-name>              # Name of this TrafficLabel resource
  namespace: <namespace>          # Namespace where this resource applies
spec:
  workloadSelector:               # (Optional) Omit to apply to all workloads in the namespace
    labels:
      <key>: <value>              # Match workloads by label, e.g., app: productpage
  rules:
  - labels:
    - name: <traffic-label-name>  # Header name for the label (must follow HTTP header naming rules)
      valueFrom:
      - <variable-1>             # Primary source for the label value
      - <variable-2>             # Fallback if variable-1 returns empty

Alan referansı

Spec

Alan Tür Gerekli Açıklama
workloadSelector WorkloadSelector Hayır Etiketlenecek iş yüklerini seçer. Atlanırsa etiketleme, ad alanındaki tüm iş yüklerine uygulanır.
rules TrafficLabelRule[] Evet Bir veya daha fazla etiketleme kuralı.

WorkloadSelector

Alan Tür Gerekli Açıklama
labels map Hayır İş yükü etiketlerini eşleştiren anahtar-değer çiftleri.

TrafficLabelRule

Alan Tür Gerekli Açıklama
labels Label[] Evet Eklenecek trafik etiketleri.

Label

Alan Tür Gerekli Açıklama
name string Evet Trafik etiketi adı. HTTP istek başlığı adlandırma kurallarına uygun olmalıdır.
valueFrom string[] Evet Sıralı bir değişken listesi. Proxy bunları sırayla değerlendirir ve ilk boş olmayan sonucu kullanır. Bkz. valueFrom değişkenleri.

valueFrom değişkenleri

valueFrom alanı, sıralı bir değişken listesini kabul eder. Proxy bunları sırayla değerlendirir ve etiket değeri olarak ilk boş olmayan sonucu kullanır.

Dört değişken, uygulandıkları yere göre iki gruba ayrılır:

Değişken Uygulama yeri Etiket değeri kaynağı
$getInboundRequestHeader(headerName) Yalnızca ağ geçitleri Ağ geçidindeki gelen istek başlığı
$getExternalInboundRequestHeader(headerName, contextId) Yalnızca sidecar proxy'leri Çağrı zinciri boyunca bir bağlam haritası aracılığıyla ilişkilendirilen gelen istek başlığı
$getLocalOutboundRequestHeader(headerName) Yalnızca sidecar proxy'leri Uygulama tarafından ayarlanan giden istek başlığı
$getLabel(labelName) Ağ geçitleri ve sidecar proxy'leri Ağ geçidi veya iş yükü podundaki pod etiketi

Ağ geçidi değişkeni

$getInboundRequestHeader(headerName)

Ağ geçidine giren gelen istekten headerName başlığını okur. Ağ geçidi, TrafficLabel CRD'de tanımlanan etiket adını anahtar ve çıkarılan değeri değer olarak kullanarak yeni bir giden başlık ekler.

headerName boş bırakılırsa ağ geçidi varsayılan olarak x-asm-prefer-tag değerini okur.

Veri akışı:

Client request                    Gateway                         Upstream service
     |                              |                                   |
     |-- headerName: tagValue ----->|                                   |
     |                              |-- userDefinedLabel: tagValue ---->|
     |                              |                                   |

Data flow for $getInboundRequestHeader

Sidecar proxy değişkenleri

$getExternalInboundRequestHeader(headerName, contextId)

Sidecar proxy'sine giren gelen istekten headerName başlığını okur ve değeri contextId ile anahtarlanmış dahili bir bağlam haritasında saklar. Bu harita Envoy belleğinde 30 saniye boyunca kalıcıdır.

Parametreler (her ikisi de gereklidir):

Parametre Açıklama Örnek
headerName Okunacak istek başlığı anahtarı. x-asm-prefer-tag
contextId Çağrı zinciri boyunca kalıcı olan ve gelen/giden trafiği ilişkilendirmek için kullanılan bir başlık alanı. Genellikle bir iz ID'sidir. x-request-id

Bağlam haritasının çalışma biçimi:

  1. Sidecar'a gelen bir istek ulaşır. Proxy, headerName değerini okuyarak tagValue değerini alır ve map<contextId, tagValue> haritasını saklar.

  2. Uygulama giden bir istek başlattığında proxy, bağlam haritasında contextId değerini arar.

  3. Eşleşme bulunursa proxy giden isteğe iki başlık ekler:

    • headerName: tagValue

    • userDefinedLabel: tagValue (TrafficLabel CRD'deki etiket adını kullanarak)

Veri akışı:

Inbound request       Sidecar proxy (context map)          Outbound request
     |                         |                                 |
     |-- headerName: tagValue  |                                 |
     |-- contextId: ctx123 --->| store: ctx123 -> tagValue       |
     |                         |                                 |
     |          App initiates outbound request                   |
     |                         |-- contextId: ctx123 ----------->|
     |                         |   (lookup: ctx123 -> tagValue)  |
     |                         |-- headerName: tagValue -------->|
     |                         |-- userDefinedLabel: tagValue -->|

Data flow for $getExternalInboundRequestHeader

Not
  • Bağlam haritası (map<contextId, tagValue>), varsayılan olarak 30 saniye boyunca Envoy proxy belleğinde saklanır.

  • Uygulamanız bir izleme sistemine bağlıysa iz ID'sini contextId olarak kullanın. Farklı izleme sistemleri farklı iz ID'leri kullanır. Ayrıntılar için bkz. Tracing.

  • Istio proxy'lerinin span'leri eksiksiz bir iz olarak ilişkilendirebilmesi için uygulamalar ilgili HTTP başlıklarını yaymalıdır. Bkz. ASM'de dağıtılmış izlemeyi etkinleştirme.

  • Uygulama contextId değerini yaymazsa sidecar proxy, etiket değerini bağlam haritasından arayamaz ve giden istek etiketlenmez.

$getLocalOutboundRequestHeader(headerName)

Uygulamanın sidecar proxy'sine gönderdiği giden istekten headerName başlığını okur. Proxy, TrafficLabel CRD'deki etiket adını anahtar ve çıkarılan değeri değer olarak kullanarak yeni bir giden başlık ekler.

Uygulama kendisi giden isteklerinde bir başlık ayarladığında bu değişkeni kullanın.

Veri akışı:

Application container          Sidecar proxy              Upstream service
     |                              |                          |
     |-- headerName: tagValue ----->|                          |
     |                              |-- userDefinedLabel: tagValue -->|
     |                              |                          |

Data flow for $getLocalOutboundRequestHeader

Pod etiketi değişkeni

$getLabel(labelName)

Ağ geçidi podundan veya sidecar iş yükü podundan labelName etiketini okur ve değeri giden trafiğe ekler. labelName boşsa proxy varsayılan olarak ASM_TRAFFIC_TAG etiketini okur.

Örnek: Bir Deployment podu ASM_TRAFFIC_TAG: test etiketine sahipse $getLabel(ASM_TRAFFIC_TAG) değişkeni test değerini döndürür.

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    # This value is read by $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: {}

Belirli bir iş yükü için trafiği etiketleme

Bu örnek, productpage iş yükünün trafiğini etiketler. Etiket değeri, gelen istek başlığı header1 (x-request-id ile ilişkilendirilmiş) üzerinden çözümlenir ve yedek olarak pod etiketi header2 kullanılır.

Bu sayfadaki her iki örnek de ASM 1.17 veya sonraki bir sürüm gerektirir ve Bookinfo örnek uygulamasını kullanır.

  1. Bookinfo uygulamasını dağıtın. Bkz. ASM örneğinde uygulama dağıtma.

  2. Aşağıdaki YAML'i productpage-trafficlabel.yaml dosyasına kaydedin:

       apiVersion: istio.alibabacloud.com/v1
       kind: TrafficLabel
       metadata:
         name: productpage
         namespace: default
       spec:
         workloadSelector:
           labels:
             app: productpage          # Only applies to the productpage workload
         rules:
         - labels:
           - name: asm-labels-test-a   # Outbound header name for the label
             valueFrom:
             - $getExternalInboundRequestHeader(header1, x-request-id)  # Primary: read from inbound header
             - $getLabel(header2)                                        # Fallback: read from pod label
  3. Kaynağı uygulayın:

       kubectl apply -n default -f productpage-trafficlabel.yaml
  4. Envoy filtresinin productpage proxy'sine enjekte edildiğini doğrulayın: dynamic_listeners veya http_filters altında com.aliyun.traffic_label filtresini arayın:

       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. Seçilmemiş iş yüklerinin etkilenmediğini onaylayın. Aynı kontrolü details podu üzerinde çalıştırın: Boş sonuç, beklendiği gibi hiçbir etiketleme filtresinin enjekte edilmediğini doğrular.

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

Ad alanı düzeyinde trafiği etiketleme

Bir ad alanındaki tüm iş yükleri için trafiği etiketlemek amacıyla workloadSelector alanını atlayın. Bu örnek, default ad alanındaki tüm iş yüklerini etiketler.

  1. Aşağıdaki YAML'i all-workload-for-ns-trafficlabel.yaml dosyasına kaydedin:

       apiVersion: istio.alibabacloud.com/v1
       kind: TrafficLabel
       metadata:
         name: all-workload-for-ns
         namespace: default
       spec:
         rules:                        # No workloadSelector -- applies to every workload in "default"
         - labels:
           - name: asm-labels-test-b
             valueFrom:
             - $getExternalInboundRequestHeader(header1, x-request-id)
             - $getLabel(header2)
  2. Kaynağı uygulayın:

       kubectl apply -n default -f all-workload-for-ns-trafficlabel.yaml
  3. Etiketleme filtresinin artık tüm iş yüklerinde bulunduğunu doğrulayın. details podunu kontrol edin: Beklenen çıktı: Filtre artık ad alanındaki her iş yüküne enjekte edilmiştir.

       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",

İlgili konular