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.

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 |
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.
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-targetdevient un champrewrite.uridans le VirtualService.Le chemin regex
/helloworld(/|$)(.*)devient deux correspondances de préfixe explicites :/helloworld/et/helloworld.Les règles
hostet de routage sont définies séparément (Gateway contre VirtualService) plutôt que dans une seule ressource.
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 :
Commencez par une faible pondération (par exemple,
1) et surveillez les erreurs.Augmentez la pondération par étapes, par exemple
1->10->30->60->100.À chaque étape, vérifiez que la latence, les taux d'erreur et le contenu des réponses restent cohérents.
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. |
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