Вопрос с собеседования · DevOps

Приложение долго стартует, а 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

Подробно

Три пробы:

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

Разбор собеседования