

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.

# Automatisez le déploiement du gestionnaire de terminaison de nœuds dans Amazon EKS à l'aide d'un pipeline CI/CD
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline"></a>

*Sandip Gangapadhyay, Sandeep Gawande, Viyoma Sachdeva, Pragtideep Singh et John Vargas, Amazon Web Services*

## Résumé
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-summary"></a>

**Remarque** : AWS n' CodeCommit est plus disponible pour les nouveaux clients. Les clients actuels d'AWS CodeCommit peuvent continuer à utiliser le service normalement. [En savoir plus](https://aws.amazon.com/blogs/devops/how-to-migrate-your-aws-codecommit-repository-to-another-git-provider/)

Sur le cloud Amazon Web Services (AWS), vous pouvez utiliser [AWS Node Termination Handler](https://github.com/aws/aws-node-termination-handler), un projet open source, pour gérer avec élégance la fermeture d'une instance Amazon Elastic Compute Cloud EC2 (Amazon) dans Kubernetes. AWS Node Termination Handler permet de garantir que le plan de contrôle Kubernetes répond de manière appropriée aux événements susceptibles de rendre votre EC2 instance indisponible. Ces événements incluent les suivants :
+ [EC2 maintenance planifiée de l'instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-instances-status-check_sched.html)
+ [Interruptions des instances Amazon EC2 Spot](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html)
+ [Redimensionner le groupe Auto Scaling en](https://docs.aws.amazon.com/autoscaling/ec2/userguide/AutoScalingGroupLifecycle.html#as-lifecycle-scale-in)
+ [Rééquilibrage du groupe Auto Scaling entre](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-benefits.html#AutoScalingBehavior.InstanceUsage) les zones de disponibilité
+ EC2 résiliation de l'instance via l'API ou l'AWS Management Console

Si un événement n'est pas géré, le code de votre application risque de ne pas s'arrêter correctement. Le rétablissement de la disponibilité totale peut également prendre plus de temps ou planifier accidentellement le travail sur les nœuds en panne. Le `aws-node-termination-handler` (NTH) peut fonctionner selon deux modes différents : service de métadonnées d'instance (IMDS) ou processeur de file d'attente. Pour plus d'informations sur les deux modes, consultez le [fichier Readme](https://github.com/aws/aws-node-termination-handler#readme).

Ce modèle utilise AWS CodeCommit et automatise le déploiement de NTH en utilisant le processeur de file d'attente via un pipeline d'intégration continue et de livraison continue (CI/CD).

**Note**  
Si vous utilisez des [groupes de nœuds gérés par EKS](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html), vous n'avez pas besoin du`aws-node-termination-handler`.

## Conditions préalables et limitations
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-prereqs"></a>

**Conditions préalables**
+ Un compte AWS actif.
+ Un navigateur Web compatible avec l'AWS Management Console. Consultez la [liste des navigateurs pris en charge](https://aws.amazon.com/premiumsupport/knowledge-center/browsers-management-console/).
+ AWS Cloud Development Kit (AWS CDK) [installé.](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install)
+ `kubectl`[, l'outil de ligne de commande Kubernetes, installé.](https://kubernetes.io/docs/tasks/tools/)
+ `eksctl`[, l'interface de ligne de commande AWS (AWS CLI) pour Amazon Elastic Kubernetes Service (Amazon EKS), installée.](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html)
+ Un cluster EKS en cours d'exécution avec la version 1.20 ou ultérieure.
+ Un groupe de nœuds autogéré rattaché au cluster EKS. Pour créer un cluster Amazon EKS avec un groupe de nœuds autogéré, exécutez la commande suivante.

  ```
  eksctl create cluster --managed=false --region <region> --name <cluster_name>
  ```

  Pour plus d'informations`eksctl`, consultez la documentation [eksctl](https://eksctl.io/usage/creating-and-managing-clusters/).
+ Fournisseur AWS Identity and Access Management (IAM) OpenID Connect (OIDC) pour votre cluster. Pour plus d'informations, consultez la section [Création d'un fournisseur IAM OIDC pour votre cluster](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html).

**Limites**
+ Vous devez utiliser une région AWS qui prend en charge le service Amazon EKS.

**Versions du produit**
+ Kubernetes version 1.20 ou ultérieure
+ `eksctl`version 0.107.0 ou ultérieure
+ AWS CDK version 2.27.0 ou ultérieure

## Architecture
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-architecture"></a>

**Pile technologique cible**
+ Un cloud privé virtuel (VPC)
+ Un cluster EKS
+ Amazon Simple Queue Service (Amazon SQS)
+ IAM
+ Kubernetes

**Architecture cible******

Le schéma suivant montre une vue d'ensemble des end-to-end étapes à suivre lors du démarrage de la terminaison du nœud.

![Un VPC avec un groupe Auto Scaling, un cluster EKS avec Node Termination Handler et une file d'attente SQS.](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/970dfb73-9526-4942-a974-e8eef6416596/images/9e0125ae-d55b-49dd-ae70-ccaedf03832a.png)


Le flux de travail illustré dans le diagramme comprend les étapes de haut niveau suivantes :

1. L'événement de fin d' EC2 instance de dimensionnement automatique est envoyé à la file d'attente SQS.

1. Le NTH Pod surveille la présence de nouveaux messages dans la file d'attente SQS.

1. Le NTH Pod reçoit le nouveau message et effectue les opérations suivantes :
   + Cordonne le nœud afin que le nouveau pod ne s'exécute pas sur le nœud.
   + Draine le nœud, de sorte que le module existant soit évacué
   + Envoie un signal d'accrochage du cycle de vie au groupe Auto Scaling afin que le nœud puisse être arrêté.

**Automatisation et mise à l'échelle**
+ Le code est géré et déployé par AWS CDK, soutenu par AWS CloudFormation Nested Stacks.
+ Le [plan de contrôle Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/disaster-recovery-resiliency.html) couvre plusieurs zones de disponibilité pour garantir une haute disponibilité.
+ [Pour le [dimensionnement automatique](https://docs.aws.amazon.com/eks/latest/userguide/autoscaling.html), Amazon EKS prend en charge le Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler) et Karpenter.](https://karpenter.sh/)

## Outils
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-tools"></a>

**Services AWS**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) est un framework de développement logiciel qui vous aide à définir et à provisionner l'infrastructure du cloud AWS sous forme de code.
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) est un service de génération entièrement géré qui vous aide à compiler le code source, à exécuter des tests unitaires et à produire des artefacts prêts à être déployés.
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) est un service de contrôle de version qui vous permet de stocker et de gérer de manière privée des référentiels Git, sans avoir à gérer votre propre système de contrôle de source.
+ [AWS](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) vous CodePipeline aide à modéliser et à configurer rapidement les différentes étapes d'une version logicielle et à automatiser les étapes nécessaires à la publication continue des modifications logicielles.
+ [Amazon Elastic Kubernetes Service (Amazon](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) EKS) vous aide à exécuter Kubernetes sur AWS sans avoir à installer ou à gérer votre propre plan de contrôle ou vos propres nœuds Kubernetes.
+ [Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html) vous aide à maintenir la disponibilité des applications et vous permet d'ajouter ou de supprimer automatiquement EC2 des instances Amazon selon les conditions que vous définissez.
+ [Amazon Simple Queue Service (Amazon SQS](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)) fournit une file d'attente hébergée sécurisée, durable et disponible qui vous permet d'intégrer et de dissocier les systèmes et composants logiciels distribués.

**Autres outils**
+ [kubectl](https://kubernetes.io/docs/reference/kubectl/kubectl/) est un outil de ligne de commande Kubernetes permettant d'exécuter des commandes sur des clusters Kubernetes. Vous pouvez utiliser kubectl pour déployer des applications, inspecter et gérer les ressources du cluster et consulter les journaux.

**Code**

Le code de ce modèle est disponible dans le [deploy-nth-to-eks](https://github.com/aws-samples/deploy-nth-to-eks)dépôt sur GitHub .com. Le dépôt de code contient les fichiers et dossiers suivants.
+ `nth folder`— Le graphique Helm, les fichiers de valeurs et les scripts permettant de scanner et de déployer le CloudFormation modèle AWS pour Node Termination Handler.
+ `config/config.json`— Le fichier de paramètres de configuration de l'application. Ce fichier contient tous les paramètres nécessaires au déploiement du CDK.
+ `cdk`— Code source du kit AWS CDK.
+ `setup.sh`— Le script utilisé pour déployer l'application AWS CDK afin de créer le CI/CD pipeline requis et les autres ressources requises.
+ `uninstall.sh`— Le script utilisé pour nettoyer les ressources.

Pour utiliser l'exemple de code, suivez les instructions de la section *Epics*.

## Bonnes pratiques
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-best-practices"></a>

Pour connaître les meilleures pratiques en matière d'automatisation du gestionnaire de terminaison de nœuds AWS, consultez les pages suivantes :
+ [Guides des meilleures pratiques EKS](https://aws.github.io/aws-eks-best-practices/)
+ [Gestionnaire de terminaison de nœuds - Configuration](https://github.com/aws/aws-node-termination-handler/tree/main/config/helm/aws-node-termination-handler)

## Épopées
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-epics"></a>

### Configuration de votre environnement
<a name="set-up-your-environment"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Clonez le dépôt. | Pour cloner le dépôt à l'aide de SSH (Secure Shell), exécutez la commande suivante.<pre>git clone git@github.com:aws-samples/deploy-nth-to-eks.git</pre><br />Pour cloner le dépôt à l'aide du protocole HTTPS, exécutez la commande suivante.<pre>git clone https://github.com/aws-samples/deploy-nth-to-eks.git</pre><br />Le clonage du dépôt crée un dossier nommé. `deploy-nth-to-eks`<br />Accédez à ce répertoire.<pre>cd deploy-nth-to-eks</pre> | Développeur d'applications, AWS DevOps, DevOps ingénieur | 
| Définissez le fichier kubeconfig. | Définissez vos informations d'identification AWS dans votre terminal et confirmez que vous êtes autorisé à assumer le rôle de cluster. Vous pouvez utiliser l'exemple de code suivant.<pre>aws eks update-kubeconfig --name <Cluster_Name> --region <region>--role-arn <Role_ARN></pre> | AWS DevOps, DevOps ingénieur, développeur d'applications | 

### Déployer le CI/CD pipeline
<a name="deploy-the-ci-cd-pipeline"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Configurez les paramètres. | Dans le `config/config.json` fichier, configurez les paramètres obligatoires suivants.[See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html) | Développeur d'applications, AWS DevOps, DevOps ingénieur | 
| Créez le CI/CD pipeline pour déployer NTH. | Exécutez le script setup.sh.<pre>./setup.sh</pre><br />Le script déploiera l'application AWS CDK qui créera le CodeCommit dépôt avec un exemple de code, le pipeline et les CodeBuild projets basés sur les paramètres saisis par l'utilisateur dans `config/config.json` le fichier.<br />Ce script demandera le mot de passe lors de l'installation des packages npm avec la commande sudo. | Développeur d'applications, AWS DevOps, DevOps ingénieur | 
| Passez en revue le CI/CD pipeline. | Ouvrez la console de gestion AWS et passez en revue les ressources suivantes créées dans la pile.[See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html)<br />Une fois le pipeline exécuté avec succès, la version Helm `aws-node-termination-handler` est installée dans le cluster EKS. En outre, un Pod nommé `aws-node-termination-handler` est en cours d'exécution dans l'`kube-system`espace de noms du cluster. | Développeur d'applications, AWS DevOps, DevOps ingénieur | 

### Tester le déploiement de NTH
<a name="test-nth-deployment"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Simulez un événement de mise à l'échelle d'un groupe Auto Scaling. | Pour simuler un événement de mise à l'échelle automatique, procédez comme suit :[See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html) |  | 
| Passez en revue les journaux. | Pendant l'événement de scale-in, le NTH Pod bouclera et drainera le nœud de travail correspondant (l' EC2 instance qui sera résiliée dans le cadre de l'événement de scale-in). Pour consulter les journaux, utilisez le code de la section *Informations supplémentaires*. | Développeur d'applications, AWS DevOps, DevOps ingénieur | 

### Nettoyage
<a name="clean-up"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Nettoyez toutes les ressources AWS. | Pour nettoyer les ressources créées par ce modèle, exécutez la commande suivante.<pre>./uninstall.sh</pre><br />Cela nettoiera toutes les ressources créées dans ce modèle en supprimant la CloudFormation pile. | DevOps ingénieur | 

## Résolution des problèmes
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-troubleshooting"></a>


| Problème | Solution | 
| --- | --- | 
| Le registre npm n'est pas configuré correctement. | Lors de l'installation de cette solution, le script installe npm install pour télécharger tous les packages requis. Si, pendant l'installation, vous voyez un message indiquant « Impossible de trouver le module », le registre npm n'est peut-être pas configuré correctement. Pour voir le paramètre de registre actuel, exécutez la commande suivante.<pre>npm config get registry</pre><br />Pour définir le registre avec`https://registry.npmjs.org/`, exécutez la commande suivante.<pre>npm config set registry https://registry.npmjs.org</pre> | 
| Retardez la livraison des messages SQS. | Dans le cadre de votre dépannage, si vous souhaitez retarder la remise des messages SQS à NTH Pod, vous pouvez ajuster le paramètre de délai de livraison SQS. Pour plus d'informations, consultez les files [d'attente Amazon SQS Delay.](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html) | 

## Ressources connexes
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-resources"></a>
+ [Code source du gestionnaire de terminaison des nœuds AWS](https://github.com/aws/aws-node-termination-handler)
+ [EC2 atelier](https://ec2spotworkshops.com/using_ec2_spot_instances_with_eks/070_selfmanagednodegroupswithspot/deployhandler.html)
+ [AWS CodePipeline](https://aws.amazon.com/codepipeline/)
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://aws.amazon.com/eks/)
+ [Kit de développement AWS Cloud](https://aws.amazon.com/cdk/)
+ [AWS CloudFormation](https://aws.amazon.com/cloudformation/)

## Informations supplémentaires
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-additional"></a>

1. Trouvez le nom du NTH Pod.

```
kubectl get pods -n kube-system |grep aws-node-termination-handler
aws-node-termination-handler-65445555-kbqc7   1/1     Running   0          26m
kubectl get pods -n kube-system |grep aws-node-termination-handler
aws-node-termination-handler-65445555-kbqc7   1/1     Running   0          26m
```

2. Consultez les journaux. Un exemple de journal ressemble à ce qui suit. Cela indique que le nœud a été bouclé et vidé avant d'envoyer le signal de fin du cycle de vie du groupe Auto Scaling.

```
kubectl -n kube-system logs aws-node-termination-handler-65445555-kbqc7
022/07/17 20:20:43 INF Adding new event to the event store event={"AutoScalingGroupName":"eksctl-my-cluster-target-nodegroup-ng-10d99c89-NodeGroup-ZME36IGAP7O1","Description":"ASG Lifecycle Termination event received. Instance will be interrupted at 2022-07-17 20:20:42.702 +0000 UTC \n","EndTime":"0001-01-01T00:00:00Z","EventID":"asg-lifecycle-term-33383831316538382d353564362d343332362d613931352d383430666165636334333564","InProgress":false,"InstanceID":"i-0409f2a9d3085b80e","IsManaged":true,"Kind":"SQS_TERMINATE","NodeLabels":null,"NodeName":"ip-192-168-75-60.us-east-2.compute.internal","NodeProcessed":false,"Pods":null,"ProviderID":"aws:///us-east-2c/i-0409f2a9d3085b80e","StartTime":"2022-07-17T20:20:42.702Z","State":""}
2022/07/17 20:20:44 INF Requesting instance drain event-id=asg-lifecycle-term-33383831316538382d353564362d343332362d613931352d383430666165636334333564 instance-id=i-0409f2a9d3085b80e kind=SQS_TERMINATE node-name=ip-192-168-75-60.us-east-2.compute.internal provider-id=aws:///us-east-2c/i-0409f2a9d3085b80e
2022/07/17 20:20:44 INF Pods on node node_name=ip-192-168-75-60.us-east-2.compute.internal pod_names=["aws-node-qchsw","aws-node-termination-handler-65445555-kbqc7","kube-proxy-mz5x5"]
2022/07/17 20:20:44 INF Draining the node
2022/07/17 20:20:44 ??? WARNING: ignoring DaemonSet-managed Pods: kube-system/aws-node-qchsw, kube-system/kube-proxy-mz5x5
2022/07/17 20:20:44 INF Node successfully cordoned and drained node_name=ip-192-168-75-60.us-east-2.compute.internal reason="ASG Lifecycle Termination event received. Instance will be interrupted at 2022-07-17 20:20:42.702 +0000 UTC \n"
2022/07/17 20:20:44 INF Completed ASG Lifecycle Hook (NTH-K8S-TERM-HOOK) for instance i-0409f2a9d3085b80e
```