Automatisieren Sie die Bereitstellung von Node Termination Handler in Amazon EKS mithilfe einer CI/CD-Pipeline - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Automatisieren Sie die Bereitstellung von Node Termination Handler in Amazon EKS mithilfe einer CI/CD-Pipeline

Erstellt von Sandip Gangapadhyay (AWS), John Vargas (AWS), Pragtideep Singh (AWS), Sandeep Gawande (AWS) und Viyoma Sachdeva (AWS)

Code-Repository: Stellen Sie NTH auf EKS bereit

Umgebung: Produktion

Technologien: Container und Mikroservices; DevOps

AWS-Dienste: AWS CodePipeline; Amazon EKS; AWS CodeBuild

Übersicht

In der Amazon Web Services (AWS) Cloud können Sie AWS Node Termination Handler, ein Open-Source-Projekt, verwenden, um das Herunterfahren der Amazon Elastic Compute Cloud (Amazon EC2) -Instance innerhalb von Kubernetes problemlos zu handhaben. AWS Node Termination Handler hilft sicherzustellen, dass die Kubernetes-Steuerebene angemessen auf Ereignisse reagiert, die dazu führen können, dass Ihre EC2-Instance nicht mehr verfügbar ist. Zu diesen Ereignissen gehören die folgenden:

Wenn ein Ereignis nicht behandelt wird, wird Ihr Anwendungscode möglicherweise nicht ordnungsgemäß beendet. Es kann auch länger dauern, bis die volle Verfügbarkeit wiederhergestellt ist, oder es wird versehentlich die Arbeit an Knoten geplant, die ausfallen. Der aws-node-termination-handler (NTH) kann in zwei verschiedenen Modi betrieben werden: Instance Metadata Service (IMDS) oder Queue Processor. Weitere Informationen zu den beiden Modi finden Sie in der Readme-Datei.

Dieses Muster automatisiert die Bereitstellung von NTH mithilfe von Queue Processor über eine CI/CD-Pipeline (Continuous Integration and Continuous Delivery).

Hinweis: Wenn Sie von EKS verwaltete Knotengruppen verwenden, benötigen Sie die nicht. aws-node-termination-handler

Voraussetzungen und Einschränkungen

Voraussetzungen

Einschränkungen

  • Sie müssen eine AWS-Region verwenden, die den Amazon EKS-Service unterstützt.

Produktversionen

  • Kubernetes Version 1.20 oder höher

  • eksctlVersion 0.107.0 oder höher

  • AWS CDK Version 2.27.0 oder höher

Architektur

Zieltechnologie-Stack

  • Eine virtuelle private Cloud (VPC)

  • Ein EKS-Cluster

  • Amazon-Simple-Queue-Service (Amazon SQS)

  • IAM

  • Kubernetes

Zielarchitektur

Das folgende Diagramm zeigt eine allgemeine Ansicht der end-to-end Schritte, wenn die Knotenbeendigung gestartet wird.

Eine VPC mit einer Auto Scaling Scaling-Gruppe, einem EKS-Cluster mit Node Termination Handler und einer SQS-Warteschlange.

Der in der Abbildung gezeigte Arbeitsablauf besteht aus den folgenden allgemeinen Schritten:

  1. Das Ereignis zum Beenden der EC2-Instance mit automatischer Skalierung wird an die SQS-Warteschlange gesendet.

  2. Der NTH Pod sucht nach neuen Nachrichten in der SQS-Warteschlange.

  3. Der NTH-Pod empfängt die neue Nachricht und geht wie folgt vor:

    • Sperrt den Knoten ab, sodass der neue Pod nicht auf dem Knoten ausgeführt wird.

    • Entleert den Knoten, sodass der vorhandene Pod evakuiert wird

    • Sendet ein Lifecycle-Hook-Signal an die Auto Scaling Scaling-Gruppe, sodass der Knoten beendet werden kann.

Automatisierung und Skalierung

Tools

