Lorsque des microservices communiquent au sein d’un maillage, il est souvent nécessaire d’acheminer des requêtes spécifiques vers certaines versions de service — pour des déploiements canaris, des tests A/B ou l’isolation d’environnements. L’étiquetage du trafic dans Alibaba Cloud Service Mesh (ASM) attache des tags personnalisés aux requêtes lors de leur traversée du maillage, afin que les règles de routage en aval, les politiques de limitation et les disjoncteurs puissent agir en fonction de ces tags.
ASM met à disposition la définition de ressource personnalisée (CRD) TrafficLabel pour définir des règles d’étiquetage. Appliquez une ressource TrafficLabel à un namespace ou à une charge de travail spécifique : ASM injecte automatiquement la logique d’étiquetage dans les filtres du proxy Envoy.
Cas d’utilisation
Déploiements canaris : acheminez un pourcentage du trafic vers une nouvelle version en faisant correspondre une valeur d’en-tête.
Tests A/B : répartissez le trafic entre différentes variantes à l’aide de règles de routage basées sur les étiquettes.
Isolation d’environnement : étiquetez le trafic comme
stagingouproductionet acheminez-le vers les backends correspondants.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une instance ASM exécutant la version 1.17 ou ultérieure
Un cluster Kubernetes associé à votre instance ASM
kubectlconfiguré pour se connecter au cluster
ASM 1.17 a introduit apiVersion: istio.alibabacloud.com/v1 pour la CRD TrafficLabel. Si vous avez précédemment configuré TrafficLabel dans un cluster Container Service for Kubernetes (ACK) en utilisant apiVersion: istio.alibabacloud.com/v1beta1, remplacez apiVersion par istio.alibabacloud.com/v1 et réappliquez la ressource. Pour mettre à jour votre instance ASM, consultez Mettre à jour une instance ASM. Pour les versions antérieures d’ASM, ouvrez un ticket pour obtenir de l’aide.
Fonctionnement de l’étiquetage du trafic
Une ressource TrafficLabel définit deux éléments :
Portée : les charges de travail à étiqueter (toutes les charges de travail d’un namespace ou un sous-ensemble sélectionné via les libellés de pod).
Règles : l’emplacement d’extraction de la valeur d’étiquette (en-têtes de requête, libellés de pod ou contexte de trace).
Lorsqu’une requête entre dans une passerelle ou un proxy sidecar, le proxy évalue les règles TrafficLabel, résout une valeur d’étiquette et l’attache en tant que nouvel en-tête sur les requêtes sortantes. Les services en aval peuvent ensuite faire correspondre cet en-tête pour prendre des décisions de routage.
Présentation de la structure de la CRD
Le squelette suivant illustre l’imbrication des champs TrafficLabel :
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
Référence des champs
Spec
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
workloadSelector |
WorkloadSelector | Non | Sélectionne les charges de travail à étiqueter. Si omis, l’étiquetage s’applique à toutes les charges de travail du namespace. |
rules |
TrafficLabelRule[] | Oui | Une ou plusieurs règles d’étiquetage. |
WorkloadSelector
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
labels |
map |
Non | Paires clé-valeur qui correspondent aux libellés des charges de travail. |
TrafficLabelRule
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
labels |
Label[] | Oui | Les étiquettes de trafic à attacher. |
Label
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
name |
string | Oui | Le nom de l’étiquette de trafic. Doit respecter les conventions de nommage des en-têtes de requête HTTP. |
valueFrom |
string[] | Oui | Liste ordonnée de variables. Le proxy les évalue séquentiellement et utilise le premier résultat non vide. Consultez variables valueFrom. |
Variables valueFrom
Le champ valueFrom accepte une liste ordonnée de variables. Le proxy les évalue séquentiellement et utilise le premier résultat non vide comme valeur d’étiquette.
Les quatre variables se divisent en deux groupes selon leur champ d’application :
| Variable | S’applique à | Source de la valeur d’étiquette |
|---|---|---|
$getInboundRequestHeader(headerName) |
Passerelles uniquement | En-tête de requête entrante au niveau de la passerelle |
$getExternalInboundRequestHeader(headerName, contextId) |
Proxies sidecar uniquement | En-tête de requête entrante, corrélé sur toute la chaîne d’appel via une carte de contexte |
$getLocalOutboundRequestHeader(headerName) |
Proxies sidecar uniquement | En-tête de requête sortante défini par l’application |
$getLabel(labelName) |
Passerelles et proxies sidecar | Libellé de pod sur le pod de passerelle ou de charge de travail |
Variable de passerelle
$getInboundRequestHeader(headerName)
Lit l’en-tête headerName depuis la requête entrante arrivant sur la passerelle. La passerelle ajoute un nouvel en-tête sortant en utilisant le nom d’étiquette défini dans la CRD TrafficLabel comme clé et la valeur extraite comme valeur.
Si headerName est laissé vide, la passerelle lit x-asm-prefer-tag par défaut.
Flux de données :
Client request Gateway Upstream service
| | |
|-- headerName: tagValue ----->| |
| |-- userDefinedLabel: tagValue ---->|
| | |

