Tous les produits
Search
Centre de documentation

Alibaba Cloud Service Mesh:Use lanes for end-to-end canary release

Dernière mise à jour :Aug 11, 2026

Les lanes de trafic isolent des versions spécifiques de service dans des environnements d'exécution indépendants et acheminent les requêtes correspondantes à travers toute la chaîne d'appel, sans aucune modification du code applicatif. Cela permet des déploiements canaris de bout en bout sur plusieurs services simultanément.

Pourquoi utiliser les lanes de trafic

Les déploiements canaris Kubernetes standards couplent la distribution du trafic au nombre de réplicas : envoyer 10 % du trafic vers une version canari nécessite un réplica canari aux côtés de neuf réplicas stables. Cette approche présente deux limites majeures :

  • Chaînes d'appels multi-services. Une requête transitant par les services A, B et C nécessite un routage cohérent des versions à chaque étape. Kubernetes ne propose aucun mécanisme natif pour cela.

  • Mise à l'échelle indépendante. Avec les lanes, la distribution du trafic et le nombre de réplicas sont totalement découplés. Un seul réplica canari reçoit exactement le pourcentage de trafic que vous spécifiez, quel que soit le nombre de réplicas stables en cours d'exécution.

Les lanes de trafic ASM résolvent ces deux problèmes en étiquetant les requêtes au niveau de la passerelle d'entrée (ingress gateway) et en propageant cette étiquette sur l'ensemble de la chaîne d'appel.

Fonctionnement

La configuration des lanes via la console génère automatiquement trois ressources Istio :

Ressource Objectif
TrafficLabel Attribue une étiquette à chaque requête en fonction du label de pod ASM_TRAFFIC_TAG
DestinationRule Mappe les noms de lane aux sous-ensembles de version de service
VirtualService Achemine les requêtes vers le sous-ensemble correct en fonction de l'en-tête x-asm-prefer-tag et de l'URI

Flux de routage :

  1. Une requête arrive à la passerelle d'entrée avec l'en-tête x-asm-prefer-tag: <lane-name>.

  2. Le VirtualService fait correspondre l'en-tête et l'URI, puis achemine la requête vers le sous-ensemble correspondant du premier service.

  3. Le TrafficLabel propage l'étiquette de lane lors des appels service-à-service suivants, maintenant la requête dans la même lane tout au long de la chaîne d'appel.

Aperçu du scénario

Ce tutoriel déploie trois lanes (s1, s2, s3), chacune contenant trois services (mocka, mockb, mockc) liés à différentes versions :

Lane Étiquette de service Services
s1 v1 mocka, mockb, mockc
s2 v2 mocka, mockb, mockc
s3 v3 mocka, mockb, mockc

Après la configuration, les requêtes avec x-asm-prefer-tag: s1 transitent exclusivement par la version v1 des trois services, celles avec s2 par la v2, et celles avec s3 par la v3.

Lane mode end-to-end canary release

Prérequis

Avant de commencer, assurez-vous d'avoir :

Exemple de YAML de passerelle

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: ingressgateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway        # Match the ASM ingress gateway
  servers:
    - port:
        number: 80               # Listen on port 80
        name: http
        protocol: HTTP
      hosts:
        - '*'                    # Accept traffic for all hosts

Étape 1 : Déployer les exemples de services

Activer l'injection automatique du proxy sidecar

  1. Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez Service Mesh > Mesh Management.

  2. Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez ASM Instance > Global Namespace.

  3. Sur la page Global Namespace, repérez le namespace default et cliquez sur Enable Automatic Sidecar Injection dans la colonne Automatic Sidecar Injection. Dans le message Submit, cliquez sur OK.

Pour plus d'informations, consultez Activer l'injection automatique du proxy sidecar.

Déployer les services

Déployez les versions v1, v2 et v3 des exemples de services dans le cluster ACK :

kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v1/application-v1.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v2/application-v2.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v3/application-v3.yaml

Étape 2 : Créer un groupe de lanes et des lanes

Créer un groupe de lanes

  1. Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez Service Mesh > Mesh Management.

  2. Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez Traffic Management Center > Traffic Lane.

  3. Sur la page Traffic Lane, cliquez sur Create Swimlane Group. Dans le panneau Create Swimlane Group, configurez les paramètres suivants et cliquez sur OK.

