Automatizza la distribuzione di Node Termination Handler in Amazon EKS utilizzando una pipeline CI/CD - Prontuario AWS

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: distribuisci NTH su EKS

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, 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 Kubernetes risponda in modo appropriato agli eventi che possono causare l'indisponibilità dell'istanza EC2. Tali eventi includono quanto segue:

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

Limitazioni

  • È necessario utilizzare una regione AWS che supporti il servizio Amazon EKS.

Versioni del prodotto

  • Kubernetes versione 1.20 o successiva

  • eksctlversione 0.107.0 o successiva

  • AWS 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.

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

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

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

  3. 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à

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 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 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àDescrizioneCompetenze richieste

Clona il repository.

Per clonare il repository utilizzando SSH (Secure Shell), esegui il seguente comando.

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

Per clonare il repository utilizzando HTTPS, esegui il comando seguente.

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

La clonazione del repository crea una cartella denominata. deploy-nth-to-eks

Passa a quella directory.

cd deploy-nth-to-eks
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 eks update-kubeconfig --name <Cluster_Name> --region <region>--role-arn <Role_ARN>
AWS DevOps, DevOps ingegnere, sviluppatore di app
AttivitàDescrizioneCompetenze richieste

Imposta i parametri.

Nel config/config.json file, impostate i seguenti parametri obbligatori.

  • pipelineName: il nome della pipeline CI/CD da creare con AWS CDK (ad esempio,). deploy-nth-to-eks-pipeline AWS CodePipeline creerà una pipeline con questo nome.

  • repositoryName: Il CodeCommit repository AWS da creare (ad esempio,deploy-nth-to-eks-repo). AWS CDK creerà questo repository e lo imposterà come origine per la pipeline CI/CD.

    Nota: questa soluzione creerà questo CodeCommit repository e il ramo (fornito nel seguente parametro di ramo).

  • branch: Il nome del ramo nel repository (ad esempio,main). Un commit su questo ramo avvierà la pipeline CI/CD.

  • cfn_scan_script: il percorso dello script che verrà utilizzato per scansionare il CloudFormation modello AWS alla ricerca di NTH (scan.sh). Questo script esiste nella nth cartella che farà parte del CodeCommit repository AWS.

  • cfn_deploy_script: Il percorso dello script che verrà utilizzato per distribuire il CloudFormation modello AWS per NTH ()installApp.sh.

  • stackName: Il nome dello CloudFormation stack da distribuire.

  • eksClusterName: il nome del cluster EKS esistente.

  • eksClusterRole: Il ruolo IAM che verrà utilizzato per accedere al cluster EKS per tutte le chiamate API Kubernetes (ad esempio,). clusteradmin Di solito, questo ruolo viene aggiunto. aws-auth ConfigMap

  • create_cluster_role: Per creare il ruolo eksClusterRole IAM, inserisci yes. Se desideri fornire un ruolo cluster esistente nel eksClusterRole parametro, inserisci no.

  • create_iam_oidc_provider: Per creare il provider IAM OIDC per il tuo cluster, inserisci yes. Se esiste già un provider IAM OIDC, inserisci no. Per ulteriori informazioni, consulta Creazione di un provider IAM OIDC per il cluster.

  • AsgGroupName: un elenco separato da virgole di nomi di gruppi Auto Scaling che fanno parte del cluster EKS (ad esempio,). ASG_Group_1,ASG_Group_2

  • region: il nome della regione AWS in cui si trova il cluster (ad esempio,us-east-2).

  • install_cdk: se AWS CDK non è attualmente installato sulla macchina, inserisci yes. Esegui il cdk --version comando per verificare se la versione di AWS CDK installata è 2.27.0 o successiva. In tal caso, inserisci no.

    Se inserisci yes, lo script setup.sh eseguirà il sudo npm install -g cdk@2.27.0 comando per installare AWS CDK sulla macchina. Lo script richiede le autorizzazioni sudo, quindi fornisci la password dell'account quando richiesto.

Sviluppatore di app, AWS DevOps, DevOps ingegnere

Crea la pipeline CI/CD per distribuire NTH.

Esegui lo script setup.sh.

./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. config/config.json

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.

  • CodeCommit repo con il contenuto della cartella nth

  • CodeBuild Progetto AWScfn-scan, che analizzerà il CloudFormation modello alla ricerca di vulnerabilità.

  • CodeBuild progettoNth-Deploy, che distribuirà il CloudFormation modello AWS e i corrispondenti grafici NTH Helm attraverso la pipeline AWS. CodePipeline

  • Una CodePipeline pipeline per implementare NTH.

Dopo che la pipeline è stata eseguita correttamente, 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
AttivitàDescrizioneCompetenze richieste

Simula un evento di scalabilità in gruppo Auto Scaling.

Per simulare un evento di scalabilità automatica, effettuate le seguenti operazioni:

  1. Sulla console AWS, apri la console EC2 e scegli Auto Scaling Groups.

  2. Seleziona il gruppo Auto Scaling con lo stesso nome di quello fornito in config/config.json e scegli Modifica.

  3. Riduci la capacità desiderata e minima di 1.

  4. Scegli Aggiorna.

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àDescrizioneCompetenze richieste

Pulisci tutte le risorse AWS.

Per ripulire le risorse create da questo modello, esegui il comando seguente.

./uninstall.sh

Questo pulirà tutte le risorse create in questo modello eliminando lo CloudFormation stack.

DevOps ingegnere

Risoluzione dei problemi

ProblemaSoluzione

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.

npm config get registry

Per impostare il registro conhttps://registry.npmjs.org/, esegui il comando seguente.

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

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