Tous les produits
Search
Centre de documentation

Alibaba Cloud Service Mesh:Migrate traffic from Nginx Ingress Controller to an ingress gateway

Dernière mise à jour :Aug 29, 2026

Lorsque vous adoptez Service Mesh (ASM) pour la gestion du trafic, les services existants derrière le Nginx Ingress Controller doivent continuer à recevoir du trafic sans interruption. ASM vous permet d'exécuter les deux passerelles derrière la même instance Classic Load Balancer (CLB) et de transférer progressivement le trafic via un routage basé sur des pondérations. Vous pouvez ainsi valider chaque étape et revenir instantanément en arrière si nécessaire.

Fonctionnement

Avec le Nginx Ingress Controller, une seule ressource Ingress gère à la fois la configuration de l'écouteur (ports, hôtes, TLS) et les règles de routage (chemins, backends). Istio sépare ces éléments en deux ressources distinctes :

  • Gateway -- Définit la couche infrastructure : quels ports exposer, quels protocoles accepter et quels hôtes servir.

  • VirtualService -- Définit la couche de routage : comment faire correspondre les requêtes entrantes et où les envoyer.

Pendant la migration, le Nginx Ingress Controller et la passerelle d'entrée ASM partagent la même instance CLB. Une répartition du trafic basée sur des pondérations vous permet de déplacer le trafic de manière incrémentielle, de vérifier le comportement à chaque étape et de revenir en arrière en définissant la pondération sur 0.

Traffic flow during migration

Prérequis

Avant de commencer, assurez-vous que vous disposez des éléments suivants :

  • Une instance ASM Enterprise Edition ou Ultimate Edition, exécutant la dernière version. Consultez la rubrique Créer une instance ASM

  • Un cluster Container Service for Kubernetes (ACK) ajouté à l'instance ASM. Consultez la rubrique Ajouter un cluster à une instance ASM

  • L'ID de l'instance CLB et les ID des groupes de serveurs virtuels pour votre configuration Nginx Ingress Controller existante

  • L'algorithme de planification CLB défini sur weighted round-robin (WRR)

Étape 1 : Créer une passerelle d'entrée qui partage le CLB existant

Créez une passerelle d'entrée ASM qui réutilise l'instance CLB déjà associée au Nginx Ingress Controller. Cela permet aux deux passerelles de coexister derrière le même équilibreur de charge pendant la migration.

Ajoutez les annotations de service suivantes au YAML de la passerelle pour lier la passerelle d'entrée à votre CLB existant :

Annotation Objectif Exemple de valeur
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id Instance CLB à réutiliser "lb-xxxxx"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners Indique s'il faut écraser les écouteurs CLB existants. Définissez cette valeur sur false pour conserver les écouteurs Nginx Ingress. 'false'
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port Groupes de serveurs virtuels à lier, au format <vserver-group-id>:<port>. Séparez plusieurs entrées par des virgules. "${YOUR_VGROUP_ID}:80"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight Pondération du trafic pour la passerelle d'entrée. Définissez cette valeur sur 0 lorsque le routage n'est pas encore configuré ou en cas de problème : le CLB n'envoie aucun trafic à la passerelle avec une pondération de 0. "0"

Exemple de configuration de passerelle :

serviceAnnotations:
  service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "lb-xxxxx"
  service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: 'false'
  service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "${YOUR_VGROUP_ID}:80"
  service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "60"

Remplacez les valeurs d'espace réservé :

Espace réservé Description Où le trouver
lb-xxxxx ID de l'instance CLB Console CLB > Instances
${YOUR_VGROUP_ID} ID du groupe de serveurs virtuels Console CLB > Groupes de serveurs virtuels
Remarque

Si vous définissez la pondération sur 0, la passerelle d'entrée ne reçoit plus de trafic. Vous pouvez définir la pondération sur 0 lorsque les règles de routage n'ont pas été configurées ou en cas d'exceptions.

Remarque

Pour plus de détails sur la réutilisation des instances CLB créées avec le type de service LoadBalancer, consultez la rubrique FAQ.

Vérifier la passerelle

Confirmez que le pod de la passerelle d'entrée est en cours d'exécution et que l'instance CLB affiche les nouveaux membres du groupe de serveurs virtuels :

