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
Creato da Sandip Gangapadhyay (AWS), John Vargas (AWS), Pragtideep Singh (AWS), Sandeep Gawande (AWS) e Viyoma Sachdeva (AWS)
Archivio di codice | Ambiente: produzione | Tecnologie: contenitori e microservizi; DevOps |
Servizi AWS: AWS CodePipeline; Amazon EKS; AWS CodeBuild |
Riepilogo
Sul cloud Amazon Web Services (AWS), puoi utilizzare AWS Node Termination Handler
Ribilanciamento del gruppo Auto Scaling tra le zone di disponibilità
Terminazione dell'istanza EC2 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.
Questo modello automatizza l'implementazione di NTH utilizzando Queue Processor attraverso una pipeline di integrazione e distribuzione continue (CI/CD).
Nota: se utilizzi gruppi di nodi gestiti da EKS, non hai bisogno di. aws-node-termination-handler
Prerequisiti e limitazioni
Prerequisiti
Un account AWS attivo.
Un browser Web supportato per l'uso con la Console di gestione AWS. Consulta l'elenco dei browser supportati
. AWS Cloud Development Kit (AWS CDK) installato.
kubectl
, lo strumento da riga di comando Kubernetes, installato.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. Provider AWS Identity and Access Management (IAM) OpenID Connect (OIDC) per il tuo cluster. Per ulteriori informazioni, consulta Creazione di un provider IAM OIDC 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 successivaAWS CDK versione 2.27.0 o successiva
Architettura
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.](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:
L'evento di terminazione dell'istanza EC2 con ridimensionamento automatico viene inviato alla coda SQS.
L'NTH Pod monitora la presenza di nuovi messaggi nella coda SQS.
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 funziona su più zone di disponibilità per garantire un'elevata disponibilità.
Per la scalabilità automatica, Amazon EKS supporta Kubernetes Cluster
Autoscaler e Karpenter.
Strumenti
Servizi AWS
AWS Cloud Development Kit (AWS CDK) è un framework di sviluppo software che aiuta a definire e fornire l'infrastruttura cloud AWS in codice.
AWS CodeBuild è 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 è 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 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 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 ti aiuta a mantenere la disponibilità delle applicazioni e ti consente di aggiungere o rimuovere automaticamente istanze Amazon EC2 in base alle condizioni da te definite.
Amazon Simple Queue Service (Amazon SQS) fornisce una coda ospitata sicura, durevole e disponibile che ti aiuta a integrare e disaccoppiare sistemi e componenti software distribuiti.
Altri strumenti
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
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 pipeline CI/CD 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
Per le best practice per l'automazione di AWS Node Termination Handler, consulta quanto segue:
Epiche
Attività | Descrizione | Competenze richieste |
---|---|---|
Clona il repository. | Per clonare il repository utilizzando SSH (Secure Shell), esegui il seguente comando.
Per clonare il repository utilizzando HTTPS, esegui il comando seguente.
La clonazione del repository crea una cartella denominata. Passa a quella directory.
| 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.
| AWS DevOps, DevOps ingegnere, sviluppatore di app |
Attività | Descrizione | Competenze richieste |
---|---|---|
Imposta i parametri. | Nel
| Sviluppatore di app, AWS DevOps, DevOps ingegnere |
Crea la pipeline CI/CD per distribuire NTH. | Esegui lo script setup.sh.
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. Questo script richiederà la password mentre installa i pacchetti npm con il comando sudo. | Sviluppatore di app, AWS DevOps, DevOps ingegnere |
Esamina la pipeline CI/CD. | Apri la Console di gestione AWS ed esamina le seguenti risorse create nello stack.
Dopo che la pipeline è stata eseguita correttamente, la versione Helm | Sviluppatore di app, AWS DevOps, DevOps ingegnere |
Attività | Descrizione | Competenze richieste |
---|---|---|
Simula un evento di scalabilità in gruppo Auto Scaling. | Per simulare un evento di scalabilità automatica, effettuate le seguenti operazioni:
| |
Esamina i registri. | Durante l'evento di scale-in, l'NTH Pod collegherà e svuoterà il nodo di lavoro corrispondente (l'istanza EC2 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 |
Attività | Descrizione | Competenze richieste |
---|---|---|
Pulisci tutte le risorse AWS. | Per ripulire le risorse create da questo modello, esegui il comando seguente.
Questo pulirà tutte le risorse create in questo modello eliminando lo CloudFormation stack. | DevOps ingegnere |
Risoluzione dei problemi
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.
Per impostare il registro con
|
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. |
Risorse correlate
Informazioni aggiuntive
1. Trova il nome dell'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. 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