Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Основные типы и механизмы проб (Probes) в Kubernetes
В Kubernetes пробы (Probes) — это механизмы проверки состояния контейнера, которые помогают оркестратору принимать решения о маршрутизации трафика и перезапуске подов. Я выделю три основных типа проб, их назначение, конфигурацию и лучшие практики.
1. Типы проб и их назначение
В Kubernetes существует три вида проб, которые настраиваются в разделе spec.containers[].livenessProbe, readinessProbe и startupProbe манифеста пода.
- Liveness Probe (Проба жизнеспособности)
* **Назначение:** Определяет, жив ли контейнер. Если проба fails, kubelet убивает контейнер, и он подвергается политике перезапуска (`restartPolicy`).
* **Когда использовать:** Для приложений, которые могут "зависнуть" или перейти в нерабочее состояние, но продолжать работать. Например, веб-сервер, который перестал отвечать на запросы.
- Readiness Probe (Проба готовности)
* **Назначение:** Определяет, готов ли контейнер принимать трафик. Если проба fails, контейнер удаляется из списка эндпоинтов (`Endpoints`) сервиса.
* **Когда использовать:** Для приложений, которым требуется время на "прогрев" после старта (загрузка кэша, конфигурации, подключение к БД) или которые временно не могут обслуживать запросы.
- Startup Probe (Проба старта)
* **Назначение:** Определяет, запустилось ли приложение. Пока эта проба не станет successful, все остальные (`liveness` и `readiness`) отключены. Это решает проблему "длинного старта".
* **Когда использовать:** Для устаревших приложений с долгим временем запуска. Позволяет задать очень большой `initialDelaySeconds` для `livenessProbe`, не рискуя убить контейнер на старте.
2. Методы выполнения проб
Каждый тип пробы можно реализовать одним из трех способов:
-
HTTP GET: Наиболее распространенный метод для HTTP-сервисов. Kubelet отправляет GET-запрос на указанный путь и порт.
livenessProbe: httpGet: path: /healthz port: 8080 httpHeaders: - name: Custom-Header value: Awesome initialDelaySeconds: 3 periodSeconds: 10 -
TCP Socket: Kubelet пытается открыть TCP-соединение с указанным портом контейнера. Успех = установлено соединение.
readinessProbe: tcpSocket: port: 3306 initialDelaySeconds: 15 periodSeconds: 20 -
Exec: Kubelet выполняет команду внутри контейнера. Код возврата 0 = успех, все остальное = failure.
livenessProbe: exec: command: - cat - /tmp/healthy periodSeconds: 5
3. Ключевые параметры настройки
Каждая проба конфигурируется набором общих параметров, которые критически важны для стабильности:
initialDelaySeconds: Количество секунд ожидания после старта контейнера перед первой проверкой. Обязательный параметр для избежания ложных срабатываний.periodSeconds: Как часто выполнять проверку (по умолчанию 10).timeoutSeconds: Таймаут на выполнение проверки (по умолчанию 1). Если проба не уложилась в это время — она считается failed.successThreshold: Минимальное количество последовательных успешных проверок для перехода в статус healthy (по умолчанию 1).failureThreshold: Количество последовательных неудач, после которого контейнер считается unhealthy. ДляlivenessProbeэто ведет к перезапуску, дляreadinessProbe— к исключению из балансировщика (по умолчанию 3).
4. Практический пример конфигурации
Вот пример полной конфигурации для веб-приложения с долгим стартом:
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: web
image: myapp:latest
ports:
- containerPort: 8080
startupProbe:
httpGet:
path: /health/startup
port: 8080
failureThreshold: 30 # Позволяем до 30 проверок
periodSeconds: 5 # Каждые 5 секунд
livenessProbe:
httpGet:
path: /health/live
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /health/ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 2 # Требуем двух успехов подряд для стабильности
5. Лучшие практики и рекомендации
- Всегда настраивайте
readinessProbe. Без нее трафик будет отправляться в контейнер сразу после старта, что приведет к ошибкам 5xx. - Используйте разные эндпоинты для
livenessиreadiness.livenessдолжен быть легковесным и не зависеть от внешних сервисов (БД, кэш), иначе падение БД вызовет лавину перезапусков. - Проба
livenessне должна быть "агрессивной". Слишком частые проверки или малые таймауты могут создавать нагрузку и ложные срабатывания. - Для legacy-приложений с долгим стартом всегда используйте
startupProbe. Это более элегантная альтернатива гигантскомуinitialDelaySecondsвlivenessProbe. failureThreshold * periodSeconds— это общее "окно отказа". Рассчитывайте его, исходя из времени восстановления вашего приложения.- Мониторьте события (
kubectl describe pod) и логи kubelet для диагностики проблем с пробами.
Правильная настройка проб — это краеугольный камень надежности приложений в Kubernetes. Они обеспечивают zero-downtime деплойменты, устойчивость к частичным отказам и автоматическое восстановление, что является сутью DevOps-практик.