Ответ
Health Check'и (пробы) в Kubernetes — это механизмы, с помощью которых kubelet определяет состояние контейнера внутри пода. В контексте Deployment они критически важны для обеспечения нулевого времени простоя (zero-downtime) при обновлениях и отказоустойчивости.
Я различаю два основных типа проб:
- Liveness Probe: Отвечает на вопрос «Жив ли контейнер?». Если проба fails, kubelet убивает контейнер, и он перезапускается согласно политике restartPolicy.
- Readiness Probe: Отвечает на вопрос «Готов ли контейнер принимать трафик?». Если проба fails, конечные точки (Endpoints) этого пода удаляются из соответствующего Service, и трафик на него не направляется.
Пример конфигурации в Deployment для веб-приложения:
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: web-app
image: myapp:v1.2
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /healthz # Эндпоинт для проверки «живучести»
port: 8080
initialDelaySeconds: 30 # Даём приложению время на старт
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready # Эндпоинт для проверки готовности (проверяет подключение к БД, кешу и т.д.)
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 3 # Допускаем 3 неудачи подряд
Из практического опыта:
initialDelaySeconds— самый важный параметр. Слишком маленькое значение приведёт к перезапускам контейнера во время его инициализации.- Readiness Probe часто сложнее Liveness Probe. Например, она может проверять доступность внешних зависимостей (БД, брокер сообщений), в то время как Liveness Probe проверяет лишь внутреннее состояние процесса.
- Правильно настроенные пробы позволяют Deployment'у безопасно выполнять rolling update: новый под получает трафик только после успешной readinessProbe, а старый под удаляется только после завершения работы с текущими соединениями.