Каковы основные причины состояния CrashLoopBackOff в Kubernetes?

«Каковы основные причины состояния CrashLoopBackOff в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

CrashLoopBackOff — это состояние пода, в котором контейнеры постоянно завершаются с ошибкой, и Kubelet перезапускает их с экспоненциальной задержкой (backoff). Основные причины:

1. Ошибки в самом приложении (Код контейнера) Контейнер запускается, но главный процесс (PID 1) завершается с ненулевым кодом выхода.

  • Диагностика: Проверить логи пода.
    kubectl logs <pod-name> --previous  # Логи предыдущего запуска
    kubectl logs <pod-name> -c <container-name> # Логи конкретного контейнера

2. Недостаточные или некорректные ресурсы (CPU/RAM)

  • Out of Memory (OOMKilled): Контейнер превысил лимит памяти и был убит ядром.
  • Нехватка CPU для старта: Процессу не хватает CPU для инициализации в разумное время.
  • Диагностика: Проверить запросы (requests) и лимиты (limits) в манифесте, события пода.
    kubectl describe pod <pod-name>
    kubectl get pod <pod-name> -o yaml | grep -A 5 resources

3. Проблемы с зависимостями и пробами (Probes)

  • Liveness-проба постоянно падает: Kubelet убивает контейнер, так как проба проверки "живучести" не проходит.
  • Приложение зависит от внешнего сервиса (БД, кэш), который недоступен.
  • Диагностика: Проверить конфигурацию livenessProbe и readinessProbe, логи приложения на этапе инициализации.

4. Проблемы с томами (Volumes) и файловой системой

  • Отсутствующий Volume: Под пытается смонтировать PersistentVolumeClaim, который не существует или не привязан.
  • Неправильные права доступа: Контейнер запускается от non-root пользователя и не может записать в смонтированную директорию.
  • Диагностика: kubectl describe pod — секция Volumes и Mounts.

5. Некорректная конфигурация

  • Неверные переменные окружения (ConfigMap/Secret): Отсутствующие или синтаксически неверные значения.
  • Ошибки в аргументах командной строки (command/args).
  • Использование неправильного образа (image) или тега.

6. Проблемы с безопасностью (SecurityContext)

  • Запуск от непривилегированного пользованика (runAsNonRoot) с образом, требующим root.
  • Запрет на запись в корневую файловую систему (readOnlyRootFilesystem: true) без корректного монтирования томов.

Общий алгоритм отладки:

  1. kubectl describe pod <name> — ищем Events внизу вывода.
  2. kubectl logs <pod-name> --previous — смотрим, почему упал предыдущий запуск.
  3. Проверяем манифест пода на очевидные ошибки в ресурсах, пробах, томах.