Пробы здоровья: 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.
  • Пробы — основа самовосстановления на уровне отдельного контейнера.
Проверьте себя
1. Что делает Kubernetes при провале liveness-пробы?
AУбирает под из балансировки
BПерезапускает контейнер
CСоздаёт новый namespace
DМасштабирует Deployment
2. Что происходит, когда readiness-проба не пройдена?
AКонтейнер перезапускается
BПод исключается из балансировки Service, пока не станет готов
CУдаляется PVC
DМеняется образ
3. Какой способ проверки НЕ относится к пробам?
AhttpGet
BtcpSocket
Cexec
DdnsLookup
Поддержать проект