Migrer les contrôleurs d'entrée NGINX lors de l'activation du mode automatique Amazon EKS - Recommandations AWS

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Migrer les contrôleurs d'entrée NGINX lors de l'activation du mode automatique Amazon EKS

Créée par Olawale Olaleye (AWS) et Shamanth Devagari (AWS)

Récapitulatif

Le mode automatique EKS pour Amazon Elastic Kubernetes Service (Amazon EKS) peut réduire la charge opérationnelle liée à l'exécution de vos charges de travail sur des clusters Kubernetes. Ce mode AWS permet également de configurer et de gérer l'infrastructure en votre nom. Lorsque vous activez le mode automatique EKS sur un cluster existant, vous devez planifier soigneusement la migration des configurations du contrôleur d'entrée NGINX. Cela est dû au fait que le transfert direct d'équilibreurs de charge réseau n'est pas possible.

Vous pouvez utiliser une stratégie de déploiement bleu/vert pour migrer une instance de NGINX Ingress Controller lorsque vous activez le mode automatique EKS dans un cluster Amazon EKS existant.

Conditions préalables et limitations

Prérequis

Architecture

Un déploiement bleu/vert est une stratégie de déploiement dans laquelle vous créez deux environnements distincts mais identiques. Les déploiements bleu/vert offrent des fonctionnalités de lancement et de restauration quasi nulles. L'idée fondamentale est de transférer le trafic entre deux environnements identiques qui exécutent des versions différentes de votre application.

L'image suivante montre la migration des équilibreurs de charge réseau à partir de deux instances différentes de NGINX Ingress Controller lors de l'activation du mode automatique EKS. Vous utilisez un déploiement bleu/vert pour transférer le trafic entre les deux équilibreurs de charge réseau.

Utilisation d'une stratégie de déploiement bleu/vert pour migrer les instances de NGINX Ingress Controller.

L'espace de noms d'origine est l'espace de noms bleu. C'est ici que s'exécutent le service et l'instance NGINX Ingress Controller d'origine, avant que vous n'activiez le mode automatique EKS. Le service et l'instance d'origine se connectent à un Network Load Balancer dont le nom DNS est configuré dans Route 53. Le AWS Load Balancer Controller a déployé ce Network Load Balancer dans le cloud privé virtuel (VPC) cible.

Le schéma montre le flux de travail suivant pour configurer un environnement pour un déploiement bleu/vert :

  1. Installez et configurez une autre instance de NGINX Ingress Controller dans un espace de noms différent, un espace de noms vert.

  2. Dans Route 53, configurez un nom DNS pour un nouveau Network Load Balancer.

Outils

Services AWS

  • Amazon Elastic Kubernetes Service (Amazon EKS) vous permet d'exécuter AWS Kubernetes sans avoir à installer ou à gérer votre propre plan de contrôle ou vos propres nœuds Kubernetes.

  • Elastic Load Balancing répartit le trafic applicatif ou réseau entrant sur plusieurs cibles. Par exemple, vous pouvez répartir le trafic entre les instances, les conteneurs et les adresses IP d'Amazon Elastic Compute Cloud (Amazon EC2) dans une ou plusieurs zones de disponibilité.

  • Amazon Route 53 est un service Web DNS hautement disponible et évolutif.

  • Amazon Virtual Private Cloud (Amazon VPC) vous aide à lancer AWS des ressources dans un réseau virtuel que vous avez défini. Ce réseau virtuel ressemble à un réseau traditionnel que vous pourriez exécuter dans votre propre centre de données et présente l'avantage d'utiliser l'infrastructure évolutive d' AWS.

Autres outils

  • Helm est un gestionnaire de packages open source pour Kubernetes qui vous aide à installer et à gérer des applications sur votre cluster Kubernetes.

  • kubectl est une interface de ligne de commande qui vous permet d'exécuter des commandes sur des clusters Kubernetes.

  • Le NGINX Ingress Controller connecte les applications et les services Kubernetes à la gestion des demandes, à l'authentification, aux ressources personnalisées en libre-service et au débogage.

Épopées

TâcheDescriptionCompétences requises

Vérifiez que l'instance NGINX Ingress Controller d'origine est opérationnelle.

Entrez la commande suivante pour vérifier que les ressources de l'espace de ingress-nginx noms sont opérationnelles. Si vous avez déployé NGINX Ingress Controller dans un autre espace de noms, mettez à jour le nom de l'espace de noms dans cette commande.

kubectl get all -n ingress-nginx

