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: | 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
Auto Scaling Scaling-Gruppen-Rebalancing zwischen Availability Zones
Kündigung der EC2-Instance über die API oder die AWS-Managementkonsole
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
Ein aktives AWS-Konto.
Ein Webbrowser, der für die Verwendung mit der AWS-Managementkonsole unterstützt wird. Sehen Sie sich die Liste der unterstützten Browser
an. Das AWS Cloud Development Kit (AWS CDK) ist installiert.
Ein laufender EKS-Cluster mit Version 1.20 oder höher.
Eine selbstverwaltete Knotengruppe, die an den EKS-Cluster angehängt ist. Führen Sie den folgenden Befehl aus, um einen Amazon EKS-Cluster mit einer selbstverwalteten Knotengruppe zu erstellen.
eksctl create cluster --managed=false --region <region> --name <cluster_name>
Weitere Informationen dazu finden Sie in
eksctl
der eksctl-Dokumentation. AWS Identity and Access Management (IAM) OpenID Connect (OIDC) -Anbieter für Ihren Cluster. Weitere Informationen finden Sie unter Einen IAM-OIDC-Anbieter für Ihren Cluster erstellen.
Einschränkungen
Sie müssen eine AWS-Region verwenden, die den Amazon EKS-Service unterstützt.
Produktversionen
Kubernetes Version 1.20 oder höher
eksctl
Version 0.107.0 oder höherAWS 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.](images/pattern-img/970dfb73-9526-4942-a974-e8eef6416596/images/9e0125ae-d55b-49dd-ae70-ccaedf03832a.png)
Der in der Abbildung gezeigte Arbeitsablauf besteht aus den folgenden allgemeinen Schritten:
Das Ereignis zum Beenden der EC2-Instance mit automatischer Skalierung wird an die SQS-Warteschlange gesendet.
Der NTH Pod sucht nach neuen Nachrichten in der SQS-Warteschlange.
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
Code wird von AWS CDK verwaltet und bereitgestellt, unterstützt durch AWS CloudFormation Nested Stacks.
Die Amazon EKS-Kontrollebene läuft über mehrere Availability Zones, um eine hohe Verfügbarkeit zu gewährleisten.
Für die automatische Skalierung unterstützt Amazon EKS den Kubernetes Cluster Autoscaler
und Karpenter.
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-eks
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
Aufgabe | Beschreibung | Erforderliche Fähigkeiten |
---|---|---|
Klonen Sie das Repo. | Um das Repo mithilfe von SSH (Secure Shell) zu klonen, führen Sie den folgenden Befehl aus.
Um das Repo mithilfe von HTTPS zu klonen, führen Sie den folgenden Befehl aus.
Beim Klonen des Repositorys wird ein Ordner mit dem Namen erstellt. Wechseln Sie zu diesem Verzeichnis.
| 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 DevOps, DevOps Ingenieur, App-Entwickler |
Aufgabe | Beschreibung | Erforderliche Fähigkeiten |
---|---|---|
Richten Sie die Parameter ein. | Richten Sie in der
| 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.
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 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.
Nachdem die Pipeline erfolgreich ausgeführt wurde, | App-Entwickler, AWS DevOps, DevOps Ingenieur |
Aufgabe | Beschreibung | Erforderliche 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:
| |
Ü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 |
Aufgabe | Beschreibung | Erforderliche Fähigkeiten |
---|---|---|
Bereinigen Sie alle AWS-Ressourcen. | Führen Sie den folgenden Befehl aus, um die nach diesem Muster erstellten Ressourcen zu bereinigen.
Dadurch werden alle in diesem Muster erstellten Ressourcen bereinigt, indem der CloudFormation Stapel gelöscht wird. | DevOps Ingenieur |
Fehlerbehebung
Problem | Lö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.
Führen Sie den folgenden Befehl aus
|
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