Ответ
После успешного запуска контейнера (т.е. процесса внутри контейнера стартовал) первой срабатывает startupProbe (если она настроена). Её цель — определить, когда контейнер запустился. Это особенно важно для legacy-приложений, которым может требоваться длительное время на инициализацию.
Логическая последовательность проб (probes) для контейнера:
startupProbe(опционально): Проверяет, запустилось ли приложение. Пока эта проба не станет успешной,livenessProbeиreadinessProbeне запускаются. ЕслиstartupProbeне задана, kubelet переходит к следующей пробе.readinessProbe: Запускается после успешногоstartupProbe(или сразу после старта контейнера, еслиstartupProbeнет). Определяет, готово ли приложение принимать трафик. Пока проба не успешна, под не будет добавлен в эндпоинты (Endpoint) Service и не получит входящие запросы.livenessProbe: Запускается периодически после успешного старта контейнера. Определяет, работает ли приложение. Если проба падает, kubelet убивает контейнер и перезапускает его согласно политике restartPolicy.
Пример конфигурации в манифесте пода для приложения с долгой инициализацией:
apiVersion: v1
kind: Pod
metadata:
name: slow-start-app
spec:
containers:
- name: app
image: mycompany/slow-app:latest
ports:
- containerPort: 8080
startupProbe: # Должна завершиться успешно первой
httpGet:
path: /health/startup
port: 8080
failureThreshold: 30 # Пробуем много раз (30 * 5s = 150s максимум)
periodSeconds: 5 # Интервал между попытками
readinessProbe: # Начинает работать после успешного startupProbe
httpGet:
path: /health/ready
port: 8080
initialDelaySeconds: 0 # Ждем успеха startupProbe, поэтому задержка 0
periodSeconds: 5
livenessProbe: # Работает постоянно после запуска
httpGet:
path: /health/live
port: 8080
initialDelaySeconds: 60 # Даем время на полную инициализацию
periodSeconds: 10
Ключевые параметры проб:
initialDelaySeconds: Задержка перед первой проверкой.periodSeconds: Интервал между проверками.failureThreshold: Количество неудачных попыток, после которых проба считается проваленной.successThreshold: Количество успешных попыток для перевода пробы в статус "успех".
Использование startupProbe позволяет задать отдельные, более либеральные параметры для фазы инициализации, не мешая работе readinessProbe и livenessProbe во время нормальной работы.