Dans le résultat, vérifiez que les pods du NGINX Ingress Controller sont en cours d'exécution. Voici un exemple de résultat :

NAME READY STATUS RESTARTS AGE pod/ingress-nginx-admission-create-xqn9d 0/1 Completed 0 88m pod/ingress-nginx-admission-patch-lhk4j 0/1 Completed 1 88m pod/ingress-nginx-controller-68f68f859-xrz74 1/1 Running 2 (10m ago) 72m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/ingress-nginx-controller LoadBalancer 10.100.67.255 k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com 80:30330/TCP,443:31462/TCP 88m service/ingress-nginx-controller-admission ClusterIP 10.100.201.176 <none> 443/TCP 88m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/ingress-nginx-controller 1/1 1 1 88m NAME DESIRED CURRENT READY AGE replicaset.apps/ingress-nginx-controller-68f68f859 1 1 1 72m replicaset.apps/ingress-nginx-controller-d8c96cf68 0 0 0 88m NAME STATUS COMPLETIONS DURATION AGE job.batch/ingress-nginx-admission-create Complete 1/1 4s 88m job.batch/ingress-nginx-admission-patch Complete 1/1 5s 88m
DevOps ingénieur
TâcheDescriptionCompétences requises

Créez les ressources Kubernetes.

Entrez les commandes suivantes pour créer un exemple de déploiement, de service et d'entrée Kubernetes :

kubectl create deployment demo --image=httpd --port=80
kubectl expose deployment demo
kubectl create ingress demo --class=nginx \ --rule nginxautomode.local.dev/=demo:80
DevOps ingénieur

Passez en revue les ressources déployées.

Entrez la commande suivante pour afficher la liste des ressources déployées :

kubectl get all,ingress

Dans le résultat, vérifiez que le HTTPd module d'échantillonnage est en cours d'exécution. Voici un exemple de résultat :

NAME READY STATUS RESTARTS AGE pod/demo-7d94f8cb4f-q68wc 1/1 Running 0 59m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/demo ClusterIP 10.100.78.155 <none> 80/TCP 59m service/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 117m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/demo 1/1 1 1 59m NAME DESIRED CURRENT READY AGE replicaset.apps/demo-7d94f8cb4f 1 1 1 59m NAME CLASS HOSTS ADDRESS PORTS AGE ingress.networking.k8s.io/demo nginx nginxautomode.local.dev k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com 80 56m
DevOps ingénieur

Vérifiez que le service est joignable.

Entrez la commande suivante pour vérifier que le service est accessible via le nom DNS du Network Load Balancer :

curl -H "Host: nginxautomode.local.dev" http://k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com

Le résultat attendu est le suivant :

<html><body><h1>It works!</h1></body></html>
DevOps ingénieur

(Facultatif) Créez un enregistrement DNS.

  1. Suivez les instructions de la section Création d'enregistrements à l'aide de la console Amazon Route 53 (documentation Route 53) pour créer un enregistrement DNS pour le domaine configuré.

  2. Entrez la commande suivante pour confirmer que le service est accessible via le nom de domaine configuré :

    curl "http://nginxautomode.local.dev/?[1-5]"

    Le résultat attendu est le suivant :

    <html><body><h1>It works!</h1></body></html> <html><body><h1>It works!</h1></body></html> <html><body><h1>It works!</h1></body></html> <html><body><h1>It works!</h1></body></html> <html><body><h1>It works!</h1></body></html>
DevOps ingénieur, AWS DevOps
TâcheDescriptionCompétences requises

Activez le mode automatique EKS.

Suivez les instructions de la section Activer le mode automatique EKS sur un cluster existant (documentation Amazon EKS).

AWS DevOps
TâcheDescriptionCompétences requises

