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
stagingveyaproductionolarak 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
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:
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).
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 ---->|
| | |

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:
Sidecar'a gelen bir istek ulaşır. Proxy,
headerNamedeğerini okuyaraktagValuedeğerini alır vemap<contextId, tagValue>haritasını saklar.Uygulama giden bir istek başlattığında proxy, bağlam haritasında
contextIddeğerini arar.-
Eşleşme bulunursa proxy giden isteğe iki başlık ekler:
headerName: tagValueuserDefinedLabel: 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 -->|

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
contextIdolarak 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
contextIddeğ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 -->|
| | |

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.
Bookinfo uygulamasını dağıtın. Bkz. ASM örneğinde uygulama dağıtma.
-
Aşağıdaki YAML'i
productpage-trafficlabel.yamldosyası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 -
Kaynağı uygulayın:
kubectl apply -n default -f productpage-trafficlabel.yaml -
Envoy filtresinin
productpageproxy'sine enjekte edildiğini doğrulayın:dynamic_listenersveyahttp_filtersaltındacom.aliyun.traffic_labelfiltresini 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", ... } } -
Seçilmemiş iş yüklerinin etkilenmediğini onaylayın. Aynı kontrolü
detailspodu ü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.
-
Aşağıdaki YAML'i
all-workload-for-ns-trafficlabel.yamldosyası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) -
Kaynağı uygulayın:
kubectl apply -n default -f all-workload-for-ns-trafficlabel.yaml -
Etiketleme filtresinin artık tüm iş yüklerinde bulunduğunu doğrulayın.
detailspodunu 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
ASM örneğinde uygulama dağıtma -- Trafik etiketlerini yapılandırmadan önce ağınızda iş yüklerini kurun.
ASM'de dağıtılmış izlemeyi etkinleştirme --
$getExternalInboundRequestHeadertarafından gereken iz başlıklarını yayma.ASM örneğini güncelleme -- Daha eski bir sürüm kullanıyorsanız ASM 1.17+ sürümüne yükseltin.