Un outil de migration automatisé convertit vos configurations NGINX Ingress au format ALB Ingress, ce qui élimine le travail manuel. Basculez progressivement le trafic en ajustant les pondérations DNS pour garantir une migration sans interruption de service.
Processus de migration
Faites pointer un nom de domaine à la fois vers le NGINX Ingress et l'ALB Ingress, puis ajustez progressivement les pondérations DNS pour transférer le trafic de manière transparente. Le diagramme suivant illustre ce processus. L'Exemple de migration ci-dessous détaille chaque étape.
Le basculement du trafic via DNS constitue une méthode de migration sans interruption. Ce processus est fourni à titre indicatif uniquement.
Exemple de migration
L'exemple suivant détaille les opérations spécifiques à effectuer pour réaliser la migration.
Une entreprise exécute un contrôleur NGINX Ingress dans son cluster. Le Service de type LoadBalancer exposé sur Internet provisionne automatiquement une instance CLB accessible depuis Internet. Le DNS fait pointer www.example.net vers cette instance CLB, qui transfère ensuite les requêtes aux pods backend.
Étape 1 : Configurer l'ALB Ingress
Le NGINX Ingress ne répond plus aux exigences de performance et engendre des coûts d'exploitation et de maintenance élevés. L'entreprise utilise donc l'outil de migration pour convertir la configuration NGINX Ingress en ALB Ingress, puis ajoute l'ALB Ingress au DNS avec une pondération initiale faible.
Le DNS ne permet pas à un même nom de domaine de pointer simultanément vers un enregistrement A et un enregistrement CNAME. Les instances CLB reçoivent les requêtes via des adresses IP, tandis que les instances ALB exposent un nom de domaine par défaut (Qu'est-ce qu'Application Load Balancer ?). Vous devez configurer un nom de domaine temporaire pour l'instance CLB afin de permettre une distribution du trafic basée sur des pondérations.
Étape 2 : Transférer progressivement le trafic vers l'ALB Ingress
Une fois le bon fonctionnement de l'ALB Ingress vérifié, augmentez sa pondération DNS pour y router une part croissante du trafic.
Étape 3 : Supprimer les ressources NGINX Ingress
Après la migration complète du trafic vers l'ALB Ingress, supprimez les entrées DNS du NGINX Ingress, retirez les ressources associées et désinstallez le composant additionnel du contrôleur NGINX Ingress.
Prérequis
Un client kubectl est connecté au cluster ACK. Pour plus d'informations, consultez Se connecter à un cluster ACK avec kubectl.
Étape 1 : Configurer l'ALB Ingress
-
Connectez-vous à la console Container Service for Kubernetes (ACK) et installez le composant additionnel du contrôleur ALB Ingress dans le cluster cible de la migration.Connectez-vous à la console Container Compute Service et installez le composant additionnel du contrôleur ALB Ingress dans le cluster cible de la migration. L'outil de migration convertit automatiquement les ressources
AlbConfig,IngressClassetIngress. Par conséquent, lors de l'installation du composant additionnel, sélectionnez None pour ALB Instance.ImportantPour accéder aux services via un ALB Ingress dans un cluster dédié ACK, accordez les permissions nécessaires au contrôleur ALB Ingress avant de déployer vos services. Consultez Accorder des permissions au contrôleur ALB Ingress dans un cluster dédié ACK.
-
Créez un fichier nommé ingress2albconfig.yaml avec le contenu suivant.
apiVersion: batch/v1 kind: Job metadata: name: ingress2albconfig namespace: default spec: template: spec: containers: - name: ingress2albconfig image: registry-cn-hangzhou.ack.aliyuncs.com/acs/ingress2albconfig:0.0.2 command: ["/bin/ingress2albconfig", "print", "-A"] restartPolicy: Never serviceAccount: ingress2albconfig serviceAccountName: ingress2albconfig backoffLimit: 4 --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: system:ingress2albconfig rules: - apiGroups: - networking.k8s.io resources: - ingresses - ingressclasses verbs: - get - list - watch - update - create - patch --- apiVersion: v1 kind: ServiceAccount metadata: name: ingress2albconfig namespace: default --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: system:ingress2albconfig roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:ingress2albconfig subjects: - kind: ServiceAccount name: ingress2albconfig namespace: default -
Exécutez la commande suivante pour démarrer le Job. Celui-ci convertit les configurations NGINX Ingress existantes en ressources
AlbConfig,IngressClass,Ingresset autres, puis affiche les résultats dans les journaux du pod.kubectl apply -f ingress2albconfig.yamlSortie attendue :
job.batch/ingress2albconfig created clusterrole.rbac.authorization.k8s.io/system:ingress2albconfig created serviceaccount/ingress2albconfig created clusterrolebinding.rbac.authorization.k8s.io/system:ingress2albconfig created -
Consultez le pod associé au Job.
kubectl get pod -l job-name=ingress2albconfigSortie attendue :
NAME READY STATUS RESTARTS AGE ingress2albconfig-vw*** 0/1 Completed 0 16m -
Consultez les journaux du pod.
kubectl logs ingress2albconfig-vw*** # Replace this with the pod name from the previous step.Sortie attendue. Déployez ces ressources dans le cluster pour configurer l'ALB Ingress.
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: from-nginx spec: config: accessLogConfig: {} edition: Standard name: from-nginx tags: - key: converted/ingress2albconfig value: "true" zoneMappings: - vSwitchId: vsw-xxx # Replace this with the ID of a vSwitch in your VPC. - vSwitchId: vsw-xxx # Replace this with the ID of a vSwitch in your VPC. listeners: - port: 80 protocol: HTTP --- apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: from-nginx spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: from-nginx --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80}]' name: from-ingress1 namespace: default spec: ingressClassName: from-nginx rules: - http: paths: - backend: service: name: nginx-svc-g1msr port: number: 80 path: / pathType: Prefix status: loadBalancer: {}
Annotations converties automatiquement
L'outil de migration convertit les annotations NGINX Ingress suivantes en annotations ALB Ingress.
Les annotations absentes de ce tableau sont ignorées lors de la conversion. Vérifiez la configuration de l'ALB Ingress après la conversion.
Étape 2 : Transférer progressivement le trafic vers l'ALB Ingress
Avant de basculer le trafic, comparez et testez les règles de transfert de vos NGINX Ingress et ALB Ingress pour garantir une fonctionnalité identique.
Effectuez le basculement du trafic pendant les heures creuses.
Après avoir configuré l'ALB Ingress, dirigez-y une faible partie du trafic comme version canari. Vérifiez les règles de transfert et les configurations avant d'augmenter progressivement la pondération.
Configurer un domaine temporaire pour l'instance CLB
Le DNS ne prend pas en charge la résolution d'un nom de domaine vers un enregistrement A et un enregistrement CNAME simultanément. Comme les instances ALB utilisent un nom de domaine par défaut, vous devez configurer un nom de domaine temporaire pour l'instance CLB.
Connectez-vous à la console Alibaba Cloud DNS.
Sur la page Public Zone, recherchez et cliquez sur le nom de domaine DNS
www.example.netqui pointe vers l'instance CLB à migrer.Sur la page Settings, localisez l'enregistrement A qui fait pointer
www.example.netvers l'adresse IP de l'instance CLB. Dans la colonne Actions, cliquez sur Edit.Dans le panneau Edit Record, modifiez le champ Hostname, puis cliquez sur OK. Dans cet exemple, le champ Hostname devient web0. Conservez les autres paramètres inchangés.
-
Sur la page Settings, cliquez sur Add Record. Dans le panneau Add Record, configurez les paramètres suivants et cliquez sur OK.
Paramètre
Description
Record Type
Sélectionnez CNAME.
Hostname
Préfixe du nom de domaine. Dans cet exemple, saisissez
www.Query Source
Sélectionnez Default.
Record Value
Nom de domaine temporaire. Dans cet exemple, saisissez
web0.example.net.TTL
Conservez la valeur par défaut.
RemarqueL'enregistrement CNAME résout désormais
www.example.netversweb0.example.net, tandis que l'enregistrement A résoutweb0.example.netvers l'adresse IP du CLB.
Ajouter un enregistrement CNAME pour l'instance ALB
-
Exécutez la commande suivante pour obtenir le nom de domaine de l'instance ALB.
kubectl get albconfigSortie attendue.
alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.comcorrespond au nom de domaine de l'instance ALB.NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE from_nginx alb-a8mmh2tqbmrm11**** alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com 20m -
Sur la page Settings, cliquez sur Add Record. Dans le panneau Add Record, configurez les paramètres suivants et cliquez sur OK.
Paramètre
Description
Record Type
Sélectionnez CNAME.
Hostname
Préfixe du nom de domaine. Dans cet exemple, saisissez
www.Query Source
Sélectionnez Default.
Record Value
Nom de domaine de l'instance ALB.
TTL
Conservez la valeur par défaut.
Définir la pondération du trafic
Sur la page Settings, localisez l'enregistrement CNAME ajouté à l'étape précédente. Dans la colonne Actions, cliquez sur la flèche située à côté de Edit et sélectionnez Edit Record Set.
Dans le panneau Edit Record, définissez la pondération du CLB à 100 et celle de l'ALB à 0. Cliquez sur OK.
Diminuez progressivement la pondération du CLB tout en augmentant celle de l'ALB, après avoir confirmé l'absence d'impact sur l'activité.
-
Exécutez plusieurs fois la commande
digpour vérifier l'effet du basculement du trafic.[root@xxx 2uvl6raykm3Z ~]# dig www.xxx.net ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.10 <<>> www.xxx.net ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31592 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.xxx.net. IN A ;; ANSWER SECTION: www.xxx.net. 5 IN CNAME web0.xxx.net. web0.xxx.net. 5 IN A 47.xxx.144 ;; Query time: 63 msec ;; SERVER: 100.xxx.136#53(100.xxx.136) ;; WHEN: Thu Jan 19 15:46:40 CST 2023 ;; MSG SIZE rcvd: 66[root@xxx ~]# dig www.xxx.net ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.10 <<>> www.xxx.net ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14224 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.xxx.net. IN A ;; ANSWER SECTION: www.xxx.net. 5 IN CNAME alb-a8mmh2xxxm74.cn-hangzhou.alb.aliyuncs.com. alb-a8mxxxm74.cn-hangzhou.alb.aliyuncs.com. 60 IN A 116.xxx.54 alb-a8mxxxm74.cn-hangzhou.alb.aliyuncs.com. 60 IN A 118.xxx.39 ;; Query time: 4 msec ;; SERVER: 100.xxx.136#53(100.xxx.136) ;; WHEN: Thu Jan 19 15:47:52 CST 2023 ;; MSG SIZE rcvd: 128 Après vérification, réduisez progressivement la pondération du CLB à 0 et augmentez celle de l'ALB jusqu'à 100.
Étape 3 : Supprimer les ressources NGINX Ingress
Une fois toutes les connexions persistantes au NGINX Ingress fermées et aucun nouveau trafic ne lui parvenant, surveillez le système pendant une durée adaptée à votre activité avant de libérer les ressources redondantes.
Supprimez les entrées DNS liées au NGINX Ingress depuis la console Alibaba Cloud DNS.
-
Désinstallez le composant additionnel du contrôleur NGINX Ingress.
Connectez-vous à la console ACK.
Sur la page Clusters, cliquez sur le nom du cluster cible. Dans le volet de navigation de gauche, choisissez .
Localisez le NGINX Ingress. Dans la colonne Actions, choisissez
> Delete. Dans la boîte de dialogue qui s'affiche, cliquez sur Confirm Deletion.Dans le volet de navigation de gauche, choisissez Add-ons. Cliquez sur l'onglet Networking. Sur la carte NGINX Ingress controller, cliquez sur Uninstall.
-
Dans la boîte de dialogue qui s'affiche, cliquez sur OK.
La désinstallation du composant additionnel libère automatiquement l'instance CLB utilisée par le contrôleur NGINX Ingress, laquelle ne génère plus de frais.
Connectez-vous à la console Container Compute Service. Dans le volet de navigation de gauche, cliquez sur Applications > Helm et désinstallez le composant additionnel du contrôleur NGINX Ingress.
