Короткий ответ
Health check — это специальный HTTP-эндпоинт (например, /healthz или /livez), который приложение отдаёт для простой проверки "жив ли процесс и может ли он обслуживать запросы"; системы мониторинга и оркестрации периодически опрашивают его и на основе ответа решают, считать сервис рабочим или перезапускать/выводить из балансировки.
Как это работает подробнее
эндпоинт обычно возвращает 200 OK, если внутренние проверки (доступность процесса, иногда — базовых зависимостей) прошли успешно, и ошибку или таймаут — если нет. Внешний мониторинг (blackbox_exporter, Kubernetes liveness probe) регулярно дёргает этот эндпоинт и на основе серии неудачных ответов принимает решение — поднять алерт или перезапустить контейнер.
Пример кода
config.yaml
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
failureThreshold: 3Что использовать на практике
- Практика. важно разделять "простой" health check (процесс отвечает) и "глубокую" проверку (база данных доступна, кеш доступен) — слишком тяжёлая проверка в liveness может привести к каскадным перезапускам, если временно недоступна внешняя зависимость, хотя сам процесс приложения вполне жив. Поэтому для liveness обычно делают лёгкую проверку, а для readiness — более полную, включающую зависимости.
- Практика. После трёх подряд неуспешных обращений к
/healthzс интервалом 10 секунд Kubernetes перезапустит контейнер; метрикаkube_pod_container_status_restarts_totalв Prometheus позволит отследить, как часто это происходит, и отличить единичный сбой от систематической проблемы.
Подводные камни
- Частые ошибки. делать liveness-проверку, которая опрашивает базу данных или внешний API — при их кратковременной недоступности Kubernetes начнёт перезапускать здоровые поды, усиливая инцидент; не задавать таймаут для health check, из-за чего "подвисший" процесс долго считается живым; не мониторить сам факт доступности health-check эндпоинта как отдельную метрику (
up), полагаясь только на внутреннюю логику оркестратора.