HealthCheck en la tarea ECS sin ELB

HealthCheck en la tarea ECS sin ELB

Tenemos un contenedor Docker (Spring Boot) que se ejecuta en un clúster ECS. Lo ejecutamos sin Elastic Load Balancing.

Queremos actualizar el servicio sin tiempo de inactividad, de modo que cuando la nueva tarea esté activa y en buen estado, la tarea anterior se detenga. Hemos estado intentando agregar una verificación de estado en la definición de la tarea, sin embargo, se niega a funcionar. Probé estos comandos básicos de verificación de estado.

[ "CMD-SHELL","exit 0" ]
[ "CMD-SHELL","exit 1" ]

Esperaría que la primera resulte en una tarea con un estado de salud SALUDABLE y que la segunda no pase las comprobaciones de salud. En ambos casos, la nueva tarea comienza bien, con un estado de salud DESCONOCIDO.

¿Tiene esto algo que ver con que no usemos un ELB? La documentación no es muy buena y mis búsquedas en Google no arrojaron nada útil.

Respuesta1

La respuesta de raja y la edición de Andrew están ligeramente equivocadas para ECS/FARGATE. Está sin corchetes y sin comillas:

CMD-SHELL, curl -f http://localhost/ || exit 1

Ese es el formato correcto si ingresa información de verificación de estado dentro de las Definiciones de tareas de ECS.

DOCUMENTACIÓN VÁLIDAhttps://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#container_definition_healthcheck

DOCUMENTACIÓN NO VÁLIDA para ECS/FARGATE https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_HealthCheck.html

Respuesta2

El comando dado no es sintácticamente válido.

debería ser

[ "CMD-SHELL", "curl -f http://localhost/ || exit 1" ]
  • CMDo CMD-SHELL- para ejecutar el comando con el shell predeterminado del contenedor
  • curl -f http://localhost/ - comando real que debe ejecutarse dentro del contenedor para validar la verificación de estado.
  • exit 1 - si el comando curl falla, saldrá del shell

entonces deberías cambiar tu comando como se muestra a continuación.

[ "CMD-SHELL", "echo hi || exit 1" ]

echo hi es el comando de verificación de salud en mi ejemplo, puede ejecutar cualquier comando en lugar de "echo hi", que debería devolver el estado de salida 0 si se ejecuta correctamente en su contenedor.

Respuesta3

Si usa ecs-cli para implementar sus servicios fargate, descubrí que debe actualizar a algo que admita la verificación de estado en la definición de la tarea. También descubrí que no es necesario usar CMD-SHELL; de hecho, se rompe cuando lo agrega, envolviendo su CMD-SHELL con otro CMD-SHELL en el json resultante de la definición de tarea generada (como se ve en la consola de AWS) .

Entonces, lo que funcionó para mí fue actualizar de 1.4.0 a 1.7.0 de ecs-cli y luego agregar Healthcheck en el archivo ecs-params.yml bajo el servicio:

task_definition:
  ecs_network_mode: awsvpc
  task_role_arn: arn:aws:iam::........
  task_execution_role: arn:aws:iam::........
  task_size:
    cpu_limit: 2048
    mem_limit: 4GB
  services:
    foo:
      healthcheck:
        command: ps cax | grep "[p]ython"
        interval: 30s
        timeout: 10s
        retries: 2
      essential: true

Respuesta4

Por ejemplo, si sus "asignaciones de puertos" son 8000:8000para "ECS EC2" o 8000 tcppara "ECS Fargate", el "comando" de "HEALTHCHECK" es:

CMD-SHELL, curl -f http://localhost:8000/ || exit 1

No olvides 8000después http://localhost:en este caso.

información relacionada