Получить доступ

Приложение долго стартует, а Kubernetes перезапускает его по кругу. Как правильно настроить пробы?

MiddleKubernetes
Ещё спрашивают так:
  • Зачем нужна startupProbe?
  • Что проверять в liveness, а что в readiness?
Коротко

Liveness начинает проверять до окончания старта, приложение не успевает ответить — kubelet убивает его и запускает заново. Решение — startupProbe: пока она не прошла, liveness и readiness не выполняются; бюджет старта = failureThreshold × periodSeconds. Liveness проверяет только «процесс жив и не завис», без зависимостей; readiness — «готов обслуживать», может учитывать прогрев и критичные зависимости.

  • Liveness, зависящая от БД, при сбое БД перезапустит все поды разом
  • Readiness при остановке: под убирают из Service, но нужна пауза preStop
  • Пробы должны быть дешёвыми и с разумными таймаутами

А ещё Spring Boot: /actuator/health/liveness и /actuator/health/readiness

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Три пробы:

пробапри неудачечто проверять
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.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем