Приложение долго стартует, а Kubernetes перезапускает его по кругу. Как правильно настроить пробы?
- Зачем нужна startupProbe?
- Что проверять в liveness, а что в readiness?
Liveness начинает проверять до окончания старта, приложение не успевает ответить — kubelet убивает его и запускает заново. Решение — startupProbe: пока она не прошла, liveness и readiness не выполняются; бюджет старта = failureThreshold × periodSeconds. Liveness проверяет только «процесс жив и не завис», без зависимостей; readiness — «готов обслуживать», может учитывать прогрев и критичные зависимости.
- Liveness, зависящая от БД, при сбое БД перезапустит все поды разом
- Readiness при остановке: под убирают из Service, но нужна пауза preStop
- Пробы должны быть дешёвыми и с разумными таймаутами
А ещё Spring Boot: /actuator/health/liveness и /actuator/health/readiness
Подробно
Три пробы:
| проба | при неудаче | что проверять |
|---|---|---|
| startup | перезапуск после исчерпания бюджета | приложение запустилось |
| liveness | перезапуск контейнера | процесс отвечает, нет взаимоблокировки |
| readiness | исключение из Service | готов принимать запросы |
Типичные ошибки:
- большой
initialDelaySecondsвместо startupProbe — медленное обнаружение реальных зависаний; - liveness проверяет базу или соседние сервисы — каскадные перезапуски при чужом сбое;
- одинаковые эндпоинты для liveness и readiness;
- тяжёлая проверка, которая сама нагружает приложение;
- таймаут пробы меньше паузы GC под нагрузкой — ложные перезапуски.
Остановка пода: удаление из Endpoints и SIGTERM происходят параллельно; preStop с паузой в несколько секунд и корректная обработка SIGTERM убирают ошибки при выкатке.
Пример
startupProbe:
httpGet: { path: /actuator/health/liveness, port: 8080 }
periodSeconds: 5
failureThreshold: 36 # до 3 минут на старт
livenessProbe:
httpGet: { path: /actuator/health/liveness, port: 8080 }
periodSeconds: 10
failureThreshold: 3
readinessProbe:
httpGet: { path: /actuator/health/readiness, port: 8080 }
periodSeconds: 5
lifecycle:
preStop:
sleep: { seconds: 5 } # дать балансировке убрать подЧто хотят услышать
- startupProbe как решение медленного старта.
- Разное назначение liveness и readiness, опасность зависимостей в liveness.
- Остановка пода и preStop.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Liveness проверяет базу данных, чтобы под не принимал запросы
- ✗Readiness убивает контейнер, если он долго не готов
- ✗Увеличить частоту liveness и поставить initialDelaySeconds 0, чтобы ускорить старт
- ✓startupProbe откладывает liveness и readiness до окончания старта
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.