Configurez une nouvelle instance de NGINX Ingress Controller.

  1. Téléchargez le modèle deploy.yaml.

  2. Ouvrez le modèle deploy.yaml dans votre éditeur préféré.

  3. Dans la kind: Namespace section, entrez un nom unique pour l'espace de noms, tel que : ingress-nginx-v2

    apiVersion: v1 kind: Namespace metadata: labels: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-v2
  4. Pour chaque section, mettez à jour la namespace valeur avec le nouveau nom.

  5. Dans la section kind: Deployment, effectuez les opérations suivantes :

    1. Entrez une valeur unique pour--controller-class, telle quek8s.io/ingress-nginx-v2.

    2. Entrez une valeur unique pour--ingress-class, telle quenginx-v2.

    apiVersion: apps/v1 kind: Deployment name: ingress-nginx-controller namespace: ingress-nginx-v2 ... spec: containers: - args: - /nginx-ingress-controller - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller - --election-id=ingress-nginx-leader - --controller-class=k8s.io/ingress-nginx-v2 - --ingress-class=nginx-v2
  6. Dans la kind: IngressClass section, entrez les mêmes valeurs pour --controller-class et celles --ingress-class que vous avez utilisées dans la section précédente :

    apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.12.0 name: nginx-v2 spec: controller: k8s.io/ingress-nginx-v2
  7. Dans la section suivante, ajoutez loadBalancerClass: eks.amazonaws.com/nlb pour provisionner un Network Load Balancer pour l'instance NGINX Ingress Controller :

    apiVersion: v1 kind: Service metadata: name: ingress-nginx-controller namespace: ingress-nginx-v2 spec: ... selector: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx type: LoadBalancer loadBalancerClass: eks.amazonaws.com/nlb
  8. Enregistrez et fermez le modèle deploy.yaml.

DevOps ingénieur

Déployez la nouvelle instance NGINX Instance Controller.

Entrez la commande suivante pour appliquer le fichier manifeste modifié :

kubectl apply -f deploy.yaml
DevOps ingénieur

Confirmez le déploiement réussi.

Entrez la commande suivante pour vérifier que les ressources de l'espace de ingress-nginx-v2 noms sont opérationnelles :

kubectl get all -n ingress-nginx-v2

Dans le résultat, vérifiez que les pods du NGINX Ingress Controller sont en cours d'exécution. Voici un exemple de résultat :

NAME READY STATUS RESTARTS AGE pod/ingress-nginx-admission-create-7shrj 0/1 Completed 0 24s pod/ingress-nginx-admission-patch-vkxr5 0/1 Completed 1 24s pod/ingress-nginx-controller-757bfcbc6d-4fw52 1/1 Running 0 24s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/ingress-nginx-controller LoadBalancer 10.100.208.114 k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com 80:31469/TCP,443:30658/TCP 24s service/ingress-nginx-controller-admission ClusterIP 10.100.150.114 <none> 443/TCP 24s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/ingress-nginx-controller 1/1 1 1 24s NAME DESIRED CURRENT READY AGE replicaset.apps/ingress-nginx-controller-757bfcbc6d 1 1 1 24s NAME STATUS COMPLETIONS DURATION AGE job.batch/ingress-nginx-admission-create Complete 1/1 4s 24s job.batch/ingress-nginx-admission-patch Complete 1/1 5s 24s
DevOps ingénieur

Créez une nouvelle entrée pour l'exemple de HTTPd charge de travail.

Entrez la commande suivante pour créer une nouvelle entrée pour l'exemple de HTTPd charge de travail existant :

kubectl create ingress demo-new --class=nginx-v2 \ --rule nginxautomode.local.dev/=demo:80
DevOps ingénieur

Vérifiez que la nouvelle entrée fonctionne.

Entrez la commande suivante pour vérifier que la nouvelle entrée fonctionne :

curl -H "Host: nginxautomode.local.dev" k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com

Le résultat attendu est le suivant :

<html><body><h1>It works!</h1></body></html>
DevOps ingénieur
TâcheDescriptionCompétences requises

Passez au nouvel espace de noms.

  1. (Facultatif) Suivez les instructions de la section Modification des enregistrements (documentation Route 53) pour mettre à jour l'enregistrement DNS.

  2. Lorsque vous avez confirmé que la nouvelle instance de NGINX Ingress Controller fonctionne comme prévu, supprimez l'original.

  3. Supprimez le Load AWS Balancer Controller autogéré. Pour obtenir des instructions, consultez Migrer des applications depuis le contrôleur d'entrée ALB obsolète (documentation Amazon EKS).

  4. Videz les groupes de nœuds gérés. Pour obtenir des instructions, consultez Supprimer et vider des groupes de nœuds (documentation eksctl).

AWS DevOps, DevOps ingénieur

Passez en revue les deux entrées.

Entrez la commande suivante pour passer en revue les deux entrées créées pour l'exemple de HTTPd charge de travail :

kubectl get ingress

Voici un exemple de résultat :

NAME CLASS HOSTS ADDRESS PORTS AGE demo nginx nginxautomode.local.dev k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com 80 95m demo-new nginx-v2 nginxautomode.local.dev k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com 80 33s
DevOps ingénieur

Ressources connexes