Вопрос или проблема
У нас есть контейнер Docker (Spring Boot), который работает в кластере ECS. Мы запускаем его без Elastic Load Balancing.
Мы хотим обновить сервис без простоя, поэтому, когда новая задача запущена и работает, старая задача останавливается. Мы пытались добавить проверку работоспособности в определение задачи, однако это не срабатывает. Я пробовал эти базовые команды проверки работоспособности.
[ "CMD-SHELL","exit 0" ]
[ "CMD-SHELL","exit 1" ]
Я ожидал, что первая команда приведет к задаче со статусом здоровья ЗДОРОВ, а вторая провалит проверки работоспособности. В обоих случаях новая задача запускается нормально, с статусом здоровья НЕИЗВЕСТНО.
Имеет ли это отношение к тому, что мы не используем ELB? Документация не очень хорошая, а мои поиски в Google не вернули ничего полезного.
Ответы раджи и эдита от Андрюха немного неверные для 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
Данная команда синтаксически неверна.
Она должна быть следующей
[ "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, если она работает успешно в вашем контейнере.
Если вы используете ecs-cli для развертывания своих сервисов fargate, я обнаружил, что вам необходимо обновиться до версии, которая поддерживает проверку работоспособности в определении задачи. Я также обнаружил, что использование CMD-SHELL не обязательно – на самом деле, это приводит к сбою, когда вы добавляете его, оборачивая ваш CMD-SHELL в другой CMD-SHELL в результирующем json созданного определения задачи (как видно в консоли aws).
Так что то, что сработало для меня, это обновление с 1.4.0 до 1.7.0 ecs-cli и добавление проверки работоспособности в файл 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
8000:8000 для “ECS EC2” или 8000 tcp
для “ECS Fargate”, “Команда” “HEALTHCHECK” будет:
CMD-SHELL, curl -f http://localhost:8000/ || exit 1
Не забудьте 8000
после http://localhost:
в этом случае.
Ответ или решение
Проверка состояния (Health Check) задач ECS без ELB
В современных микросервисных архитектурах поддержка безотказной работы сервисов и автоматической замены неработоспособных экземпляров становится приоритетной задачей. Для контейнеров, работающих в Amazon ECS (Elastic Container Service), одна из критически важных функций – это настройка проверки состояния (Health Check). Эта статья поможет вам понять, как правильно настроить проверку состояния для задач ECS, работающих без Elastic Load Balancing (ELB), что особенно важно для поддержки безотказной замены задач во время обновлений.
1. Основы настройки проверки состояния в ECS
Проверка состояния контейнеров в ECS может быть настроена в определении задачи. При наличии корректной конфигурации, ECS может автоматически отслеживать состояние контейнеров и исключать их из обслуживания при обнаружении проблем. Это особенно полезно при обновлении сервиса, когда новая задача должна запуститься и пройти проверку здоровья до того, как старая задача будет остановлена.
2. Настройка проверки состояния
Чтобы ваша проверка состояния работала корректно, следует учитывать несколько аспектов:
- Команды проверки состояния: Правильный формат команд для проверки состояния в ECS должен бытьосторожно подобран. Ваша команда проверки должна возвращать
exit 0
для успешного завершения илиexit 1
для неудачи. Например, для Spring Boot приложения, которое прослушивает HTTP-запросы, можно использовать команду:
[ "CMD-SHELL", "curl -f http://localhost:8000/ || exit 1" ]
где 8000
– это порт, который ваше приложение использует для прослушивания запросов.
3. Устранение неполадок
Если при попытке настройки проверки состояния задачи ECS все равно возвращается статус UNKNOWN
, возможно, вы сталкиваетесь с несколькими распространенными проблемами:
-
Недостаточная версия ECS CLI: Как было обнаружено, использование устаревшей версии
ecs-cli
может помешать корректной настройке проверки состояния. Убедитесь, что вы используете актуальную версию, так как начиная с1.7.0
были внесены важные исправления. -
Неверный формат команд: Обращайте внимание на правильный синтаксис записей команды проверки состояния. Форматы, содержащие лишние скобки или знаки, как в примере «CMD-SHELL, echo hi», необходимо заменить на
[ "CMD-SHELL", "echo hi" ]
. -
Проблемы с правами доступа: Убедитесь, что ваш контейнер имеет необходимые права для выполнения команды проверки состояния.
4. Пример конфигурации
Вот пример того, как правильно настроить проверку состояния в ecs-params.yml
:
task_definition:
ecs_network_mode: awsvpc
task_role_arn: arn:aws:iam::your-account-id:role/your-task-role
task_execution_role: arn:aws:iam::your-account-id:role/your-execution-role
task_size:
cpu_limit: 2048
mem_limit: 4GB
services:
your_service_name:
healthcheck:
command: ["CMD-SHELL", "curl -f http://localhost:8000/ || exit 1"]
interval: 30s
timeout: 10s
retries: 2
essential: true
5. Заключение
Настройка проверки состояния в ECS без использования ELB требует внимательного подхода к определению команд и конфигурации. Правильное применение представленных выше рекомендаций обеспечит надежную работу вашего приложения без простоев во время обновлений сервиса. Убедитесь, что версии инструментов актуальны, а команды проверки правильно настроены, чтобы избежать ошибок.
Эта информация, если будет правильно внедрена, поможет вам в достижении стабильности и надежности ваших микросервисов, работающих в AWS ECS.