AWS-Services

  • Das AWS Cloud Development Kit (AWS CDK) ist ein Softwareentwicklungs-Framework, das Sie bei der Definition und Bereitstellung der AWS-Cloud-Infrastruktur im Code unterstützt.

  • AWS CodeBuild ist ein vollständig verwalteter Build-Service, der Sie beim Kompilieren von Quellcode, beim Ausführen von Komponententests und beim Erstellen von Artefakten unterstützt, die sofort einsatzbereit sind.

  • AWS CodeCommit ist ein Versionskontrollservice, mit dem Sie Git-Repositorys privat speichern und verwalten können, ohne Ihr eigenes Quellcodeverwaltungssystem verwalten zu müssen.

  • AWS CodePipeline hilft Ihnen dabei, die verschiedenen Phasen einer Softwareversion schnell zu modellieren und zu konfigurieren und die Schritte zu automatisieren, die für die kontinuierliche Veröffentlichung von Softwareänderungen erforderlich sind.

  • Amazon Elastic Kubernetes Service (Amazon EKS) hilft Ihnen, Kubernetes auf AWS auszuführen, ohne Ihre eigene Kubernetes-Steuerebene oder Knoten installieren oder verwalten zu müssen.

  • Amazon EC2 Auto Scaling hilft Ihnen dabei, die Anwendungsverfügbarkeit aufrechtzuerhalten, und ermöglicht es Ihnen, Amazon EC2 EC2-Instances gemäß den von Ihnen definierten Bedingungen automatisch hinzuzufügen oder zu entfernen.

  • Amazon Simple Queue Service (Amazon SQS) bietet eine sichere, dauerhafte und verfügbare gehostete Warteschlange, mit der Sie verteilte Softwaresysteme und -komponenten integrieren und entkoppeln können.

Andere Tools

  • kubectl ist ein Kubernetes-Befehlszeilentool zum Ausführen von Befehlen für Kubernetes-Cluster. Sie können kubectl verwenden, um Anwendungen bereitzustellen, Clusterressourcen zu überprüfen und zu verwalten und Protokolle anzuzeigen.

Code

Der Code für dieses Muster ist im deploy-nth-to-eksRepo auf .com verfügbar. GitHub Das Code-Repo enthält die folgenden Dateien und Ordner.

  • nth folder— Das Helm-Diagramm, die Wertedateien und die Skripts zum Scannen und Bereitstellen der CloudFormation AWS-Vorlage für Node Termination Handler.

  • config/config.json— Die Konfigurationsparameterdatei für die Anwendung. Diese Datei enthält alle Parameter, die für die Bereitstellung von CDK erforderlich sind.

  • cdk— AWS-CDK-Quellcode.

  • setup.sh— Das Skript, das zur Bereitstellung der AWS-CDK-Anwendung verwendet wurde, um die erforderliche CI/CD-Pipeline und andere erforderliche Ressourcen zu erstellen.

  • uninstall.sh— Das Skript, das zum Bereinigen der Ressourcen verwendet wurde.

Um den Beispielcode zu verwenden, folgen Sie den Anweisungen im Abschnitt Epics.

Bewährte Methoden

Bewährte Methoden für die Automatisierung von AWS Node Termination Handler finden Sie im Folgenden:

Epen

AufgabeBeschreibungErforderliche Fähigkeiten

Klonen Sie das Repo.

Um das Repo mithilfe von SSH (Secure Shell) zu klonen, führen Sie den folgenden Befehl aus.

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

Um das Repo mithilfe von HTTPS zu klonen, führen Sie den folgenden Befehl aus.

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

Beim Klonen des Repositorys wird ein Ordner mit dem Namen erstellt. deploy-nth-to-eks

Wechseln Sie zu diesem Verzeichnis.

cd deploy-nth-to-eks
App-Entwickler, AWS DevOps, DevOps Ingenieur

Stellen Sie die kubeconfig-Datei ein.

Geben Sie Ihre AWS-Anmeldeinformationen in Ihrem Terminal ein und bestätigen Sie, dass Sie berechtigt sind, die Cluster-Rolle zu übernehmen. Sie können den folgenden Beispielcode verwenden.

aws eks update-kubeconfig --name <Cluster_Name> --region <region>--role-arn <Role_ARN>
AWS DevOps, DevOps Ingenieur, App-Entwickler
AufgabeBeschreibungErforderliche Fähigkeiten