Paramètre Valeur
Name of swim lane group test
Entrance gateway ingressgateway
Swimlane Services Sélectionnez le cluster ACK dans la liste déroulante Kubernetes Clusters et sélectionnez default dans la liste déroulante Namespace. Sélectionnez mocka, mockb et mockc dans la liste des services, puis cliquez sur l'icône move pour les ajouter à la section selected

Après avoir créé le groupe de lanes, ASM génère une ressource TrafficLabel :

YAML TrafficLabel généré

apiVersion: istio.alibabacloud.com/v1beta1
kind: TrafficLabel
metadata:
  labels:
    asm-system: 'true'
    provider: asm
  name: asm-trafficlabel-global
  namespace: istio-system
spec:
  rules:
    - labels:
        - name: asm-label
          valueFrom:
            - $getLabel(ASM_TRAFFIC_TAG)   # Reads the ASM_TRAFFIC_TAG label from each pod

Créer des lanes

Créez trois lanes (s1, s2, s3) et liez chacune à la version de service correspondante. Les étapes suivantes montrent comment créer la lane s1. Répétez le même processus pour s2 (étiquette de service : v2) et s3 (étiquette de service : v3).

  1. Dans la section Traffic Rule Definition de la page Traffic Lane, cliquez sur Create swimlanes.

  2. Dans la boîte de dialogue Create swimlanes, configurez les paramètres suivants et cliquez sur OK.

Paramètre Valeur
Swimlane Name s1
Configure Service Tag v1
Add Service Sélectionnez mocka(default), mockb(default) et mockc(default)
Remarque

Les requêtes avec l'en-tête x-asm-prefer-tag: s1 sont acheminées vers le sous-ensemble v1 de chaque service.

Create lane

Après avoir créé les trois lanes, la section Traffic Rule Definition les affiche comme suit :

Lanes overview

Chaque création de lane génère une DestinationRule. L'exemple suivant montre la DestinationRule pour la lane s1 :

YAML DestinationRule généré (lane s1)

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  labels:
    asm-system: 'true'
    provider: asm
    swimlane-group: test                              # Belongs to the "test" lane group
  name: trafficlabel-dr-test-default-mocka
  namespace: istio-system
spec:
  host: mocka.default.svc.cluster.local               # Target service
  subsets:
    - labels:
        ASM_TRAFFIC_TAG: v1                            # Lane s1 maps to version v1
      name: s1
    - labels:
        ASM_TRAFFIC_TAG: v1
      name: v1
    - labels:
        ASM_TRAFFIC_TAG: v2                            # Lane s2 maps to version v2
      name: v2
    - labels:
        ASM_TRAFFIC_TAG: v2
      name: s2
    - labels:
        ASM_TRAFFIC_TAG: v3                            # Lane s3 maps to version v3
      name: v3
    - labels:
        ASM_TRAFFIC_TAG: v3
      name: s3

Créer des règles de trafic entrant

Créez une règle de routage du trafic pour chaque lane. Les étapes suivantes montrent comment créer une règle pour la lane s1. Répétez le même processus pour s2 et s3.

Cet exemple suppose que tous les services de lane partagent le chemin de requête entrante /mock.

  1. Dans la section Traffic Rule Definition de la page Traffic Lane, repérez la lane cible et cliquez sur Ingress traffic rules dans la colonne Actions.

  2. Dans la boîte de dialogue Add drainage rule, configurez les paramètres suivants et cliquez sur OK.

Paramètre Valeur
Ingress service mocka.default.svc.cluster.local
Ingress traffic rules Name : r1, realm name : *
Matching request URI Method : Exact, Content : /mock

Après avoir créé les règles de routage du trafic pour les trois lanes, la section Traffic Rule Definition les affiche comme suit :

Ingress traffic rules

ASM génère un VirtualService qui achemine les requêtes en fonction de l'en-tête x-asm-prefer-tag :

YAML VirtualService généré

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  labels:
    asm-system: 'true'
    istioGateway: ingressgateway
    provider: asm
  name: ingressgateway
  namespace: istio-system
