Saltar al contenido

¿Cómo configuro un apagado correcto y drenaje de conexiones en las tareas de Amazon ECS durante los despliegues?

4 minutos de lectura
0

Cuando despliego un servicio nuevo en mi clúster de Amazon Elastic Container Service (Amazon ECS), las tareas se despliegan o finalizan de forma incorrecta.

Resolución

Comprobación de que está utilizando un contenedor con suficiente capacidad de recursos

Si los nuevos despliegues no superan sistemáticamente las comprobaciones de estado del equilibrador de carga, compruebe las métricas de información de contenedores de Amazon ECS CpuUtilized, CpuReserved y MemoryUtilized. Si usa un equilibrador de carga de aplicación, compruebe también TargetResponseTime.

Además, configure la propiedad HealthCheckGracePeriodSeconds con un valor que supere el tiempo de inicio de la aplicación. El retraso en las respuestas de las comprobaciones de estado puede provocar errores y provocar que Amazon ECS interrumpa las tareas.

Comprobación del estado del contenedor y los códigos de salida

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulte Solución de problemas de AWS CLI. Además, asegúrese de utilizar la versión más reciente de la AWS CLI.

Para las tareas que finalizan inesperadamente, ejecute el siguiente comando describe-tasks para comprobar los códigos de salida del contenedor:

aws ecs describe-tasks  --cluster ECS_CLUSTER  --tasks TASK_ARN -- region REGION

Nota: Sustituya ECS_CLUSTER por el nombre de su clúster, TASK_ARN por el ARN de la tarea y REGION por su región de AWS.

Si el resultado del comando anterior es 0, quiere decir que la tarea se inició correctamente. Si el resultado es 1, significa que se ha producido un error en la aplicación y debe comprobar los registros de esta. Si la salida es 137, entonces el contenedor recibe una señal SIGKILL, que normalmente se activa debido a un problema de falta de memoria. Para resolver este problema, consulte ¿Cómo soluciono los errores OutOfMemory en Amazon ECS? y ¿Por qué se ha detenido mi tarea de Amazon ECS?

Revisión de la configuración de la definición de tareas

Asegúrese de que todas las configuraciones de definiciones de tareas sean válidas, especialmente después de modificar o crear nuevas definiciones de tareas. Para verificar las configuraciones de las definiciones de tareas, ejecute una tarea independiente.

Configuración del equilibrador de carga

Configure deregistration_delay.timeout_seconds en el equilibrador de carga para satisfacer sus necesidades. En el caso de solicitudes de larga duración, use un valor más alto. Para instancias puntuales de Amazon Elastic Compute Cloud (Amazon EC2), este valor debe ser inferior a 120 segundos.

Para modificar deregistration_delay.timeout_seconds, ejecute el siguiente comando modify-target-group-attributes:

aws elbv2 modify-target-group-attributes --target-group-arn
EXAMPLE_ARN --attributes Key=deregistration_delay.timeout_seconds,Value=120

Nota: Sustituya EXAMPLE_ARN por el ARN de su equilibrador de carga y 120 por el tiempo de espera del retraso de la cancelación del registro en segundos.

Además, optimice la configuración de la comprobación de estado del equilibrador de carga. Si la configuración es demasiado estricta para su aplicación, es posible que el equilibrador de carga marque con frecuencia el objetivo como en mal estado.

Configuración del tiempo de apagado correcto de su aplicación

De forma predeterminada, ECS_CONTAINER_STOP_TIMEOUT se establece en 30 segundos. Al acceder a la aplicación durante la fase de drenaje de las tareas anteriores en un nuevo despliegue de Amazon ECS, es posible que reciba un error de tipo 5xx. Si tiene problemas al acceder a la aplicación, aumente el valor de ECS_CONTAINER_STOP_TIMEOUT en función de las necesidades de apagado correcto de la aplicación. Se recomienda probar el valor actualizado en un entorno de prueba antes de desplegarlo.

Para actualizar el valor, agregue un código similar al del siguiente ejemplo a la definición de la tarea:

{
  "containerDefinitions": [
    {
      "name": "your-container",
      "image": "your-image",
      "stopTimeout": 120
    }
  ]
}

Nota: Sustituya 120 por su valor de ECS_CONTAINER_STOP_TIMEOUT.

Para configurar un apagado correcto, añada un controlador SIGTERM a su aplicación. En el caso de un spot de AWS Fargate, configure la configuración para llamar a DeregisterTargets durante el controlador SIGTERM. Esto garantiza que Amazon ECS anule el registro de las tareas de FARGATE_SPOT del grupo de destino del equilibrador de carga.

Información relacionada

Optimización de los parámetros de drenaje de conexiones del equilibrador de carga para Amazon ECS

OFICIAL DE AWSActualizada hace 2 años