Обратитесь к официальной документации Kubernetes:
В Kubernetes проверки состояния, также известные как пробы, являются критически важным механизмом для обеспечения высокой доступности и устойчивости ваших приложений. Kubernetes использует эти пробы для определения состояния здоровья и готовности ваших Pod-ов, позволяя системе предпринимать соответствующие действия, такие как перезапуск контейнеров или маршрутизация трафика. Без правильной настройки проверок состояния Kubernetes не сможет надежно управлять жизненным циклом вашего приложения, что может привести к ухудшению качества сервиса или сбоям.
Kubernetes предлагает три типа проб:
livenessProbe
: Определяет, запущен ли контейнер. Если liveness probe не проходит, Kubernetes завершит Pod и перезапустит его согласно политике перезапуска.readinessProbe
: Определяет, готов ли контейнер обслуживать трафик. Если readiness probe не проходит, Endpoint Controller удалит Pod из списка Endpoint-ов Service до тех пор, пока проба не пройдет успешно.startupProbe
: Специально проверяет, успешно ли запустилось приложение. Liveness и readiness пробы не будут выполняться, пока startup probe не пройдет успешно. Это очень полезно для приложений с длительным временем запуска.Правильная настройка этих проб необходима для создания надежных и самовосстанавливающихся приложений в Kubernetes.
Kubernetes поддерживает три механизма реализации проб:
GET
действиеВыполняет HTTP-запрос
GET
к IP-адресу Pod-а на указанном порту и пути. Проба считается успешной, если код ответа находится в диапазоне от 200 до 399.
Сценарии использования: Веб-серверы, REST API или любое приложение, предоставляющее HTTP-эндпоинт.
Пример:
exec
действиеВыполняет указанную команду внутри контейнера. Проба считается успешной, если команда завершается с кодом 0.
Сценарии использования: Приложения без HTTP-эндпоинтов, проверка внутреннего состояния приложения или выполнение сложных проверок, требующих специфических инструментов.
Пример:
Socket
действиеПытается открыть TCP-сокет на IP-адресе контейнера и указанном порту. Проба считается успешной, если TCP-соединение устанавливается.
Сценарии использования: Базы данных, очереди сообщений или любое приложение, которое общается по TCP-порту, но может не иметь HTTP-эндпоинта.
Пример:
Параметры | Описание |
---|---|
Initial Delay | initialDelaySeconds : Период ожидания (в секундах) перед началом проверок. По умолчанию: 300 . |
Period | periodSeconds : Интервал между проверками (1-120 с). По умолчанию: 60 . |
Timeout | timeoutSeconds : Время ожидания ответа пробы (1-300 с). По умолчанию: 30 . |
Success Threshold | successThreshold : Минимальное количество последовательных успешных проверок для отметки как здорового. По умолчанию: 0 . |
Failure Threshold | failureThreshold : Максимальное количество последовательных неудач для срабатывания действия:- 0 : Отключает действия при сбоях- По умолчанию: 5 неудач → перезапуск контейнера. |
Параметр | Применимые протоколы | Описание |
---|---|---|
Protocol | HTTP/HTTPS | Протокол проверки состояния |
Port | HTTP/HTTPS/TCP | Целевой порт контейнера для проверки. |
Path | HTTP/HTTPS | Путь эндпоинта (например, /healthz ). |
HTTP Headers | HTTP/HTTPS | Пользовательские заголовки (добавьте пары ключ-значение). |
Command | EXEC | Команда для проверки, выполняемая в контейнере (например, sh -c "curl -I localhost:8080 | grep OK" ).Примечание: Экранируйте специальные символы и проверьте работоспособность команды. |
Если статус Pod-а указывает на проблемы, связанные с пробами, вот как их диагностировать:
Ищите события, связанные с LivenessProbe failed, ReadinessProbe failed или StartupProbe failed. Эти события часто содержат конкретные сообщения об ошибках (например, отказ соединения, HTTP 500 ошибка, код выхода команды).
Изучите логи приложения, чтобы увидеть ошибки или предупреждения в момент сбоя пробы. Возможно, приложение логирует причины, по которым эндпоинт проверки не отвечает корректно.
kubectl exec -it <pod-name> -- curl <probe-path>:<probe-port>
или wget
внутри контейнера, чтобы увидеть реальный ответ.kubectl exec -it <pod-name> -- <command-from-probe>
и проверьте код выхода и вывод.nc
(netcat) или telnet
из другого Pod-а в той же сети или с хоста (если разрешено), чтобы проверить TCP-соединение: kubectl exec -it <another-pod> -- nc -vz <pod-ip> <probe-port>
.kubectl top pod <pod-name>
) и рассмотрите возможность настройки лимитов/запросов ресурсов.