Что такое readiness probe и liveness probe?
Что такое readiness probe и liveness probe
Readiness probe и liveness probe — это встроенные проверки Kubernetes, которые позволяет kubelet проверять состояние контейнера и принимать решения: отдавать ли контейнеру трафик и нужно ли перезапускать контейнер.
Readiness probe
-
Отвечает на вопрос «готов ли контейнер принимать трафик».
-
Если проверка провалена, Pod удаляется из Endpoints объекта Service (трафик больше не направляется на этот контейнер), но сам контейнер остаётся запущенным.
-
Полезна для graceful-вывода из нагрузки при старте/перезагрузке/временных проблем (например, подключение к БД ещё не установлено).
Liveness probe
-
Отвечает на вопрос «жив ли контейнер, не завис ли он».
-
При последовательных неудачах kubelet убьёт контейнер и попытается перезапустить его в соответствии с restartPolicy Pod-а.
-
Используют для автоматического восстановления при deadlock’ах, утечках памяти, зависаниях main-процесса.
Типы проверок (в pod.spec.containers[].livenessProbe|readinessProbe):
-
httpGet — HTTP GET на указанный путь/порт; ожидается код 200–399.
-
tcpSocket — попытка установить TCP-соединение на порт; успешна если соединение установлено.
-
exec — выполнение команды внутри контейнера; успешна если код возврата 0.
Основные параметры:
-
initialDelaySeconds — задержка перед первой проверкой после старта контейнера.
-
periodSeconds — интервал между проверками.
-
timeoutSeconds — время ожидания ответа (если превышено — считаем провалом).
-
failureThreshold — число последовательных неудач до срабатывания (для liveness — перезапуск, для readiness — снятие из Endpoints).
-
successThreshold — число последовательных успехов для перехода из «неготов» в «готов» (обычно для readiness).
Взаимодействие со startupProbe:
- startupProbe— отдельная проверка, используемая при очень долгом старте приложения. Если указан startupProbe, kubelet использует её пока приложение не стартанёт; только после успеха включаются liveness/readiness. Это предотвращает преждевременные рестарты.
Примеры (упрощённо):
HTTP-проверки:
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
timeoutSeconds: 2
Exec-проверка:
readinessProbe:
exec:
command: \["cat", "/tmp/ready"\]
initialDelaySeconds: 5
periodSeconds: 5
Рекомендации по настройке:
-
Для web-сервисов делайте отдельные endpoints /live и /ready с минимальной логикой в /live (проверяет, что процесс отвечает) и более строгой в /ready (зависимости, инициализация).
-
Увеличьте initialDelaySeconds и failureThreshold, если приложение требует времени на старт.
-
exec-проверки полезны для специфичных внутренних проверок, но обходятся дороже по ресурсам.
-
Не делайте проверки слишком частыми или «тяжёлыми» — они добавляют нагрузку.
Диагностика:
-
kubectl get pods — столбец READY показывает число готовых контейнеров.
-
kubectl describe pod <pod> — в событиях увидите Readiness probe failed / Liveness probe failed и причины.
-
Повторяющиеся рестарты после провала liveness обычно приводят к CrashLoopBackOff.
-
Readiness влияет на Endpoints: kubectl get endpoints <svc> покажет, попал ли Pod в список.
Особенности:
-
Пробы определяются на уровне контейнера (в одном Pod разные контейнеры могут иметь свои probes).
-
Liveness триггерит перезапуск и подчиняется restartPolicy Pod-а — в некоторых типах Pod (Jobs с restartPolicy: Never) поведение может отличаться.
-
Readiness не трогает жизненный цикл контейнера — это только маршрутизация трафика.