Automatisez le déploiement du gestionnaire de terminaison de nœuds dans Amazon EKS à l'aide d'un pipeline CI/CD - 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.

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, un projet open source, pour gérer correctement la fermeture d'une instance Amazon Elastic Compute Cloud (Amazon EC2) 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 instance EC2 indisponible. Ces événements incluent les suivants :

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

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

  • eksctlversion 0.107.0 ou ultérieure

  • AWS 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.

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

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

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

  3. 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é

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-eksdé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 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âcheDescriptionCompétences requises

Clonez le dépôt.

Pour cloner le dépôt à l'aide de SSH (Secure Shell), exécutez la commande suivante.

git clone git@github.com:aws-samples/deploy-nth-to-eks.git

Pour cloner le dépôt à l'aide du protocole HTTPS, exécutez la commande suivante.

git clone https://github.com/aws-samples/deploy-nth-to-eks.git

Le clonage du dépôt crée un dossier nommé. deploy-nth-to-eks

Accédez à ce répertoire.

cd deploy-nth-to-eks
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 eks update-kubeconfig --name <Cluster_Name> --region <region>--role-arn <Role_ARN>
AWS DevOps, DevOps ingénieur, développeur d'applications
TâcheDescriptionCompétences requises

Configurez les paramètres.

Dans le config/config.json fichier, configurez les paramètres obligatoires suivants.

  • pipelineName: nom du pipeline CI/CD à créer par AWS CDK (par exemple,). deploy-nth-to-eks-pipeline AWS CodePipeline créera un pipeline portant ce nom.

  • repositoryName: Le CodeCommit dépôt AWS à créer (par exemple,deploy-nth-to-eks-repo). AWS CDK créera ce dépôt et le définira comme source pour le pipeline CI/CD.

    Remarque : Cette solution créera ce CodeCommit dépôt et la branche (fournis dans le paramètre de branche suivant).

  • branch: le nom de la branche dans le dépôt (par exemple,main). Un commit dans cette branche lancera le pipeline CI/CD.

  • cfn_scan_script: chemin du script qui sera utilisé pour scanner le CloudFormation modèle AWS pour NTH (scan.sh). Ce script existe dans nth le dossier qui fera partie du CodeCommit dépôt AWS.

  • cfn_deploy_script : chemin du script qui sera utilisé pour déployer le CloudFormation modèle AWS pour NTH (installApp.sh).

  • stackName: nom de la CloudFormation pile à déployer.

  • eksClusterName: nom du cluster EKS existant.

  • eksClusterRole: rôle IAM qui sera utilisé pour accéder au cluster EKS pour tous les appels d'API Kubernetes (par exemple,). clusteradmin Ce rôle est généralement ajouté aws-authConfigMap.

  • create_cluster_role: Pour créer le rôle eksClusterRole IAM, entrez yes. Si vous souhaitez fournir un rôle de cluster existant dans le eksClusterRole paramètre, entrez no.

  • create_iam_oidc_provider: Pour créer le fournisseur IAM OIDC pour votre cluster, entrez yes. Si un fournisseur IAM OIDC existe déjà, entrez le numéro. Pour plus d'informations, consultez la section Création d'un fournisseur IAM OIDC pour votre cluster.

  • AsgGroupName: liste séparée par des virgules des noms de groupes Auto Scaling qui font partie du cluster EKS (par exemple,ASG_Group_1,ASG_Group_2).

  • region: nom de la région AWS où se trouve le cluster (par exemple,us-east-2).

  • install_cdk: si AWS CDK n'est pas actuellement installé sur la machine, entrez yes. Exécutez la cdk --version commande pour vérifier si la version installée du CDK AWS est la version 2.27.0 ou ultérieure. Dans ce cas, entrez le numéro.

    Si vous entrez « oui », le script setup.sh exécutera la sudo npm install -g cdk@2.27.0 commande pour installer AWS CDK sur la machine. Le script nécessite des autorisations sudo. Entrez donc le mot de passe du compte lorsque vous y êtes invité.

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.

./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 config/config.json le fichier.

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.

  • CodeCommit dépôt avec le contenu du dossier nth

  • CodeBuild projet AWScfn-scan, qui analysera le CloudFormation modèle à la recherche de vulnérabilités.

  • CodeBuild projetNth-Deploy, qui déploiera le CloudFormation modèle AWS et les cartes NTH Helm correspondantes via le CodePipeline pipeline AWS.

  • Un CodePipeline pipeline pour déployer NTH.

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-systemespace de noms du cluster.

Développeur d'applications, AWS DevOps, DevOps ingénieur
TâcheDescriptionCompé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 :

  1. Sur la console AWS, ouvrez la console EC2 et choisissez Auto Scaling Groups.

  2. Sélectionnez le groupe Auto Scaling portant le même nom que celui indiqué dansconfig/config.json, puis choisissez Edit.

  3. Diminuez la capacité souhaitée et minimale de 1.

  4. Choisissez Mettre à jour.

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âcheDescriptionCompétences requises

Nettoyez toutes les ressources AWS.

Pour nettoyer les ressources créées par ce modèle, exécutez la commande suivante.

./uninstall.sh

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èmeSolution

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.

npm config get registry

Pour définir le registre avechttps://registry.npmjs.org/, exécutez la commande suivante.

npm config set registry https://registry.npmjs.org

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