HealthCheck в задаче ECS без ELB

HealthCheck в задаче ECS без ELB

У нас есть контейнер Docker (Spring Boot), который работает в кластере ECS. Мы запускаем его без Elastic Load Balancing.

Мы хотим обновить службу без простоя, поэтому, когда новая задача запущена и работоспособна, старая задача останавливается. Мы пытались добавить проверку работоспособности в определение задачи, однако она отказывается работать. Я пробовал эти основные команды проверки работоспособности.

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

Я ожидаю, что в первом случае задача будет иметь ЗДОРОВЫЙ статус работоспособности, а во втором — провалит проверки работоспособности. В обоих случаях новая задача запускается нормально, с НЕИЗВЕСТНЫМ статусом работоспособности.

Это как-то связано с тем, что мы не используем ELB? Документация не очень хорошая, и мои поиски в Google не дали ничего полезного.

решение1

Ответ raja и edite от Andrew немного не соответствуют ECS/FARGATE. Он без скобок и без кавычек:

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

Это правильный формат при вводе информации о проверке работоспособности в определениях задач ECS.

ДЕЙСТВИТЕЛЬНАЯ ДОКУМЕНТАЦИЯhttps://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#container_definition_healthcheck

НЕДЕЙСТВИТЕЛЬНАЯ ДОКУМЕНТАЦИЯ для ECS/FARGATE https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_HealthCheck.html

решение2

Данная команда синтаксически неверна.

должен быть

[ "CMD-SHELL", "curl -f http://localhost/ || exit 1" ]
  • CMDили CMD-SHELL- для запуска команды с оболочкой контейнера по умолчанию
  • curl -f http://localhost/ - фактическая команда, которую необходимо выполнить внутри контейнера для подтверждения проверки работоспособности.
  • exit 1 - если команда curl не выполнена, то произойдет выход из оболочки

поэтому вам следует изменить команду, как показано ниже.

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

echo hi — это команда проверки работоспособности в моем примере. Вместо «echo hi» вы можете выполнить любую команду, которая должна вернуть код завершения 0, если она успешно выполнена в вашем контейнере.

решение3

Если вы используете ecs-cli для развертывания своих служб fargate, я обнаружил, что вам необходимо обновиться до чего-то, что поддерживает healthcheck в определении задачи. Я также обнаружил, что использование CMD-SHELL не обязательно — на самом деле, оно ломается, когда вы его добавляете, оборачивая ваш CMD-SHELL другим CMD-SHELL в результирующий json сгенерированного определения задачи (как видно в консоли aws).

Поэтому мне помогло обновление ecs-cli с версии 1.4.0 до 1.7.0, а затем добавление healthcheck в файл ecs-params.yml в службе:

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

решение4

Например, если «Сопоставление портов» предназначено 8000:8000для «ECS EC2» или 8000 tcp«ECS Fargate», «Команда» «HEALTHCHECK» будет следующей:

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

В этом случае не забудьте 8000after .http://localhost:

Связанный контент