Richten Sie die Parameter ein.

Richten Sie in der config/config.json Datei die folgenden erforderlichen Parameter ein.

  • pipelineName: Der Name der CI/CD-Pipeline, die von AWS CDK erstellt werden soll (z. B.). deploy-nth-to-eks-pipeline AWS CodePipeline erstellt eine Pipeline mit diesem Namen.

  • repositoryName: Das CodeCommit AWS-Repo, das erstellt werden soll (zum Beispieldeploy-nth-to-eks-repo). AWS CDK erstellt dieses Repo und legt es als Quelle für die CI/CD-Pipeline fest.

    Hinweis: Diese Lösung erstellt dieses CodeCommit Repo und den Branch (im folgenden Branch-Parameter angegeben).

  • branch: Der Zweigname im Repo (zum Beispielmain). Ein Commit für diesen Branch initiiert die CI/CD-Pipeline.

  • cfn_scan_script: Der Pfad des Skripts, das verwendet wird, um die CloudFormation AWS-Vorlage nach NTH (scan.sh) zu scannen. Dieses Skript befindet sich in einem nth Ordner, der Teil des CodeCommit AWS-Repos sein wird.

  • cfn_deploy_script: Der Pfad des Skripts, das zur Bereitstellung der CloudFormation AWS-Vorlage für NTH (installApp.sh) verwendet wird.

  • stackName: Der Name des CloudFormation Stacks, der bereitgestellt werden soll.

  • eksClusterName: Der Name des vorhandenen EKS-Clusters.

  • eksClusterRole: Die IAM-Rolle, die für den Zugriff auf den EKS-Cluster für alle Kubernetes-API-Aufrufe verwendet wird (z. B.). clusteradmin Normalerweise wird diese Rolle hinzugefügt. aws-auth ConfigMap

  • create_cluster_role: Um die eksClusterRole IAM-Rolle zu erstellen, geben Sie yes ein. Wenn Sie im eksClusterRole Parameter eine vorhandene Clusterrolle angeben möchten, geben Sie nein ein.

  • create_iam_oidc_provider: Geben Sie Ja ein, um den IAM-OIDC-Anbieter für Ihren Cluster zu erstellen. Wenn bereits ein IAM-OIDC-Anbieter vorhanden ist, geben Sie nein ein. Weitere Informationen finden Sie unter Einen IAM-OIDC-Anbieter für Ihren Cluster erstellen.

  • AsgGroupName: Eine durch Kommas getrennte Liste von Auto Scaling Scaling-Gruppennamen, die Teil des EKS-Clusters sind (z. B.ASG_Group_1,ASG_Group_2).

  • region: Der Name der AWS-Region, in der sich der Cluster befindet (z. B.us-east-2).

  • install_cdk: Wenn AWS CDK derzeit nicht auf dem Computer installiert ist, geben Sie Ja ein. Führen Sie den cdk --version Befehl aus, um zu überprüfen, ob die installierte AWS-CDK-Version 2.27.0 oder höher ist. Geben Sie in diesem Fall nein ein.

    Wenn Sie Ja eingeben, führt das Skript setup.sh den sudo npm install -g cdk@2.27.0 Befehl zur Installation von AWS CDK auf dem Computer aus. Das Skript benötigt Sudo-Berechtigungen. Geben Sie daher das Kontopasswort ein, wenn Sie dazu aufgefordert werden.

App-Entwickler, AWS DevOps, DevOps Ingenieur

Erstellen Sie die CI/CD-Pipeline für die Bereitstellung von NTH.

Führen Sie das Skript setup.sh aus.

./setup.sh

Das Skript stellt die AWS-CDK-Anwendung bereit, die das CodeCommit Repo mit Beispielcode, der Pipeline und CodeBuild Projekten auf der Grundlage der Benutzereingabeparameter in config/config.json der Datei erstellt.

Dieses Skript fragt bei der Installation von npm-Paketen mit dem Befehl sudo nach dem Passwort.

