← Kubernetes: наблюдаемость
6 мин · средне · Урок 3 из 3

Readiness и Liveness probes

Чем readiness отличается от liveness, зачем нужна startupProbe и как выглядят минимальные поля probe в манифесте.

Что такое probe

kubelet - компонент Kubernetes, который запускает контейнеры на узле и следит за их состоянием. Сам по себе kubelet не знает, что происходит внутри приложения. Контейнер запущен, главный процесс жив, но это ещё не значит, что приложение готово работать.

Бывает две проблемы. Приложение ещё прогревается, а трафик на него уже идёт, и пользователь получает ошибку. Или процесс жив, но завис, и запросы не обрабатываются.

probe - небольшая проверка, которую kubelet регулярно отправляет в контейнер. По её результату kubelet решает, готов ли контейнер и нужно ли его перезапускать. Probe бывает трёх типов: readinessProbe, livenessProbe, startupProbe.

ProbeНа какой вопрос отвечаетЧто при провале
readinessProbeготов ли Pod принимать трафикService не шлёт в этот Pod запросы
livenessProbeработает ли процесс по-настоящемуkubelet перезапускает контейнер
startupProbeзакончился ли долгий стартдве остальные ещё не запускаются

readinessProbe

readinessProbe отвечает на вопрос «готов ли Pod принимать трафик». Pod - наименьшая единица, которую запускает Kubernetes; внутри Pod работает один или несколько контейнеров.

Service - объект, который раздаёт сетевой трафик на группу Pod. Пока readinessProbe не вернула успех, Service не направляет запросы в этот Pod. Деплой уже завершён, но пользователь не видит ошибку, пока приложение прогревается.

livenessProbe

livenessProbe отвечает на вопрос «работает ли процесс по-настоящему». Если probe не проходит несколько раз подряд, kubelet перезапускает контейнер. Это помогает против зависаний: главный процесс жив, а обработка запросов встала.

С livenessProbe легко навредить. Она не должна зависеть от внешних сервисов вроде базы данных. Если внешний сервис упадёт, liveness начнёт перезапускать контейнер без причины.

startupProbe

startupProbe нужна приложениям с очень долгим стартом: минута и больше. Пока startupProbe не прошла, liveness и readiness не запускаются. Это спасает медленные приложения от перезапуска во время прогрева. Если приложение стартует за несколько секунд, startupProbe не нужна.

Минимальный YAML

readinessProbe:
  httpGet:
    path: /
    port: 80
  initialDelaySeconds: 5
  periodSeconds: 10
livenessProbe:
  httpGet:
    path: /
    port: 80
  initialDelaySeconds: 5
  periodSeconds: 10

Разбор полей.

Эти поля относятся к контейнеру. В YAML они стоят внутри описания контейнера, рядом с image и name.

livenessProbe, которая стучится в ещё не поднявшийся порт, гоняет контейнер по кругу: kubelet перезапускает его, Pod уходит в CrashLoopBackOff. Поэтому initialDelaySeconds: 0 ставят только приложению, которое стартует мгновенно.

camelCase в ключах

Kubernetes принимает только ключи в camelCase. httpGet - правильно, httpget - нет. На опечатку в регистре kubectl apply ответит ошибкой strict decoding error: unknown field и не создаст объект (строгая валидация полей).

Что часто ломается

Как посмотреть поля и текущие значения

kubectl explain pod.spec.containers.readinessProbe
kubectl explain pod.spec.containers.readinessProbe.httpGet
kubectl get deploy app -o yaml | grep -A6 Probe
kubectl describe pod -l app=app | grep -A4 -E 'Readiness|Liveness'

Домашка

Теорию закрепляет задание на своём кластере: 2 шага с проверкой. Кластер поднимается по треку Kubernetes локально, задания лежат в репозитории k8s-practice.

./run.sh start k8s-readiness-liveness     # развернуть стартовое состояние
./run.sh verify k8s-readiness-liveness    # проверить текущий шаг

Коротко

Дрилл · вопросы как на собесе

Проверь себя без подсказок

Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.

01

Что такое Readiness, Liveness и Startup probes?

K8S-007

Прошли материал до конца? Отметьте урок пройденным.