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 de Node Termination Handler en Amazon EKS mediante una canalización de CI/CD
Creado por Sandip Gangapadhyay (AWS), John Vargas (AWS), Practideep Singh (AWS), Sandeep Gawande (AWS) y Viyoma Sachdeva (AWS)
Repositorio de código: despliegue NTH en EKS | Entorno: producción | Tecnologías: contenedores y microservicios; DevOps |
Servicios de AWS: AWS CodePipeline; Amazon EKS; AWS CodeBuild |
Resumen
En la nube de Amazon Web Services (AWS), puede utilizar AWS Node Termination Handler
Reequilibrio de grupos de escalado automático en todas las zonas de disponibilidad
Terminación de la instancia EC2 mediante 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
Este patrón automatiza la implementación de NTH mediante el uso del procesador de cola a través de una canalización de integración y entrega continuas (CI/CD).
Nota: Si utiliza grupos de nodos gestionados por EKS, no necesita aws-node-termination-handler
.
Requisitos previos y limitaciones
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
. AWS Cloud Development Kit (AWS CDK), instalado.
kubectl
, la herramienta de línea de comandos de Kubernetes, instalada. eksctl
, la interfaz de la línea de comandos de AWS (AWS CLI) para Amazon Elastic Kubernetes Service (Amazon EKS), instalada.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. 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.
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 posteriorCDK de AWS, versión 2.27.0 o posterior
Arquitectura
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 Auto Scaling, un clúster EKS con Node Termination Handler y una cola SQS.](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:
El evento de terminación de la instancia EC2 con escalado automático se envía a la cola de SQS.
El NTH Pod supervisa los mensajes nuevos en la cola de SQS.
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 módulo 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 se ejecuta en varias zonas de disponibilidad para garantizar una alta disponibilidad.
Para el escalado automático, Amazon EKS admite el escalador automático de clústeres
de Kubernetes y Karpenter .
Herramientas
Servicios de AWS
AWS Cloud Development Kit (AWS CDK) 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 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 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 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) le 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 le ayuda a mantener disponible la aplicación y le permite añadir o quitar automáticamente instancias de Amazon EC2 según las condiciones que defina.
Amazon Simple Queue Service (Amazon SQS) ofrece una cola alojada segura, duradera y disponible que le permite integrar y desacoplar sistemas y componentes de software distribuidos.
Otras herramientas
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
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 del CDK de AWS para crear la canalización de CI/CD necesaria 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
Para conocer las prácticas recomendadas a la hora de automatizar AWS Node Termination Handler, consulte lo siguiente:
Epics
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Clone el repositorio. | Para clonar el repositorio mediante SSH (Secure Shell), ejecute el siguiente comando.
Para clonar el repositorio mediante HTTPS, ejecute el siguiente comando.
Al clonar el repositorio se crea una carpeta llamada Cambie a ese directorio.
| 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.
| AWS DevOps, DevOps ingeniero, desarrollador de aplicaciones |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Establezca los parámetros. | Configure los siguientes parámetros obligatorios en el archivo
| Desarrollador de aplicaciones, AWS DevOps, DevOps ingeniero |
Cree la canalización de CI/CD para implementar NTH. | Ejecute el script setup.sh.
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 Este script solicitará la contraseña cuando instale los paquetes npm con el comando sudo. | Desarrollador de aplicaciones, AWS DevOps, DevOps ingeniero |
Revise la canalización de CI/CD. | Abra la consola de administración de AWS y revise los siguientes recursos creados en la pila.
Una vez que la canalización se ejecute correctamente, la versión de Helm | Desarrollador de aplicaciones, AWS DevOps, DevOps ingeniero |
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:
| |
Revise los registros. | Durante el evento de reducción horizontal, el NTH Pod acordonará y drenará el nodo de trabajo correspondiente (la instancia EC2 que se cancelará como parte del evento de reducción horizontal). Para comprobar los registros, utilice el código de la sección Información adicional. | Desarrollador de aplicaciones, AWS DevOps, DevOps ingeniero |
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.
Esto limpiará todos los recursos creados en este patrón al eliminar la CloudFormation pila. | DevOps ingeniero |
Resolución de problemas
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.
Ejecute el siguiente comando para establecer el registro con
|
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. |
Recursos relacionados
Información adicional
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