App-Entwickler, AWS DevOps, DevOps Ingenieur

Überprüfen Sie die CI/CD-Pipeline.

Öffnen Sie die AWS-Managementkonsole und überprüfen Sie die folgenden Ressourcen, die im Stack erstellt wurden.

  • CodeCommit Repo mit dem Inhalt des Ordners nth

  • CodeBuild AWS-Projektcfn-scan, das die CloudFormation Vorlage auf Sicherheitslücken scannt.

  • CodeBuild ProjektNth-Deploy, das die CloudFormation AWS-Vorlage und die entsprechenden NTH Helm-Diagramme über die CodePipeline AWS-Pipeline bereitstellt.

  • Eine CodePipeline Pipeline zur Bereitstellung von NTH.

Nachdem die Pipeline erfolgreich ausgeführt wurde, aws-node-termination-handler wird die Helm-Version im EKS-Cluster installiert. Außerdem aws-node-termination-handler läuft ein Pod mit dem Namen im kube-system Namespace im Cluster.

App-Entwickler, AWS DevOps, DevOps Ingenieur
AufgabeBeschreibungErforderliche Fähigkeiten

Simulieren Sie ein Auto Scaling-Gruppen-Scale-In-Ereignis.

Gehen Sie wie folgt vor, um ein automatisches Skalierungs-Scale-In-Ereignis zu simulieren:

  1. Öffnen Sie auf der AWS-Konsole die EC2-Konsole und wählen Sie Auto Scaling Groups aus.

  2. Wählen Sie die Auto Scaling Scaling-Gruppe aus, die denselben Namen wie die unter hatconfig/config.json, und klicken Sie auf Bearbeiten.

  3. Verringern Sie die gewünschte Kapazität und die Mindestkapazität um 1.

  4. Wählen Sie Aktualisieren.

Überprüfen Sie die Protokolle.

Während des Scale-In-Ereignisses sperrt und entlädt der NTH-Pod den entsprechenden Worker-Knoten (die EC2-Instance, die im Rahmen des Scale-In-Ereignisses beendet wird). Verwenden Sie den Code im Abschnitt Zusätzliche Informationen, um die Protokolle zu überprüfen.

App-Entwickler, AWS DevOps, DevOps Ingenieur
AufgabeBeschreibungErforderliche Fähigkeiten

Bereinigen Sie alle AWS-Ressourcen.

Führen Sie den folgenden Befehl aus, um die nach diesem Muster erstellten Ressourcen zu bereinigen.

./uninstall.sh

Dadurch werden alle in diesem Muster erstellten Ressourcen bereinigt, indem der CloudFormation Stapel gelöscht wird.

DevOps Ingenieur

Fehlerbehebung

ProblemLösung

Die NPM-Registrierung ist nicht richtig eingestellt.

Während der Installation dieser Lösung installiert das Skript npm install, um alle erforderlichen Pakete herunterzuladen. Wenn Sie während der Installation die Meldung „Modul kann nicht gefunden werden“ sehen, ist die npm-Registrierung möglicherweise nicht richtig eingerichtet. Führen Sie den folgenden Befehl aus, um die aktuelle Registrierungseinstellung zu sehen.

npm config get registry

Führen Sie den folgenden Befehl aushttps://registry.npmjs.org/, um die Registrierung mit einzurichten.

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

Verzögern Sie die SQS-Nachrichtenzustellung.

Wenn Sie die SQS-Nachrichtenzustellung an den NTH Pod verzögern möchten, können Sie im Rahmen Ihrer Problembehandlung den Parameter für die Verzögerung der SQS-Zustellung anpassen. Weitere Informationen finden Sie unter Amazon SQS SQS-Verzögerungswarteschlangen.

Zugehörige Ressourcen

Zusätzliche Informationen

1. Finden Sie den Namen des NTH-Pods.

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. Überprüfen Sie die Protokolle. Ein Beispielprotokoll sieht wie folgt aus. Es zeigt, dass der Knoten gesperrt und entleert wurde, bevor das Signal zum Abschluss des Auto Scaling Scaling-Gruppenlebenszyklus-Hooks gesendet wurde.

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