Probes: liveness, readiness, startup
Что нужно знать перед уроком
- M1.03 — Service и порты — readinessProbe напрямую влияет на Endpoints Service
Что нужно знать перед уроком
M1 урок 3 — Service направляет трафик только на Pod’ы, присутствующие в EndpointSlice. Probes — механизм, который решает, должен ли конкретный Pod там присутствовать и жив ли он вообще.
Теория
Три вида проб — принципиально разные последствия провала
Это самая частая точка путаницы у новичков — все три пробы проверяют «здоровье» контейнера, но реагируют по-разному:
| Проба | Провал приводит к | Типичное назначение |
|---|---|---|
livenessProbe | перезапуску контейнера kubelet’ом | «процесс завис намертво (deadlock), перезапуск — единственное лечение» |
readinessProbe | исключению Pod’а из Endpoints Service, без перезапуска — трафик просто перестаёт идти | «процесс жив, но временно не готов принимать трафик» (прогревается кэш, ждёт соединения с БД) |
startupProbe | блокирует запуск liveness/readiness до первого успеха | «приложение долго стартует, не убивайте его как зависшее, пока оно легитимно грузится» |
livenessProbe с короткими таймаутами для медленно стартующего приложения — kubelet будет считать не успевшее прогреться приложение «зависшим» и убивать его в бесконечном цикле перезапусков (CrashLoopBackOff), хотя оно просто ещё не закончило инициализацию. Решение — startupProbe с достаточным запасом попыток, который отложит начало проверок liveness/readiness до реальной готовности.Четыре механизма проверки
| |
Параметры таймингов
| |
Жёсткое правило API: successThreshold обязан быть 1 для livenessProbe и startupProbe — их семантика бинарна («жив/мёртв», «стартовал/не стартовал»), в отличие от readinessProbe, где иногда осмысленно требовать несколько подряд успехов перед возвратом в ротацию (защита от «дрожащего» здоровья сразу после восстановления).
terminationGracePeriodSeconds на уровне пробы
Начиная с Kubernetes 1.25 (стабильно) у пробы можно задать собственный terminationGracePeriodSeconds, который переопределяет значение на уровне Pod’а именно для случая завершения контейнера из-за провала livenessProbe:
| |
Это полезно, когда обычное graceful-завершение Pod’а (например, 60 секунд для доработки текущих запросов) избыточно долго для случая, когда мы уже знаем, что процесс сломан и завис — тут быстрее просто прибить и перезапустить.
Частые ошибки и подводные камни
- Один и тот же endpoint для liveness и readiness без разбора семантики. Если health-check проверяет доступность внешней БД и её временно нет —
livenessProbe, ссылающийся на этот же endpoint, начнёт перезапускать Pod, хотя проблема не в самом контейнере, а во внешней зависимости; для внешних зависимостей правильнее использовать толькоreadinessProbe. - Отсутствие
startupProbeу приложений с долгим стартом. Приводит к ложным перезапускам во время легитимной инициализации. successThresholdбольше 1 у liveness/startup — попытка задать такое значение будет отклонена валидацией API.
Практика в кластере
Node-RED — визуальный редактор потоков автоматизации на Node.js, заметно (несколько секунд) грузится при старте — хороший практический пример необходимости startupProbe.
| |
- Наблюдайте состояние во время старта (заметьте, что readiness/liveness не начинают проверяться, пока не пройдёт startupProbe):
| |
- Смоделируйте провал readinessProbe (без перезапуска контейнера) — временно заблокируйте порт изнутри симуляцией через смену пути:
| |
- Верните путь обратно и убедитесь, что Pod возвращается в ротацию без перезапуска:
| |
Практика разработки
Используется официальный образ nodered/node-red; собственная сборка — в M3.
Шпаргалка команд урока
| |
Вопросы для самопроверки
Только провал livenessProbe заставляет kubelet перезапустить контейнер; readinessProbe только убирает Pod из Endpoints, startupProbe блокирует старт остальных проб.
Источник: Kubernetes — probes
startupProbe блокирует выполнение liveness/readiness до своего первого успеха, устраняя ложные перезапуски во время долгой инициализации.
Источник: Kubernetes — probes
API Kubernetes требует successThreshold: 1 для liveness и startup проб — их семантика бинарна.
Источник: Kubernetes — probes
Если проблема во внешней зависимости, а не в самом процессе, перезапуск контейнера (liveness) не поможет и может создать бесконечный цикл рестартов; readiness корректно временно убирает Pod из трафика.
Источник: Kubernetes — probes
httpGet считается успешным при кодах ответа из диапазонов 2xx и 3xx.
Источник: Kubernetes — probes
Рекомендуемая литература
Официальная документация
- kubernetes.io — concepts/workloads/pods/pod-lifecycle/#container-probes
- kubernetes.io — Configure Liveness, Readiness and Startup Probes.
Статьи и блоги
- Kubernetes для начинающих: что такое Pod и как с ним работать — Flant на Habr.
- Основные концепции сетевой архитектуры Kubernetes — Habr.
- Миграция с ingress-nginx: выбор нового контроллера — Habr.
Книги
- Marko Lukša. Kubernetes in Action. 2nd ed., 2022. ISBN 978-1617297618.
- Kelsey Hightower, Brendan Burns, Joe Beda. Kubernetes: Up and Running. 3rd ed., 2022. ISBN 978-1098110201.
- Michael Hausenblas, Stefan Schimanski. Programming Kubernetes. 2019. ISBN 978-1492047107.
Связанные материалы
- Предыдущий урок: M1.06 — Volumes/PVC/StorageClass.
- Следующий урок: M1.08 — Ingress.
- Глоссарий: Probe.
✓ Урок пройден — все вопросы самопроверки отвечены верно