Пробы здоровья: liveness и readiness
Контейнер «Running» не значит «работает» — пробы здоровья проверяют, что приложение действительно живо и готово.
Liveness-проба проверяет, жив ли контейнер (если нет — перезапуск); readiness-проба проверяет, готов ли он принимать трафик (если нет — его убирают из балансировки).
Без проб Kubernetes судит о здоровье грубо: процесс запущен — значит «ок». Но приложение может зависнуть, не упав, или ещё прогревать кэш и не быть готовым к запросам. Пробы дают кластеру точный сигнал.
Liveness — жив ли контейнер
Kubernetes периодически дёргает пробу. Если она проваливается заданное число раз — контейнер считается зависшим и перезапускается. Это автоматическое лечение «зависаний»:
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 10 # подождать старта приложения
periodSeconds: 5 # проверять каждые 5 секундReadiness — готов ли принимать трафик
Пока readiness-проба не прошла, под исключается из Service: на него не идёт трафик. Это спасает во время старта (приложение ещё грузит конфиг) и при временной перегрузке. Под не убивают — просто не шлют запросы, пока он не готов:
readinessProbe:
httpGet:
path: /ready
port: 8080
periodSeconds: 5Три способа проверки
Проба может быть не только HTTP:
- httpGet — GET-запрос; код 2xx/3xx считается успехом.
- tcpSocket — успешное TCP-соединение на порт.
- exec — выполнить команду в контейнере; код возврата 0 = успех.
readinessProbe:
exec:
command: ["sh", "-c", "pg_isready -U postgres"]
periodSeconds: 10Не путайте пробы: liveness про «перезапустить», readiness про «слать ли трафик». Слишком агрессивная liveness может зациклить перезапуски — задавайте разумные задержки.
| Проба | Провалилась → | Цель |
| liveness | перезапуск контейнера | лечить зависания |
| readiness | убрать из балансировки | не слать трафик неготовому |
Итог
- liveness перезапускает зависший контейнер, readiness убирает неготовый из трафика.
- Проверка бывает httpGet, tcpSocket или exec.
- Пробы — основа самовосстановления на уровне отдельного контейнера.