

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Automatizza la distribuzione di Node Termination Handler in Amazon EKS utilizzando una pipeline CI/CD
<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 e John Vargas, Amazon Web Services*

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

**Avviso**: AWS non CodeCommit è più disponibile per i nuovi clienti. I clienti esistenti di AWS CodeCommit possono continuare a utilizzare il servizio normalmente. [Ulteriori informazioni](https://aws.amazon.com/blogs/devops/how-to-migrate-your-aws-codecommit-repository-to-another-git-provider/)

Sul cloud Amazon Web Services (AWS), puoi utilizzare [AWS Node Termination Handler](https://github.com/aws/aws-node-termination-handler), un progetto open source, per gestire senza problemi l'arresto delle istanze Amazon Elastic Compute Cloud (Amazon EC2) all'interno di Kubernetes. AWS Node Termination Handler aiuta a garantire che il piano di controllo di Kubernetes risponda in modo appropriato agli eventi che possono rendere l'istanza non disponibile. EC2 Tali eventi includono quanto segue:
+ [EC2 manutenzione programmata dell'istanza](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-instances-status-check_sched.html)
+ [Interruzioni delle istanze Amazon EC2 Spot](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html)
+ [Auto Scaling, ridimensionamento del gruppo in](https://docs.aws.amazon.com/autoscaling/ec2/userguide/AutoScalingGroupLifecycle.html#as-lifecycle-scale-in)
+ [Ribilanciamento del gruppo Auto Scaling tra le zone di disponibilità](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-benefits.html#AutoScalingBehavior.InstanceUsage)
+ EC2 terminazione dell'istanza tramite l'API o la Console di gestione AWS

Se un evento non viene gestito, il codice dell'applicazione potrebbe non interrompersi correttamente. Inoltre, potrebbe essere necessario più tempo per ripristinare la piena disponibilità o programmare accidentalmente il lavoro sui nodi che non funzionano. `aws-node-termination-handler`(NTH) può funzionare in due diverse modalità: Instance Metadata Service (IMDS) o Queue Processor. [Per ulteriori informazioni sulle due modalità, consultate il file Readme.](https://github.com/aws/aws-node-termination-handler#readme)

Questo modello utilizza AWS CodeCommit e automatizza la distribuzione di NTH utilizzando Queue Processor attraverso una pipeline di integrazione e distribuzione continue (CI/CD).

**Nota**  
Se utilizzi [gruppi di nodi gestiti da EKS](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html), non hai bisogno di. `aws-node-termination-handler`

## Prerequisiti e limitazioni
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-prereqs"></a>

**Prerequisiti**
+ Un account AWS attivo.
+ Un browser Web supportato per l'uso con la Console di gestione AWS. Consulta l'[elenco dei browser supportati](https://aws.amazon.com/premiumsupport/knowledge-center/browsers-management-console/).
+ AWS Cloud Development Kit (AWS CDK) [installato](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install).
+ `kubectl`[, lo strumento da riga di comando Kubernetes, installato.](https://kubernetes.io/docs/tasks/tools/)
+ `eksctl`[, l'AWS Command Line Interface (AWS CLI) per Amazon Elastic Kubernetes Service (Amazon EKS), installata.](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html)
+ Un cluster EKS in esecuzione con versione 1.20 o successiva.
+ Un gruppo di nodi autogestito collegato al cluster EKS. Per creare un cluster Amazon EKS con un gruppo di nodi autogestito, esegui il comando seguente.

  ```
  eksctl create cluster --managed=false --region <region> --name <cluster_name>
  ```

  Per ulteriori informazioni su`eksctl`, consulta la documentazione di [eksctl](https://eksctl.io/usage/creating-and-managing-clusters/).
+ Provider AWS Identity and Access Management (IAM) OpenID Connect (OIDC) per il tuo cluster. Per ulteriori informazioni, consulta [Creazione di un provider IAM OIDC](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html) per il cluster.

**Limitazioni**
+ È necessario utilizzare una regione AWS che supporti il servizio Amazon EKS.

**Versioni del prodotto**
+ Kubernetes versione 1.20 o successiva
+ `eksctl`versione 0.107.0 o successiva
+ AWS CDK versione 2.27.0 o successiva

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

**Stack tecnologico Target**
+ Un cloud privato virtuale (VPC)
+ Un cluster EKS
+ Amazon Simple Queue Service (Amazon SQS)
+ IAM
+ Kubernetes

**Architettura Target******

Il diagramma seguente mostra la visualizzazione di alto livello dei end-to-end passaggi quando viene avviata la terminazione del nodo.

![Un VPC con un gruppo Auto Scaling, un cluster EKS con Node Termination Handler e una coda SQS.](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/images/pattern-img/970dfb73-9526-4942-a974-e8eef6416596/images/9e0125ae-d55b-49dd-ae70-ccaedf03832a.png)


Il flusso di lavoro mostrato nel diagramma è costituito dai seguenti passaggi di alto livello:

1. L'evento di terminazione dell' EC2 istanza di ridimensionamento automatico viene inviato alla coda SQS.

1. L'NTH Pod monitora la presenza di nuovi messaggi nella coda SQS.

1. L'NTH Pod riceve il nuovo messaggio ed esegue le seguenti operazioni:
   + Collega il nodo in modo che il nuovo pod non venga eseguito sul nodo.
   + Drena il nodo, in modo che il pod esistente venga evacuato
   + Invia un segnale hook del ciclo di vita al gruppo Auto Scaling in modo che il nodo possa essere terminato.

**Automazione e scalabilità**
+ Il codice è gestito e distribuito da AWS CDK, supportato da AWS CloudFormation nested stacks.
+ Il [piano di controllo di Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/disaster-recovery-resiliency.html) funziona su più zone di disponibilità per garantire un'elevata disponibilità.
+ [Per la [scalabilità automatica](https://docs.aws.amazon.com/eks/latest/userguide/autoscaling.html), Amazon EKS supporta Kubernetes [Cluster](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler) Autoscaler e Karpenter.](https://karpenter.sh/)

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

**Servizi AWS**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) è un framework di sviluppo software che aiuta a definire e fornire l'infrastruttura cloud AWS in codice.
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) è un servizio di build completamente gestito che ti aiuta a compilare codice sorgente, eseguire test unitari e produrre artefatti pronti per la distribuzione.
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) è un servizio di controllo delle versioni che consente di archiviare e gestire archivi Git in modo privato, senza dover gestire il proprio sistema di controllo del codice sorgente.
+ [AWS](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) ti CodePipeline aiuta a modellare e configurare rapidamente le diverse fasi di un rilascio di software e ad automatizzare i passaggi necessari per rilasciare continuamente le modifiche al software.
+ [Amazon Elastic Kubernetes Service (Amazon](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) EKS) ti aiuta a eseguire Kubernetes su AWS senza dover installare o gestire il tuo piano di controllo o i tuoi nodi Kubernetes.
+ [Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html) ti aiuta a mantenere la disponibilità delle applicazioni e ti consente di aggiungere o rimuovere automaticamente EC2 istanze Amazon in base alle condizioni da te definite.
+ [Amazon Simple Queue Service (Amazon SQS](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)) fornisce una coda ospitata sicura, durevole e disponibile che ti aiuta a integrare e disaccoppiare sistemi e componenti software distribuiti.

**Altri strumenti**
+ [kubectl](https://kubernetes.io/docs/reference/kubectl/kubectl/) è uno strumento da riga di comando di Kubernetes per eseguire comandi su cluster Kubernetes. Puoi usare kubectl per distribuire applicazioni, ispezionare e gestire le risorse del cluster e visualizzare i log.

**Codice**

Il codice per questo pattern è disponibile nel repository su .com. [deploy-nth-to-eks](https://github.com/aws-samples/deploy-nth-to-eks) GitHub Il repository di codice contiene i seguenti file e cartelle.
+ `nth folder`— Il grafico Helm, i file di valori e gli script per scansionare e distribuire il CloudFormation modello AWS per Node Termination Handler.
+ `config/config.json`— Il file dei parametri di configurazione per l'applicazione. Questo file contiene tutti i parametri necessari per la distribuzione di CDK.
+ `cdk`— Codice sorgente di AWS CDK.
+ `setup.sh`— Lo script utilizzato per distribuire l'applicazione AWS CDK per creare la CI/CD pipeline richiesta e altre risorse richieste.
+ `uninstall.sh`— Lo script utilizzato per ripulire le risorse.

Per utilizzare il codice di esempio, segui le istruzioni nella sezione *Epics*.

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

Per le best practice per l'automazione di AWS Node Termination Handler, consulta quanto segue:
+ [Guide alle migliori pratiche EKS](https://aws.github.io/aws-eks-best-practices/)
+ [Node Termination Handler - Configurazione](https://github.com/aws/aws-node-termination-handler/tree/main/config/helm/aws-node-termination-handler)

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

### Configurare l'ambiente
<a name="set-up-your-environment"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Clona il repository. | Per clonare il repository utilizzando SSH (Secure Shell), esegui il seguente comando.<pre>git clone git@github.com:aws-samples/deploy-nth-to-eks.git</pre><br />Per clonare il repository utilizzando HTTPS, esegui il comando seguente.<pre>git clone https://github.com/aws-samples/deploy-nth-to-eks.git</pre><br />La clonazione del repository crea una cartella denominata. `deploy-nth-to-eks`<br />Passa a quella directory.<pre>cd deploy-nth-to-eks</pre> | Sviluppatore di app, AWS DevOps, DevOps ingegnere | 
| Imposta il file kubeconfig. | Imposta le tue credenziali AWS nel tuo terminale e conferma di avere i diritti per assumere il ruolo di cluster. Puoi usare il seguente codice di esempio.<pre>aws eks update-kubeconfig --name <Cluster_Name> --region <region>--role-arn <Role_ARN></pre> | AWS DevOps, DevOps ingegnere, sviluppatore di app | 

### Implementa la pipeline CI/CD
<a name="deploy-the-ci-cd-pipeline"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Imposta i parametri. | Nel `config/config.json` file, impostate i seguenti parametri obbligatori.[See the AWS documentation website for more details](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html) | Sviluppatore di app, AWS DevOps, DevOps ingegnere | 
| Crea la CI/CD pipeline per distribuire NTH. | Esegui lo script setup.sh.<pre>./setup.sh</pre><br />Lo script distribuirà l'applicazione AWS CDK che creerà il CodeCommit repository con codice di esempio, la pipeline e i CodeBuild progetti in base ai parametri di input dell'utente nel file. `config/config.json`<br />Questo script richiederà la password mentre installa i pacchetti npm con il comando sudo. | Sviluppatore di app, AWS DevOps, DevOps ingegnere | 
| Esamina la CI/CD pipeline. | Apri la Console di gestione AWS ed esamina le seguenti risorse create nello stack.[See the AWS documentation website for more details](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html)<br />Dopo il corretto funzionamento della pipeline, la versione Helm `aws-node-termination-handler` viene installata nel cluster EKS. Inoltre, un Pod denominato `aws-node-termination-handler` è in esecuzione nello spazio dei `kube-system` nomi del cluster. | Sviluppatore di app, AWS DevOps, DevOps ingegnere | 

### Prova l'implementazione di NTH
<a name="test-nth-deployment"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Simula un evento di scalabilità in gruppo Auto Scaling. | Per simulare un evento di scalabilità automatica, effettuate le seguenti operazioni:[See the AWS documentation website for more details](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html) |  | 
| Esamina i registri. | Durante l'evento di scale-in, l'NTH Pod collegherà e svuoterà il nodo di lavoro corrispondente (l' EC2 istanza che verrà terminata come parte dell'evento scale-in). *Per controllare i log, usa il codice nella sezione Informazioni aggiuntive.* | Sviluppatore di app, AWS DevOps, DevOps ingegnere | 

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


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Pulisci tutte le risorse AWS. | Per ripulire le risorse create da questo modello, esegui il comando seguente.<pre>./uninstall.sh</pre><br />Questo pulirà tutte le risorse create in questo modello eliminando lo CloudFormation stack. | DevOps ingegnere | 

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


| Problema | Soluzione | 
| --- | --- | 
| Il registro npm non è impostato correttamente. | Durante l'installazione di questa soluzione, lo script installa npm install per scaricare tutti i pacchetti richiesti. Se durante l'installazione viene visualizzato un messaggio che dice «Impossibile trovare il modulo», il registro npm potrebbe non essere impostato correttamente. Per visualizzare l'impostazione corrente del registro, esegui il comando seguente.<pre>npm config get registry</pre><br />Per impostare il registro con`https://registry.npmjs.org/`, esegui il comando seguente.<pre>npm config set registry https://registry.npmjs.org</pre> | 
| Ritarda il recapito dei messaggi SQS. | Come parte della risoluzione dei problemi, se desideri ritardare la consegna dei messaggi SQS a NTH Pod, puoi modificare il parametro del ritardo di consegna di SQS. Per ulteriori informazioni, consulta le code di [ritardo di Amazon SQS.](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html) | 

## Risorse correlate
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-resources"></a>
+ [Codice sorgente di AWS Node Termination Handler](https://github.com/aws/aws-node-termination-handler)
+ [EC2 seminario](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/)
+ [Kit di sviluppo AWS per il cloud](https://aws.amazon.com/cdk/)
+ [AWS CloudFormation](https://aws.amazon.com/cloudformation/)

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

1. Trova il nome del Pod NTH.

```
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. Controllo dei log. Un registro di esempio è simile al seguente. Mostra che il nodo è stato isolato e drenato prima di inviare il segnale di completamento del ciclo di vita del gruppo 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
```