Комментарий пользователя
Мое приложение в контейнере периодически «зависает»: процесс не падает, но на запросы не отвечает. Как в Podman настроить healthcheck, чтобы он сам проверял доступность сервиса и перезапускал контейнер, если тот перестал отвечать?
Ответ специалиста
Привет, Виктор! В Podman healthcheck не означает автоматический рестарт. У проверки есть всего три состояния: starting, healthy и unhealthy. Если приложение зависло, контейнер просто перейдет в статус unhealthy, но Podman не станет перезапускать его самостоятельно, в отличие от того же Kubernetes.
В Podman встроена поддержка авторестарта — применяется опция --restart=always — но срабатывает она только при падении процесса, а не при при получении им статуса unhealthy.
Чтобы решить вашу задачу, нужно настроить параметры проверки и передать управление рестартами в systemd.
Настройка параметров Healthcheck
Сначала нужно задать правила проверки. Для production-окружений обычно используют следующие параметры:
--health-interval=30s — задает интервал, при котором команда проверки выполняется каждые 30 секунд.
--health-timeout=3s — определяет время ожидания: если проверка — например, curl — не успела выполниться за три секунды, то фиксируется ошибка.
--health-retries=3-5 — устанавливает лимит: если происходят от трех до пяти неудачных проверки подряд, контейнер получает статус unhealthy.
Настройка авторестарта через Quadlet и systemd
Поскольку сам Podman контейнеры не перезапускает, рекомендуется использовать Quadlet — это специальный способ описать контейнер сразу как unit-файл для systemd.
Нужно задать параметры запуска и healthcheck в файле с расширением .container — например, /etc/containers/systemd/demo.container. Чтобы добавить тот самый автоматический перезапуск, достаточно подправить конфигурацию этого unit-файла и добавить в нее директиву:
HealthCheckOnFailure=restart
Таким образом, Podman возьмет на себя честный мониторинг состояния через healthcheck, а systemd, ориентируясь на состояние юнита, обеспечит надежный перезапуск сервиса в случае его недоступности.
Добавление таймаутов перед инициализацией
Бывает полезно поставить задержку всяческих проверок на старте контейнера, пока идет подключение к базе данных, загрузка миграций или иной длительный процесс. В противном случае, первый же запрос, который не уложится в --health-timeout, навлечет на контейнер статус unhealthy и тот будет перезапущен еще до того, как успеет завершить все стартовые действия.
За настройку задержки отвечает параметр --health-start-period. Значение для него следует подбирать по крайней мере с двукратным или даже трехкратным запасом.