Что такое liveness и readiness probes в Kubernetes? Чем они отличаются?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Liveness и Readiness Probes в Kubernetes
Liveness и Readiness Probes — это механизмы проверки состояния (health checks) контейнеров в Kubernetes, которые помогают оркестратору принимать интеллектуальные решения о маршрутизации трафика и перезапуске подов. Они являются фундаментальными для обеспечения отказоустойчивости и высокой доступности приложений.
Основное предназначение
Обе пробы периодически выполняются kubelet'ом (агент на ноде) для каждого контейнера в поде. Различие лежит в их семантике и последствиях:
- Liveness Probe (Проба жизнеспособности) отвечает на вопрос: "Жив ли контейнер?". Если проба fails (не удалась), kubelet убивает контейнер, и он следует политике перезапуска (
restartPolicy). Это нужно для восстановления "зависшего" приложения, которое не может прогрессировать. - Readiness Probe (Проба готовности) отвечает на вопрос: "Готов ли контейнер принимать трафик?". Если проба fails, Endpoint Controller удаляет IP-адрес этого пода из всех сервисов (
Service), на которые он завязан. Трафик перестает на него направляться. Это позволяет приложению спокойно завершить тяжелую начальную инициализацию или временно "отдохнуть" без получения запросов.
Ключевые отличия
| Аспект | Liveness Probe | Readiness Probe |
|---|---|---|
| Цель | Определить, нужно ли перезапустить контейнер. | Определить, может ли контейнер получать трафик от сервисов. |
| Действие при failure | Контейнер перезапускается. | IP пода удаляется из эндпоинтов сервиса. |
| Влияние на трафик | Косвенное: после перезапуска контейнер снова пройдет проверку readiness, и только потом получит трафик. | Прямое: трафик немедленно прекращает маршрутизироваться на под. |
| Типичные сценарии | Приложение "зависло", deadlock, не отвечает на запросы, но процесс работает. | Приложение загружает большой кэш, конфигурирует соединения с БД, выполняет миграции. |
Типы проб и пример конфигурации
Обе пробы поддерживают три типа проверок:
- HTTP GET: Проверка HTTP-кода ответа (2xx, 3xx — успех).
- TCP Socket: Установление TCP-соединения.
- Exec: Выполнение команды внутри контейнера (код возврата 0 — успех).
Вот пример манифеста пода с обеими пробами:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp
image: myapp:latest
livenessProbe:
httpGet:
path: /health/live
port: 8080
initialDelaySeconds: 30 # Ждем 30 сек перед первой проверкой
periodSeconds: 10 # Проверяем каждые 10 сек
failureThreshold: 3 # 3 неудачи подряд -> контейнер dead
readinessProbe:
httpGet:
path: /health/ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1 # 1 успешная проверка -> контейнер ready
failureThreshold: 3
Рекомендации по использованию
- Всегда настраивайте
readinessProbe. Без нее под получит трафик сразу после старта контейнера, что может привести к ошибкам 5xx. - Используйте
livenessProbeосторожно. Неправильная конфигурация (например,initialDelaySeconds: 0для медленно стартующего приложения) может привести к бесконечной петле перезапусков. Для stateful-приложений (БД, очереди) часто лучше полагаться на внешние системы мониторинга, а не на автоматический перезапущ. - Эндпоинты проб должны быть легковесными и не зависеть от внешних сервисов (БД, кэша), иначе сбой зависимости убьет все ваши поды.
- Настройте
timeoutSeconds,periodSeconds,failureThresholdв соответствии с реальным временем отклика вашего приложения.
Таким образом, правильное комбинирование liveness и readiness probes позволяет Kubernetes автоматически поддерживать работоспособность кластера, обеспечивая zero-downtime деплойments и устойчивость к внутренним сбоям приложения.