spec:
  gateways:
    - istio-system/ingressgateway                      # Bind to the ingress gateway
  hosts:
    - '*'                                              # Match all hosts
  http:
    - match:
        - headers:
            x-asm-prefer-tag:
              exact: s1                                # Match requests tagged for lane s1
          uri:
            exact: /mock                               # Match the /mock path
      name: swimelane-ingress-route-test-s1-rule1
      route:
        - destination:
            host: mocka.default.svc.cluster.local      # Route to mocka
            subset: s1                                 # Use the s1 subset (version v1)
    - match:
        - headers:
            x-asm-prefer-tag:
              exact: s2                                # Match requests tagged for lane s2
          uri:
            exact: /mock
      name: swimelane-ingress-route-test-s2-rule2
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s2                                 # Use the s2 subset (version v2)
    - match:
        - headers:
            x-asm-prefer-tag:
              exact: s3                                # Match requests tagged for lane s3
          uri:
            exact: /mock
      name: swimelane-ingress-route-test-s3-rule3
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s3                                 # Use the s3 subset (version v3)

Étape 3 : Vérifier le déploiement canari de bout en bout

Obtenir l'adresse IP de la passerelle

Obtenez l'adresse IP publique de la passerelle d'entrée ASM. Pour plus de détails, consultez l'étape 2 de Intégrer le service d'inférence cloud-native KServe avec ASM.

Définissez l'adresse IP comme variable d'environnement. Remplacez <gateway-ip-address> par l'adresse IP publique réelle.

export ASM_GATEWAY_IP=<gateway-ip-address>

Tester chaque lane

Envoyez 100 requêtes à chaque lane et vérifiez que le trafic reste dans les versions de service attendues.

Lane s1 (attendu : tout v1) :

for i in {1..100}; do curl -H 'x-asm-prefer-tag: s1' http://${ASM_GATEWAY_IP}/mock; echo ''; sleep 1; done;

Sortie attendue :

-> mocka(version: v1, ip: 172.17.0.54)-> mockb(version: v1, ip: 172.17.0.129)-> mockc(version: v1, ip: 172.17.0.130)

Les trois services renvoient la version v1, confirmant que les requêtes étiquetées avec x-asm-prefer-tag: s1 transitent exclusivement par la lane s1.

Lane s2 (attendu : tout v2) :

for i in {1..100}; do curl -H 'x-asm-prefer-tag: s2' http://${ASM_GATEWAY_IP}/mock; echo ''; sleep 1; done;

Sortie attendue :

-> mocka(version: v2, ip: 172.17.0.9)-> mockb(version: v2, ip: 172.17.0.126)-> mockc(version: v2, ip: 172.17.0.128)

Lane s3 (attendu : tout v3) :

for i in {1..100}; do curl -H 'x-asm-prefer-tag: s3' http://${ASM_GATEWAY_IP}/mock; echo ''; sleep 1; done;

Sortie attendue :

-> mocka(version: v3, ip: 172.17.0.132)-> mockb(version: v3, ip: 172.17.0.127)-> mockc(version: v3, ip: 172.17.0.69)

Résoudre les problèmes de routage

Si une requête renvoie une version incorrecte, vérifiez les points suivants :

Symptôme Cause possible Résolution
La réponse affiche une version incorrecte Les labels de pod ASM_TRAFFIC_TAG ne correspondent pas à l'étiquette de service configurée pour la lane Vérifiez les labels des pods avec kubectl get pods --show-labels et confirmez qu'ils correspondent à la configuration de la lane
Aucune réponse ou erreur 404 La route VirtualService ne correspond pas à la valeur de l'en-tête x-asm-prefer-tag ou à l'URI Vérifiez le YAML VirtualService pour confirmer les règles de correspondance d'en-tête et le chemin URI
Fuite de trafic entre les lanes Les sous-ensembles DestinationRule ne mappent pas correctement les noms de lane aux labels de version Inspectez le YAML DestinationRule et vérifiez que chaque sous-ensemble mappe la bonne valeur ASM_TRAFFIC_TAG
Échecs de routage intermittents Le proxy sidecar n'est pas injecté sur certains pods Exécutez kubectl get pods -o jsonpath='{.items[*].spec.containers[*].name}' pour confirmer que le conteneur istio-proxy existe sur tous les pods

(Facultatif) Étape 4 : Vérifier la topologie du maillage

Si Mesh Topology est activé dans la console ASM, inspectez le graphique de topologie pour visualiser les chemins de requête à travers les lanes. Pour plus d'informations, consultez Activer Mesh Topology pour observer une instance ASM dans la console ASM.

Étapes suivantes

  • Label traffic – En savoir plus sur les concepts de labellisation du trafic et les configurations avancées