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
Créée par Sandip Gangapadhyay (AWS), John Vargas (AWS), Pragtideep Singh (AWS), Sandeep Gawande (AWS) et Viyoma Sachdeva (AWS)
Référentiel de code : Déployer NTH sur EKS | Environnement : Production | Technologies : conteneurs et microservices ; DevOps |
Services AWS : AWS CodePipeline ; Amazon EKS ; AWS CodeBuild |
Récapitulatif
Sur le cloud Amazon Web Services (AWS), vous pouvez utiliser AWS Node Termination Handler
Rééquilibrage du groupe Auto Scaling entre les zones de disponibilité
Résiliation de l'instance EC2 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
Ce modèle 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).
Remarque : Si vous utilisez des groupes de nœuds gérés par EKS, vous n'avez pas besoin duaws-node-termination-handler
.
Conditions préalables et limitations
Prérequis
Un compte AWS actif.
Un navigateur Web compatible avec l'AWS Management Console. Consultez la liste des navigateurs pris en charge
. AWS Cloud Development Kit (AWS CDK) installé.
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. 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.
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érieureAWS CDK version 2.27.0 ou ultérieure
Architecture
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.](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 :
L'événement de fin d'instance EC2 de dimensionnement automatique est envoyé à la file d'attente SQS.
Le NTH Pod surveille la présence de nouveaux messages dans la file d'attente SQS.
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 évolutivité
Le code est géré et déployé par AWS CDK, soutenu par AWS CloudFormation Nested Stacks.
Le plan de contrôle Amazon EKS s'exécute sur plusieurs zones de disponibilité afin de garantir une haute disponibilité.
Pour le dimensionnement automatique, Amazon EKS prend en charge le Kubernetes Cluster Autoscaler
et Karpenter.
Outils
Services AWS
AWS Cloud Development Kit (AWS CDK) 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 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 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 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 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 vous aide à maintenir la disponibilité des applications et vous permet d'ajouter ou de supprimer automatiquement des instances Amazon EC2 selon les conditions que vous définissez.
Amazon Simple Queue Service (Amazon SQS) 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
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
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 pipeline CI/CD 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
Pour connaître les meilleures pratiques en matière d'automatisation du gestionnaire de terminaison de nœuds AWS, consultez les pages suivantes :
Épopées
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.
Pour cloner le dépôt à l'aide du protocole HTTPS, exécutez la commande suivante.
Le clonage du dépôt crée un dossier nommé. Accédez à ce répertoire.
| 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.
| AWS DevOps, DevOps ingénieur, développeur d'applications |
Tâche | Description | Compétences requises |
---|---|---|
Configurez les paramètres. | Dans le
| Développeur d'applications, AWS DevOps, DevOps ingénieur |
Créez le pipeline CI/CD pour déployer NTH. | Exécutez le script setup.sh.
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 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 pipeline CI/CD. | Ouvrez la console de gestion AWS et passez en revue les ressources suivantes créées dans la pile.
Une fois le pipeline exécuté avec succès, la version Helm | Développeur d'applications, AWS DevOps, DevOps ingénieur |
Tâche | Description | Compétences requises |
---|---|---|
Simulez un événement de scale-in du groupe Auto Scaling. | Pour simuler un événement de mise à l'échelle automatique, procédez comme suit :
| |
Consultez les journaux. | Pendant l'événement de scale-in, le NTH Pod bouclera et videra le nœud de travail correspondant (l'instance EC2 qui sera interrompue 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 |
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.
Cela nettoiera toutes les ressources créées dans ce modèle en supprimant la CloudFormation pile. | DevOps ingénieur |
Résolution des problèmes
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.
Pour définir le registre avec
|
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. |
Ressources connexes
Informations supplémentaires
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