Ответ
В Kubernetes для проверки состояния приложения в контейнере используются Probes (пробы или проверки). Они помогают kubelet
понять, когда нужно перезапустить контейнер или когда он готов принимать трафик.
Существует три основных типа проб:
Liveness Probe (Проверка жизнеспособности)
- Назначение: Проверяет, работает ли приложение. Если проба завершается неудачно,
kubelet
убивает контейнер, и он перезапускается в соответствии со своейrestartPolicy
. - Пример использования: Обнаружение дедлоков или ситуаций, когда приложение зависло, но процесс еще существует.
- Назначение: Проверяет, работает ли приложение. Если проба завершается неудачно,
Readiness Probe (Проверка готовности)
- Назначение: Проверяет, готово ли приложение принимать трафик. Если проба не проходит, эндпоинты этого пода удаляются из объектов
Service
. Трафик на него перестает поступать, пока проба снова не станет успешной. - Пример использования: Приложение запущено, но ему нужно время на загрузку конфигурации, данных или установку соединений с базой данных.
- Назначение: Проверяет, готово ли приложение принимать трафик. Если проба не проходит, эндпоинты этого пода удаляются из объектов
Startup Probe (Проверка запуска)
- Назначение: Используется для приложений, которые долго запускаются. Она отключает
Liveness
иReadiness
пробы до тех пор, пока сама не завершится успешно. Это предотвращает убийство контейнера до того, как он успел полностью запуститься. - Пример использования: Тяжеловесные Java-приложения или приложения, которым нужно прочитать большой объем данных при старте.
- Назначение: Используется для приложений, которые долго запускаются. Она отключает
Способы проверки
Для всех проб можно настроить один из трех механизмов проверки:
- httpGet: Выполняет GET-запрос к указанному эндпоинту. Ответ с кодом
2xx
или3xx
считается успешным. - tcpSocket: Пытается установить TCP-соединение с указанным портом. Успешное соединение — успех.
- exec: Выполняет команду внутри контейнера. Код завершения
0
— успех.
Пример манифеста:
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: my-app-container
image: my-app-image
ports:
- containerPort: 8080
# Проверка, что приложение готово принимать трафик
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 15 # Начать проверку через 15 секунд после старта
periodSeconds: 10 # Проверять каждые 10 секунд
# Проверка, что приложение "живо"
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30
periodSeconds: 20
failureThreshold: 3 # Считать сбоем после 3 неудачных попыток