

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
<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 und John Vargas, Amazon Web Services*

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

**Hinweis**: AWS CodeCommit ist für Neukunden nicht mehr verfügbar. Bestandskunden von AWS CodeCommit können den Service weiterhin wie gewohnt nutzen. [Weitere Informationen](https://aws.amazon.com/blogs/devops/how-to-migrate-your-aws-codecommit-repository-to-another-git-provider/)

In der Amazon Web Services (AWS) Cloud können Sie [AWS Node Termination Handler](https://github.com/aws/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:
+ [EC2 geplante Wartung der Instanz](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-instances-status-check_sched.html)
+ [Unterbrechungen der Amazon EC2 Spot-Instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html)
+ [Auto Scaling Scaling-Gruppenskalierung](https://docs.aws.amazon.com/autoscaling/ec2/userguide/AutoScalingGroupLifecycle.html#as-lifecycle-scale-in)
+ [Auto Scaling Scaling-Gruppen-Rebalancing zwischen](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-benefits.html#AutoScalingBehavior.InstanceUsage) Availability Zones
+ EC2 Kündigung der Instanz ü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](https://github.com/aws/aws-node-termination-handler#readme).

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

**Anmerkung**  
Wenn Sie von [EKS verwaltete Knotengruppen verwenden, benötigen](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html) Sie die nicht. `aws-node-termination-handler`

## Voraussetzungen und Einschränkungen
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-prereqs"></a>

**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](https://aws.amazon.com/premiumsupport/knowledge-center/browsers-management-console/) an.
+ Das AWS Cloud Development Kit (AWS CDK) ist [installiert](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install).
+ `kubectl`[, das Kubernetes-Befehlszeilentool, installiert.](https://kubernetes.io/docs/tasks/tools/)
+ `eksctl`[, die AWS-Befehlszeilenschnittstelle (AWS CLI) für Amazon Elastic Kubernetes Service (Amazon EKS), installiert.](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html)
+ 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](https://eksctl.io/usage/creating-and-managing-clusters/).
+ 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](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html).

**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öher
+ AWS CDK Version 2.27.0 oder höher

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

**Zieltechnologie-Stack**
+ Eine Virtual 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.](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/images/pattern-img/970dfb73-9526-4942-a974-e8eef6416596/images/9e0125ae-d55b-49dd-ae70-ccaedf03832a.png)


Der im Diagramm dargestellte Arbeitsablauf besteht aus den folgenden allgemeinen Schritten:

1. Das Ereignis EC2 zum Beenden der automatischen Skalierungsinstanz wird an die SQS-Warteschlange gesendet.

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

1. 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**
+ Der Code wird von AWS CDK verwaltet und bereitgestellt, unterstützt durch AWS CloudFormation Nested Stacks.
+ Die [Amazon EKS-Kontrollebene](https://docs.aws.amazon.com/eks/latest/userguide/disaster-recovery-resiliency.html) läuft über mehrere Availability Zones, um eine hohe Verfügbarkeit zu gewährleisten.
+ [Für die [automatische Skalierung](https://docs.aws.amazon.com/eks/latest/userguide/autoscaling.html) unterstützt Amazon EKS den Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler) und Karpenter.](https://karpenter.sh/)

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

**AWS-Services**
+ Das [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) ist ein Softwareentwicklungs-Framework, das Sie bei der Definition und Bereitstellung der AWS-Cloud-Infrastruktur im Code unterstützt.
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) ist ein vollständig verwalteter Build-Service, mit dem Sie Quellcode kompilieren, Komponententests ausführen und bereitstellungsbereite Artefakte erstellen können.
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) ist ein Versionskontrollservice, mit dem Sie Git-Repositorys privat speichern und verwalten können, ohne Ihr eigenes Quellcodeverwaltungssystem verwalten zu müssen.
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 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)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) hilft Ihnen, Kubernetes auf AWS auszuführen, ohne Ihre eigene Kubernetes-Steuerebene oder Knoten installieren oder verwalten zu müssen.
+ [Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html) hilft Ihnen dabei, die Anwendungsverfügbarkeit aufrechtzuerhalten, und ermöglicht es Ihnen, EC2 Amazon-Instances gemäß den von Ihnen definierten Bedingungen automatisch hinzuzufügen oder zu entfernen.
+ [Amazon Simple Queue Service (Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) bietet eine sichere, dauerhafte und verfügbare gehostete Warteschlange, mit der Sie verteilte Softwaresysteme und -komponenten integrieren und entkoppeln können.

**Andere Tools**
+ [kubectl](https://kubernetes.io/docs/reference/kubectl/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](https://github.com/aws-samples/deploy-nth-to-eks)Repo 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*.

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

Bewährte Methoden für die Automatisierung von AWS Node Termination Handler finden Sie im Folgenden:
+ [EKS-Leitfäden mit bewährten Methoden](https://aws.github.io/aws-eks-best-practices/)
+ [Node Termination Handler — Konfiguration](https://github.com/aws/aws-node-termination-handler/tree/main/config/helm/aws-node-termination-handler)

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

### So richten Sie Ihre Umgebung ein
<a name="set-up-your-environment"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Klonen Sie das Repo. | Um das Repo mithilfe von SSH (Secure Shell) zu klonen, führen Sie den folgenden Befehl aus.<pre>git clone git@github.com:aws-samples/deploy-nth-to-eks.git</pre><br />Um das Repo mithilfe von HTTPS zu klonen, führen Sie den folgenden Befehl aus.<pre>git clone https://github.com/aws-samples/deploy-nth-to-eks.git</pre><br />Beim Klonen des Repos wird ein Ordner mit dem Namen erstellt. `deploy-nth-to-eks`<br />Wechseln Sie zu diesem Verzeichnis.<pre>cd deploy-nth-to-eks</pre> | 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.<pre>aws eks update-kubeconfig --name <Cluster_Name> --region <region>--role-arn <Role_ARN></pre> | AWS DevOps, DevOps Ingenieur, App-Entwickler | 

### Stellen Sie die CI/CD Pipeline bereit
<a name="deploy-the-ci-cd-pipeline"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Richten Sie die Parameter ein. | Richten Sie in der `config/config.json` Datei die folgenden erforderlichen Parameter ein.[See the AWS documentation website for more details](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html) | 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.<pre>./setup.sh</pre><br />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.<br />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.[See the AWS documentation website for more details](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html)<br />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 | 

### Testen Sie die NTH-Bereitstellung
<a name="test-nth-deployment"></a>


| Aufgabe | Description | 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:[See the AWS documentation website for more details](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html) |  | 
| Überprüfen Sie die Protokolle. | Während des Scale-In-Ereignisses sperrt der NTH-Pod den entsprechenden Worker-Knoten ab und entleert ihn (die EC2 Instanz, 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 | 

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


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Bereinigen Sie alle AWS-Ressourcen. | Führen Sie den folgenden Befehl aus, um die nach diesem Muster erstellten Ressourcen zu bereinigen.<pre>./uninstall.sh</pre><br />Dadurch werden alle in diesem Muster erstellten Ressourcen bereinigt, indem der CloudFormation Stapel gelöscht wird. | DevOps Ingenieur | 

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


| 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.<pre>npm config get registry</pre><br />Führen Sie den folgenden Befehl aus`https://registry.npmjs.org/`, um die Registrierung mit einzurichten.<pre>npm config set registry https://registry.npmjs.org</pre> | 
| 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](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html). | 

## Zugehörige Ressourcen
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-resources"></a>
+ [Quellcode für den AWS Node Termination Handler](https://github.com/aws/aws-node-termination-handler)
+ [EC2 Werkstatt](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/)
+ [AWS-Cloud-Entwicklungskit](https://aws.amazon.com/cdk/)
+ [AWS CloudFormation](https://aws.amazon.com/cloudformation/)

## Zusätzliche Informationen
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-additional"></a>

1. Suchen 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
```