← Все записи
Блог

Probes в Kubernetes без боли: liveness, readiness и startup

19 августа 2026

Пробы (probes) - это способ, которым kubelet понимает, здоров контейнер или нет и можно ли пускать в него трафик. Идея простая, но именно на пробах чаще всего спотыкаются: неправильно настроенная проба не защищает сервис, а роняет его сама - каскадными рестартами или тем, что трафик уходит в заведомо сломанный pod. Разбираемся, что делает каждая из трёх проб, какие ошибки встречаются чаще всего и как настроить их так, чтобы они работали на вас, а не против.

Три пробы и что они реально делают

Kubernetes различает три пробы, и путать их - главный источник проблем. Ключевое отличие не в том, как они проверяют (HTTP-запрос, TCP-соединение, команда в контейнере - механизм у всех одинаковый), а в том, что происходит при провале.

ПРОБА ВОПРОС ЕСЛИ ПАДАЕТ startup медленный старт Приложение уже загрузилось? Ждём. liveness и readiness не запускаются - pod не убьют во время долгой загрузки readiness трафик Готов принимать трафик прямо сейчас? Pod убирают из endpoints Service - трафик не идёт. Рестарта НЕТ liveness жизнь Контейнер жив, не завис? kubelet перезапускает контейнер
readiness управляет трафиком, liveness - перезапуском. Это разные последствия, и логика у них должна быть разной.

Пять ошибок, которые роняют прод

Как настроить правильно

Правило, которое закрывает большинство проблем: liveness должна быть дешёвой и локальной, а readiness может смотреть на зависимости.

Короткая шпаргалка по параметрам: initialDelaySeconds - пауза перед первой проверкой (для liveness почти не нужна, если есть startup); periodSeconds - как часто проверять; timeoutSeconds - сколько ждать ответа; failureThreshold - сколько провалов подряд считать за отказ; successThreshold - сколько успехов для восстановления (для liveness всегда 1).

# медленно стартующий web-сервис startupProbe: httpGet: { path: /healthz, port: 8080 } periodSeconds: 5 failureThreshold: 30 # до 150 c на старт readinessProbe: httpGet: { path: /ready, port: 8080 } # проверяет коннект к БД periodSeconds: 10 failureThreshold: 3 livenessProbe: httpGet: { path: /healthz, port: 8080 } # дёшево, без зависимостей periodSeconds: 10 timeoutSeconds: 3 failureThreshold: 3

Как диагностировать

Если pod бесконечно перезапускается, первым делом смотрите события: kubectl describe pod <имя> - в разделе Events будет строка вроде Liveness probe failed: ... с конкретной причиной (таймаут, код ответа, отказ соединения). Растущий RESTARTS в kubectl get pods и статус CrashLoopBackOff почти всегда указывают на liveness. А если pod долго висит в состоянии READY 0/1, но не перезапускается - дело в readiness: контейнер жив, но не пускает трафик. Разделение «перезапуск против трафика» - самый быстрый способ понять, какую пробу чинить.

Отдельный нюанс: сообщение Last State: Terminated - Reason: OOMKilled к пробам отношения не имеет - это нехватка памяти, и пробы тут ни при чём. Не путайте одно с другим, иначе будете крутить timeoutSeconds там, где нужно поднять лимит памяти.

Когда пробы можно не писать руками

Всё описанное выше - это ручная работа, которую в каждом новом сервисе повторяют заново, и ошибаются в одних и тех же местах. Внутренние платформы (Internal Developer Platform) решают это иначе: пробы генерируются по healthcheck-пути или из шаблона по стандарту команды, а не подбираются на глаз в каждом деплое. Если интересно, как выглядит такой подход на практике - мы описали его в обзоре платформы Opsy. Но даже без платформы правило «liveness дешёвая и локальная, readiness смотрит на зависимости, startup - для медленного старта» закрывает большую часть боли.

Похожие статьи

Стратегии деплоя в Kubernetes Мониторинг и метрики Kubernetes AI-диагностика логов Kubernetes