Variables de proxy sidecar
$getExternalInboundRequestHeader(headerName, contextId)
Lit l’en-tête headerName depuis la requête entrante arrivant sur le proxy sidecar et stocke la valeur dans une carte de contexte interne identifiée par contextId. Cette carte persiste pendant 30 secondes dans la mémoire d’Envoy.
Paramètres (tous deux obligatoires) :
| Paramètre | Description | Exemple |
|---|---|---|
headerName |
Clé d’en-tête de requête à lire. | x-asm-prefer-tag |
contextId |
Champ d’en-tête qui persiste sur toute la chaîne d’appel, utilisé pour corréler le trafic entrant et sortant. Généralement un ID de trace. | x-request-id |
Fonctionnement de la carte de contexte :
Une requête entrante arrive sur le sidecar. Le proxy lit
headerNamepour obtenirtagValueet stockemap<contextId, tagValue>.Lorsque l’application initie une requête sortante, le proxy recherche
contextIddans la carte de contexte.-
Si une correspondance est trouvée, le proxy ajoute deux en-têtes à la requête sortante :
headerName: tagValueuserDefinedLabel: tagValue(en utilisant le nom d’étiquette issu de la CRD TrafficLabel)
Flux de données :
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 -->|

La carte de contexte (
map<contextId, tagValue>) est stockée dans la mémoire du proxy Envoy pendant 30 secondes par défaut.Lorsque votre application est connectée à un système de traçage, utilisez l’ID de trace comme
contextId. Différents systèmes de traçage utilisent différents IDs de trace. Pour plus de détails, consultez Traçage.Les applications doivent propager les en-têtes HTTP pertinents pour que les proxies Istio puissent corréler les spans en une trace complète. Consultez Activer le traçage distribué dans ASM.
Si l’application ne propage pas
contextId, le proxy sidecar ne peut pas rechercher la valeur d’étiquette dans la carte de contexte et la requête sortante ne sera pas étiquetée.
$getLocalOutboundRequestHeader(headerName)
Lit l’en-tête headerName depuis la requête sortante que l’application envoie au proxy sidecar. Le proxy ajoute un nouvel en-tête sortant en utilisant le nom d’étiquette de la CRD TrafficLabel comme clé et la valeur extraite comme valeur.
Utilisez cette variable lorsque l’application elle-même définit un en-tête sur ses requêtes sortantes.
Flux de données :
Application container Sidecar proxy Upstream service
| | |
|-- headerName: tagValue ----->| |
| |-- userDefinedLabel: tagValue -->|
| | |

Variable de libellé de pod
$getLabel(labelName)
Lit le libellé labelName depuis le pod de passerelle ou le pod de charge de travail sidecar et ajoute la valeur au trafic sortant. Si labelName est vide, le proxy lit le libellé ASM_TRAFFIC_TAG par défaut.
Exemple : Si un pod de Deployment possède le libellé ASM_TRAFFIC_TAG: test, la variable $getLabel(ASM_TRAFFIC_TAG) renvoie 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 # 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: {}
Étiqueter le trafic pour une charge de travail spécifique
Cet exemple étiquette le trafic de la charge de travail productpage. La valeur d’étiquette est résolue à partir de l’en-tête de requête entrante header1 (corrélé par x-request-id), avec une solution de secours vers le libellé de pod header2.
Les deux exemples de cette page nécessitent ASM 1.17 ou ultérieur et utilisent l’application d’exemple Bookinfo.
Déployez l’application Bookinfo. Consultez Déployer une application dans une instance ASM.
-
Enregistrez le YAML suivant dans
productpage-trafficlabel.yaml: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 -
Appliquez la ressource :
kubectl apply -n default -f productpage-trafficlabel.yaml -
Vérifiez que le filtre Envoy a été injecté dans le proxy
productpage: recherchez le filtrecom.aliyun.traffic_labelsousdynamic_listenersouhttp_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", ... } } -
Confirmez que les charges de travail non sélectionnées ne sont pas affectées. Exécutez la même vérification sur le pod
details: un résultat vide confirme qu’aucun filtre d’étiquetage n’a été injecté, comme prévu.kubectl exec -it -n default deploy/details-v1 -c istio-proxy -- \ curl localhost:15000/config_dump | grep traffic_label
Étiqueter le trafic au niveau du namespace
Omettez workloadSelector pour étiqueter le trafic de toutes les charges de travail d’un namespace. Cet exemple étiquette toutes les charges de travail du namespace default.
-
Enregistrez le YAML suivant dans
all-workload-for-ns-trafficlabel.yaml: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) -
Appliquez la ressource :
kubectl apply -n default -f all-workload-for-ns-trafficlabel.yaml -
Vérifiez que le filtre d’étiquetage est désormais présent sur toutes les charges de travail. Vérifiez le pod
details: Résultat attendu : le filtre est maintenant injecté dans chaque charge de travail du 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",
Rubriques connexes
Déployer une application dans une instance ASM : configurez les charges de travail dans votre maillage avant de configurer les étiquettes de trafic.
Activer le traçage distribué dans ASM : propagez les en-têtes de trace requis par
$getExternalInboundRequestHeader.Mettre à jour une instance ASM : effectuez une mise à niveau vers ASM 1.17+ si vous utilisez une version antérieure.