Перейти к содержанию
Бэкенд и системы

CrashLoopBackOff в Kubernetes: как найти причину перезапусков

CrashLoopBackOff означает, что Kubernetes откладывает очередной перезапуск после повторных сбоев контейнера. Причина сбоя в этом статусе не указана. Соберите данные предыдущей попытки и выясните, кто остановил процесс, прежде чем менять настройки.

Автор: Опубликовано

4 мин чтенияРедакционный разборОбновлено
  • Kubernetes
  • CrashLoopBackOff
  • Probes
  • Диагностика
Главная мысль

Сопоставляйте предыдущие логи, последнее завершение и события. Ошибка приложения, перезапуск из-за probe и нехватка памяти требуют разных исправлений.

Сохраните данные неудачной попытки

Подставьте настоящие namespace, имя Pod и имя контейнера. В Pod может быть несколько контейнеров, поэтому указывайте -c явно. Предыдущие логи особенно полезны, пока новая попытка ещё не дошла до места сбоя. Они могут отсутствовать, если предыдущий экземпляр не сохранился.

Запишите Last State, Reason, Exit Code, счётчик перезапусков и время событий. Проверьте Deployment и версию релиза. Не удаляйте Pod в начале диагностики: замена может уничтожить нужные данные. Задержка повторного запуска зависит от версии и настроек kubelet; фиксированное время ожидания само по себе не объясняет причину.

NS=demo
POD=api-7d8c9f-example
CONTAINER=api
kubectl get pod "$POD" -n "$NS" -o wide
kubectl describe pod "$POD" -n "$NS"
kubectl logs "$POD" -n "$NS" -c "$CONTAINER" --previous --tail=100
kubectl logs "$POD" -n "$NS" -c "$CONTAINER" --tail=100
kubectl get events -n "$NS" --field-selector "involvedObject.name=$POD" --sort-by=.metadata.creationTimestamp

Выберите направление по фактам

Представьте новый релиз API: в логах снова появляется booting, затем процесс исчезает без собственного исключения. Это ещё не доказывает ошибку приложения. Сопоставьте завершение с событиями kubelet. Liveness probe может остановить процесс, который продолжает инициализацию; отсутствие настройки может заставить приложение завершиться самостоятельно.

Код 137 соответствует принятому обозначению завершения через SIGKILL, но сам по себе не доказывает превышение лимита памяти. Ищите OOMKilled и данные о ресурсах. ImagePullBackOff и Pending из-за невозможности назначить Pod на узел требуют другого разбора: приложение могло ещё не запуститься.

Следующая проверка зависит от причины
НаблюдениеЧто проверить
Исключение приложенияНастройки, команда, зависимость
Unhealthy и KillingАдрес и время probe
OOMKilledПамять и лимит
Повторы после exit 0Команда и тип workload

Пример: инициализация занимает 45 секунд

Наш API около 45 секунд загружает индекс и только потом открывает health endpoints. Liveness probe запускается сразу, проверяет процесс каждые 10 секунд и перезапускает после трёх ошибок. События показывают провал probe и Killing, а логи каждый раз обрываются на загрузке. Поэтому инициализация не успевает закончиться.

Добавьте этот фрагмент в описание контейнера API, предварительно реализовав три endpoint. /startedz подтверждает завершение инициализации, /livez — работоспособность самого процесса, /readyz — возможность принимать запросы. Параметры startupProbe дают примерно 90 секунд на запуск. Это бюджет для примера, а не универсальное значение.

startupProbe:
  httpGet:
    path: /startedz
    port: 8080
  periodSeconds: 5
  timeoutSeconds: 2
  failureThreshold: 18
livenessProbe:
  httpGet:
    path: /livez
    port: 8080
  periodSeconds: 10
  timeoutSeconds: 2
  failureThreshold: 3
readinessProbe:
  httpGet:
    path: /readyz
    port: 8080
  periodSeconds: 5
  timeoutSeconds: 2
  failureThreshold: 2

Не смешивайте три вида probe

При наличии startupProbe проверки liveness и readiness ждут её первого успеха. Повторные ошибки startup или liveness могут привести к перезапуску. Ошибка readiness убирает готовность для обычного трафика Service, но сама контейнер не перезапускает. Смягчение readiness не исправит цикл, вызванный liveness.

Не заставляйте liveness падать при каждой краткой недоступности базы. Это может одновременно перезапустить все API-реплики и затянуть восстановление. Временную невозможность обслуживать запросы при необходимости отражайте в readiness. Liveness должна проверять состояние, которое перезапуск способен улучшить. Делайте проверки дешёвыми и задавайте понятные таймауты.

Ошибки запуска и OOM проверяйте отдельно

При немедленном завершении с ненулевым кодом проверяйте команду образа, обязательные переменные, подключённые файлы, права и ошибки зависимостей. Сравните спецификацию с рабочей версией. Если команда успешно заканчивается в Deployment с обычной политикой Always, контейнер тоже будет перезапускаться. Для одноразовой задачи обычно подходит Job.

При OOMKilled изучите пики памяти, параллелизм и лимит. Текущие метрики могут не показать короткий всплеск перед завершением. Увеличение лимита иногда помогает временно, если на узле хватает ресурсов, но затем нужно искать утечку или слишком большой вход. Memory request влияет на размещение Pod и не заменяет лимит.

Подтвердите восстановление всего релиза

Примените исправленную конфигурацию обычным способом развёртывания. Следите за всеми новыми Pod: готовностью, перезапусками и событиями. Проверьте настоящий запрос к API и наблюдайте дольше прежнего интервала сбоя. Фаза Running сама по себе не подтверждает готовность и стабильность сервиса.

В примере с медленным стартом ожидаемый результат — одна завершённая инициализация, успешная startupProbe и стабильный счётчик перезапусков после неё. Сохраните причину и результат проверки в разборе инцидента. Если релиз остаётся неработоспособным, рассмотрите откат по правилам проекта, сохранив логи.

Коротко

Частые вопросы

CrashLoopBackOff — это фаза Pod?

Нет. Он описывает ожидание повторного запуска сбойного контейнера и часто виден в выводе kubectl. Причину ищите в состоянии контейнера и событиях Pod.

Почему текущие логи пустые?

Новая попытка могла ещё ничего не записать. Используйте --previous для нужного контейнера, чтобы увидеть сохранённую предыдущую попытку. Доступность зависит от хранения логов и замены Pod.

Может ли readiness probe перезапустить контейнер?

Сама ошибка readiness этого не делает. Startup и liveness могут вызвать перезапуск после заданного числа ошибок. Проверьте события, прежде чем связывать перезапуск с probe.

Поможет ли удаление Pod?

Контроллер обычно создаст новый Pod с той же ошибочной конфигурацией. Удаление может лишить вас данных для диагностики. Исправьте или откатите workload и проверьте замену.

Источники

Источники и редакционная политика

Сведения проверены 4 октября 2026 г. Ссылки рядом с разделами указывают источники фактов и технических объяснений. Выводы, учебные сценарии и рекомендации по подготовке — редакционная работа RecallDeck.

От чтения к воспроизведению

Отрепетируйте полный цикл интервью.

RecallDeck возвращает сложные темы по расписанию и помогает удерживать в памяти язык, SQL, архитектуру и поведенческие истории.

Начать подготовку

Продолжить подготовку