kubectl get pods -n istio-system -l istio=ingressgateway

Résultat attendu :

NAME                                   READY   STATUS    RESTARTS   AGE
istio-ingressgateway-xxxx-xxxxx        1/1     Running   0          1m

Étape 2 : Traduire les règles Ingress en VirtualService et DestinationRule Istio

Convertissez chaque ressource Nginx Ingress en une paire de ressources Istio : une Gateway (déjà créée à l'étape 1) et un VirtualService. Si vous avez besoin de politiques de trafic telles que les paramètres de pool de connexions ou la détection des pannes, créez également une DestinationRule.

Exemple : règle Ingress basée sur la réécriture

Ingress d'origine :

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: helloworld
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
    - http:
        paths:
          - backend:
              serviceName: helloworld
              servicePort: 80
            path: /helloworld(/|$)(.*)
      host: example.com

VirtualService équivalent :

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: example-vs
spec:
  gateways:
  - istio-system/ingressgateway    # Reference your gateway name
  hosts:
  - example.com
  http:
  - name: route-helloworld
    match:
    - uri:
        prefix: /helloworld/
    - uri:
        prefix: /helloworld
    rewrite:
      uri: /
    route:
    - destination:
        host: helloworld
        port:
          number: 80

Principales différences par rapport à la ressource Ingress :

  • L'annotation rewrite-target devient un champ rewrite.uri dans le VirtualService.

  • Le chemin regex /helloworld(/|$)(.*) devient deux correspondances de préfixe explicites : /helloworld/ et /helloworld.

  • Les règles host et de routage sont définies séparément (Gateway contre VirtualService) plutôt que dans une seule ressource.

Important

Déployez les ressources VirtualService et DestinationRule dans le même namespace que le service Kubernetes correspondant. Si vous les déployez dans un autre namespace, utilisez le format de nom de domaine complet (FQDN) pour destination.host (par exemple, helloworld.default.svc.cluster.local).

Vérifier les routes

Appliquez le VirtualService et confirmez que les routes sont acceptées :

kubectl apply -f virtualservice.yaml
kubectl get virtualservice example-vs -o yaml

Vérifiez que la section status n'affiche aucune erreur ni aucun avertissement.

Étape 3 : Vérifier les configurations

Vérifiez que les configurations sont valides et prennent effet en contrôlant le flux de trafic. Créez une instance CLB, envoyez du trafic vers l'instance CLB et vérifiez si le flux de trafic répond aux attentes. Pour plus d'informations, consultez la section Flux de trafic.

Étape 4 : Transférer progressivement le trafic

Une fois la configuration de routage vérifiée, augmentez progressivement la pondération de la passerelle d'entrée pour migrer le trafic :

  1. Commencez par une faible pondération (par exemple, 1) et surveillez les erreurs.

  2. Augmentez la pondération par étapes, par exemple 1 -> 10 -> 30 -> 60 -> 100.

  3. À chaque étape, vérifiez que la latence, les taux d'erreur et le contenu des réponses restent cohérents.

  4. Une fois que tout le trafic passe par la passerelle d'entrée, définissez la pondération du Nginx Ingress Controller sur 0.

Comment ajuster les pondérations

Composant Comment ajuster
Passerelle d'entrée ASM Modifiez l'annotation service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight dans la configuration de la passerelle.
Nginx Ingress Controller Modifiez l'annotation service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight sur le service Kubernetes associé. Si aucune annotation de pondération n'existe, ajustez la pondération dans la console CLB.
Important

L'algorithme de planification CLB doit être défini sur weighted round-robin (WRR) pour que la répartition du trafic basée sur les pondérations fonctionne.

Étapes suivantes

Une fois que tout le trafic passe par la passerelle d'entrée ASM :

  • Configurez la terminaison TLS sur la passerelle d'entrée ASM

  • Configurez la surveillance et la journalisation des accès pour la passerelle d'entrée

  • Supprimez le déploiement Nginx Ingress Controller après avoir confirmé la stabilité des opérations

  • Explorez les fonctionnalités de gestion du trafic Istio telles que l'injection de fautes, le disjoncteur et les déploiements canaris