Automatice la implementación de Node Termination Handler en Amazon EKS mediante una canalización de CI/CD - Recomendaciones de AWS

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, un proyecto de código abierto, para administrar eficazmente el cierre de instancias de Amazon Elastic Compute Cloud (Amazon EC2) en Kubernetes. AWS Node Termination Handler ayuda a garantizar que el plano de control de Kubernetes responda adecuadamente a los eventos que pueden provocar que la instancia de EC2 deje de estar disponible. Dichos eventos incluyen lo siguiente:

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 posterior

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

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

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

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

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

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

TareaDescripciónHabilidades requeridas

Clone el repositorio.

Para clonar el repositorio mediante SSH (Secure Shell), ejecute el siguiente comando.

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

Para clonar el repositorio mediante HTTPS, ejecute el siguiente comando.

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

Al clonar el repositorio se crea una carpeta llamada deploy-nth-to-eks.

Cambie a ese directorio.

cd deploy-nth-to-eks
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 eks update-kubeconfig --name <Cluster_Name> --region <region>--role-arn <Role_ARN>
AWS DevOps, DevOps ingeniero, desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Establezca los parámetros.

Configure los siguientes parámetros obligatorios en el archivo config/config.json.

  • pipelineName: el nombre de la canalización de CI/CD que va a crear el CDK de AWS (por ejemplo, deploy-nth-to-eks-pipeline). AWS CodePipeline creará una canalización con este nombre.

  • repositoryName: El CodeCommit repositorio de AWS que se va a crear (por ejemplo,deploy-nth-to-eks-repo). El CDK de AWS creará este repositorio y lo configurará como fuente de la canalización de CI/CD.

    Nota: Esta solución creará este CodeCommit repositorio y la rama (que se proporciona en el siguiente parámetro de rama).

  • branch: el nombre de rama del repositorio (por ejemplo, main). Una confirmación con esta rama iniciará la canalización de CI/CD.

  • cfn_scan_script: la ruta del script que se utilizará para escanear la CloudFormation plantilla de AWS en busca de NTH (scan.sh). Este script existe en nth una carpeta que formará parte del CodeCommit repositorio de AWS.

  • cfn_deploy_script: la ruta del script que se utilizará para implementar la CloudFormation plantilla de AWS para NTH (installApp.sh).

  • stackName: El nombre de la CloudFormation pila que se va a implementar.

  • eksClusterName: el nombre del clúster de EKS existente.

  • eksClusterRole: el rol de IAM que se utilizará para acceder al clúster de EKS para todas las llamadas a la API de Kubernetes (por ejemplo, clusteradmin). Por lo general, este rol se agrega en aws-auth ConfigMap.

  • create_cluster_role: para crear el rol de IAM eksClusterRole, escriba . Si desea proporcionar un rol de clúster existente en el parámetro eksClusterRole, escriba no.

  • create_iam_oidc_provider: para crear un proveedor de OIDC de IAM para su clúster, escriba . Si ya existe un proveedor de IAM OIDC, escriba no. Para obtener más información, consulte Creación de un proveedor OIDC de IAM para su clúster.

  • AsgGroupName: una lista separada por comas de los nombres de los grupos de escalado automático que forman parte del clúster de EKS (por ejemplo, ASG_Group_1,ASG_Group_2).

  • region: el nombre de la región de AWS donde se encuentra el clúster (por ejemplo, us-east-2).

  • install_cdk: si el CDK de AWS no está instalado actualmente en el equipo, escriba . Ejecute el comando cdk --version para comprobar si la versión del CDK de AWS instalada es 2.27.0 o posterior. En ese caso, escriba no.

    Si escribe , el script setup.sh ejecutará el comando sudo npm install -g cdk@2.27.0 para instalar el CDK de AWS en el equipo. El script requiere permisos sudo, por lo que debe proporcionar la contraseña de la cuenta cuando se le solicite.

Desarrollador de aplicaciones, AWS DevOps, DevOps ingeniero

Cree la canalización de CI/CD para implementar NTH.

Ejecute el script setup.sh.

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

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.

  • CodeCommit repositorio con el contenido de la carpeta nth

  • CodeBuild Proyecto AWScfn-scan, que escaneará la CloudFormation plantilla en busca de vulnerabilidades.

  • CodeBuild proyectoNth-Deploy, que implementará la CloudFormation plantilla de AWS y los gráficos de NTH Helm correspondientes a través de la CodePipeline canalización de AWS.

  • Una CodePipeline canalización para implementar NTH.

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
TareaDescripciónHabilidades 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:

  1. En la consola de AWS, abra la consola EC2 y elija grupo de escalado automático.

  2. Seleccione el grupo de escalado automático que tenga el mismo nombre que el proporcionado en config/config.json y elija Editar.

  3. Reduzca la capacidad deseada y mínima en 1.

  4. Elija Actualizar.

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
TareaDescripciónHabilidades requeridas

Limpieza de todos los recursos de AWS.

Para limpiar los recursos creados por este patrón, ejecute el siguiente comando.

./uninstall.sh

Esto limpiará todos los recursos creados en este patrón al eliminar la CloudFormation pila.

DevOps ingeniero

Resolución de problemas

ProblemaSolució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.

npm config get registry

Ejecute el siguiente comando para establecer el registro con https://registry.npmjs.org/.

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

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