

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Automatice la implementación del controlador de terminación de nodos en Amazon EKS mediante una CI/CD canalización
<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 y John Vargas, Amazon Web Services*

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

**Aviso**: AWS ya no CodeCommit está disponible para nuevos clientes. Los clientes actuales de AWS CodeCommit pueden seguir utilizando el servicio con normalidad. [Más información](https://aws.amazon.com/blogs/devops/how-to-migrate-your-aws-codecommit-repository-to-another-git-provider/)

En la nube de Amazon Web Services (AWS), puede utilizar [AWS Node Termination Handler](https://github.com/aws/aws-node-termination-handler), un proyecto de código abierto, para gestionar el cierre de instancias de Amazon Elastic Compute Cloud EC2 (Amazon) en Kubernetes sin problemas. El controlador de terminaciones de nodos de AWS ayuda a garantizar que el plano de control de Kubernetes responda adecuadamente a los eventos que pueden provocar que la EC2 instancia deje de estar disponible. Dichos eventos incluyen lo siguiente:
+ [EC2 mantenimiento programado de la instancia](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-instances-status-check_sched.html)
+ [Interrupciones de Amazon EC2 Spot Instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html)
+ [El grupo de escalado automático se reduce horizontalmente](https://docs.aws.amazon.com/autoscaling/ec2/userguide/AutoScalingGroupLifecycle.html#as-lifecycle-scale-in)
+ [Reequilibrio de grupos de escalado automático](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-benefits.html#AutoScalingBehavior.InstanceUsage) en todas las zonas de disponibilidad
+ EC2 terminación de instancias a través de la API o la consola de administración de AWS

Si no se gestiona un evento, es posible que el código de su aplicación no se detenga correctamente. También puede tardar más en recuperar la disponibilidad total o programar accidentalmente el trabajo en los nodos que están dejando de funcionar. El (NTH) `aws-node-termination-handler` puede funcionar en dos modos diferentes: servicio de metadatos de instancias (IMDS) o procesador de colas. Para obtener más información acerca de los dos modos, consulte el [archivo Léame](https://github.com/aws/aws-node-termination-handler#readme).

Este patrón utiliza AWS CodeCommit y automatiza la implementación de NTH mediante el uso de Queue Processor mediante un proceso de integración y entrega continuas (CI/CD).

**nota**  
Si utiliza [grupos de nodos gestionados por EKS](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html), no necesita `aws-node-termination-handler`.

## Requisitos previos y limitaciones
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-prereqs"></a>

**Requisitos previos**
+ Una cuenta de AWS activa.
+ Un navegador web compatible para su uso con la consola de administración de AWS. Consulte la [lista de los navegadores compatibles](https://aws.amazon.com/premiumsupport/knowledge-center/browsers-management-console/).
+ AWS Cloud Development Kit (AWS CDK), [instalado](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install).
+ `kubectl`, la herramienta de línea de comandos de Kubernetes, [instalada](https://kubernetes.io/docs/tasks/tools/).
+ `eksctl`, la interfaz de la línea de comandos de AWS (AWS CLI) para Amazon Elastic Kubernetes Service (Amazon EKS), [instalada](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html).
+ Un clúster de EKS en ejecución con la versión 1.20 o posterior.
+ Grupo de nodos autogestionados adjunto al clúster de EKS. Para crear un clúster de Amazon EKS con un grupo de nodos autogestionado, ejecute el siguiente comando.

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

  Para obtener más información sobre `eksctl`, consulte la [documentación de eksctl](https://eksctl.io/usage/creating-and-managing-clusters/).
+ Proveedor de OpenID Connect (OIDC) de AWS Identity and Access Management (IAM) para su clúster. Para obtener más información, consulte [Creación de un proveedor OIDC de IAM para su clúster](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html).

**Limitaciones**
+ Debe utilizar una región de AWS que sea compatible con el servicio Amazon EKS.

**Versiones de producto**
+ Versión de Kubernetes 1.20 o posterior
+ `eksctl` versión 0.107.0 o posterior
+ CDK de AWS, versión 2.27.0 o posterior

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

**Pila de tecnología de destino**
+ Una nube privada virtual (VPC)
+ Un Clúster de EKS
+ Amazon Simple Queue Service (Amazon SQS)
+ IAM
+ Kubernetes 

**Arquitectura de destino**** **

El siguiente diagrama muestra una vista de alto nivel de los end-to-end pasos que se deben seguir cuando se inicia la terminación del nodo.

![Una VPC con un grupo de escalado automático, un clúster de EKS con Node Termination Handler y una cola de SQS.](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/970dfb73-9526-4942-a974-e8eef6416596/images/9e0125ae-d55b-49dd-ae70-ccaedf03832a.png)


El flujo de trabajo que se muestra en el diagrama consta de los siguientes pasos de alto nivel:

1. El evento de finalización de la EC2 instancia de escalado automático se envía a la cola de SQS.

1. El NTH Pod supervisa los mensajes nuevos en la cola de SQS.

1. El NTH Pod recibe el nuevo mensaje y hace lo siguiente:
   + Acordona el nodo para que el nuevo pod no se ejecute en él.
   + Drena el nodo para evacuar el pod existente
   + Envía una señal de enlace de ciclo de vida al grupo de escalado automático para que se pueda terminar el nodo.

**Automatizar y escalar**
+ El código lo administra e implementa AWS CDK, con el respaldo de pilas CloudFormation anidadas de AWS.
+ El [plano de control de Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/disaster-recovery-resiliency.html) se ejecuta en varias zonas de disponibilidad para garantizar una alta disponibilidad.
+ Para el [escalado automático](https://docs.aws.amazon.com/eks/latest/userguide/autoscaling.html), Amazon EKS admite el [escalador automático de clústeres](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler) de Kubernetes y [Karpenter](https://karpenter.sh/).

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

**Servicios de AWS**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) es un marco de desarrollo de software que le ayuda a definir y aprovisionar la infraestructura de la nube de AWS en código.
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) es un servicio de compilación totalmente gestionado que le ayuda a compilar código fuente, ejecutar pruebas unitarias y producir artefactos listos para su implementación.
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) es un servicio de control de versiones que le ayuda a almacenar y gestionar repositorios de Git de forma privada, sin necesidad de gestionar su propio sistema de control de código fuente.
+ [AWS](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) le CodePipeline ayuda a modelar y configurar rápidamente las diferentes etapas de una versión de software y a automatizar los pasos necesarios para publicar cambios de software de forma continua.
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) lo ayuda a ejecutar Kubernetes en AWS sin necesidad de instalar ni mantener su propio plano de control o nodos de Kubernetes.
+ [Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html) le ayuda a mantener la disponibilidad de las aplicaciones y le permite añadir o eliminar automáticamente EC2 instancias de Amazon según las condiciones que defina.
+ [Amazon Simple Queue Service (Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) ofrece una cola alojada segura, duradera y disponible que le permite integrar y desacoplar sistemas y componentes de software distribuidos.

**Otras herramientas**
+ [kubectl](https://kubernetes.io/docs/reference/kubectl/kubectl/): es una herramienta de línea de comandos para la ejecución de comandos en clústeres de Kubernetes. Puede usar kubectl para implementar aplicaciones, inspeccionar y administrar los recursos del clúster y ver los registros.

**Código**

El código de este patrón está disponible en el [deploy-nth-to-eks](https://github.com/aws-samples/deploy-nth-to-eks)repositorio de GitHub .com. El repositorio de código contiene los siguientes archivos y carpetas.
+ `nth folder`— El diagrama de Helm, los archivos de valores y los scripts para escanear e implementar la CloudFormation plantilla de AWS para Node Termination Handler.
+ `config/config.json`: el archivo de parámetros de configuración de la aplicación. Este archivo contiene todos los parámetros necesarios para implementar el CDK.
+ `cdk`: el código fuente del CDK de AWS.
+ `setup.sh`— El script utilizado para implementar la aplicación AWS CDK para crear la CI/CD canalización requerida y otros recursos necesarios.
+ `uninstall.sh`: el script utilizado para limpiar los recursos.

Para usar el código de muestra, siga las instrucciones en la sección *Epics *.

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

Para conocer las prácticas recomendadas a la hora de automatizar AWS Node Termination Handler, consulte lo siguiente:
+ [Guías de prácticas recomendadas de EKS](https://aws.github.io/aws-eks-best-practices/)
+ [Node Termination Handler: configuración](https://github.com/aws/aws-node-termination-handler/tree/main/config/helm/aws-node-termination-handler)

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

### Configure su entorno
<a name="set-up-your-environment"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Clone el repositorio. | Para clonar el repositorio mediante SSH (Secure Shell), ejecute el siguiente comando.<pre>git clone git@github.com:aws-samples/deploy-nth-to-eks.git</pre><br />Para clonar el repositorio mediante HTTPS, ejecute el siguiente comando.<pre>git clone https://github.com/aws-samples/deploy-nth-to-eks.git</pre><br />Al clonar el repositorio se crea una carpeta llamada `deploy-nth-to-eks`.<br />Cambie a ese directorio.<pre>cd deploy-nth-to-eks</pre> | Desarrollador de aplicaciones, AWS DevOps, DevOps ingeniero | 
| Configure el archivo kubeconfig. | Configure sus credenciales de AWS en su terminal y confirme que tiene derechos para asumir el rol de clúster. Puede utilizar el siguiente código de ejemplo.<pre>aws eks update-kubeconfig --name <Cluster_Name> --region <region>--role-arn <Role_ARN></pre> | AWS DevOps, DevOps ingeniero, desarrollador de aplicaciones | 

### Implemente la CI/CD canalización
<a name="deploy-the-ci-cd-pipeline"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Establezca los parámetros. | Configure los siguientes parámetros obligatorios en el archivo `config/config.json`.[See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html) | Desarrollador de aplicaciones, AWS DevOps, DevOps ingeniero | 
| Cree la CI/CD canalización para implementar NTH. | Ejecute el script setup.sh.<pre>./setup.sh</pre><br />El script implementará la aplicación AWS CDK que creará el CodeCommit repositorio con el código de ejemplo, la canalización y los CodeBuild proyectos en función de los parámetros ingresados por el usuario en `config/config.json` el archivo.<br />Este script solicitará la contraseña cuando instale los paquetes npm con el comando sudo. | Desarrollador de aplicaciones, AWS DevOps, DevOps ingeniero | 
| Revise la CI/CD canalización. | Abra la consola de administración de AWS y revise los siguientes recursos creados en la pila.[See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html)<br />Una vez que la canalización se ejecute correctamente, la versión de Helm `aws-node-termination-handler` se instala en el clúster de EKS. Además, se está ejecutando un pod denominado `aws-node-termination-handler` en el espacio de nombres `kube-system` del clúster. | Desarrollador de aplicaciones, AWS DevOps, DevOps ingeniero | 

### Pruebe la implementación de NTH
<a name="test-nth-deployment"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Simule un evento de escalado de grupo de escalado automático. | Para simular un evento de reducción horizontal del escalado automático, haga lo siguiente:[See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html) |  | 
| Revise los registros. | Durante el evento de escalado, el NTH Pod acordonará y vaciará el nodo de trabajo correspondiente (la EC2 instancia que finalizará como parte del evento de escalado). Para comprobar los registros, utilice el código de la sección *Información adicional*. | Desarrollador de aplicaciones, AWS DevOps, DevOps ingeniero | 

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


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Limpieza de todos los recursos de AWS. | Para limpiar los recursos creados por este patrón, ejecute el siguiente comando.<pre>./uninstall.sh</pre><br />Esto limpiará todos los recursos creados en este patrón al eliminar la CloudFormation pila. | DevOps ingeniero | 

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


| Problema | Solución | 
| --- | --- | 
| El registro npm no está configurado correctamente. | Durante la instalación de esta solución, el script instala npm install para descargar todos los paquetes necesarios. Si, durante la instalación, ve un mensaje que dice “No se puede encontrar el módulo”, es posible que el registro npm no esté configurado correctamente. Para ver la configuración actual del registro, ejecute el siguiente comando.<pre>npm config get registry</pre><br />Ejecute el siguiente comando para establecer el registro con `https://registry.npmjs.org/`.<pre>npm config set registry https://registry.npmjs.org</pre> | 
| Retrasar la entrega del mensaje SQS. | Como parte de la solución de problemas, si desea retrasar la entrega de los mensajes de SQS a NTH Pod, puede ajustar el parámetro de retraso de entrega de SQS. Para obtener más información, consulte [Colas de retraso de Amazon SQS](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html). | 

## Recursos relacionados
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-resources"></a>
+ [Código fuente de AWS Node Termination Handler](https://github.com/aws/aws-node-termination-handler)
+ [EC2 taller](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 Development Kit](https://aws.amazon.com/cdk/)
+ [AWS CloudFormation](https://aws.amazon.com/cloudformation/)

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

1. Busque el nombre del 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. Consulte los registros. Un registro de ejemplo se ve del siguiente modo. Muestra que el nodo ha sido acordonado y drenado antes de enviar la señal de finalización del enlace de ciclo de vida del grupo de escalado automático.

```
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
```