При каких условиях Pod в Kubernetes завершит работу с ошибкой (упадет)?

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

Ответ

Pod может перейти в состояние Error (CrashLoopBackOff) или быть завершенным по нескольким основным причинам:

  1. Завершение основного процесса контейнера: Если процесс с PID 1 в контейнере завершается с ненулевым кодом выхода. Kubernetes перезапустит контейнер согласно политике restartPolicy.
  2. OOMKill (Out Of Memory): Если контейнер превысит свой лимит памяти (limits.memory), ядро Linux убьет процесс. В событиях Pod будет OOMKilled.
  3. Неудачные пробы (Probes):
    • Liveness Probe: После failureThreshold неудачных проверок контейнер будет убит и перезапущен.
    • Startup Probe: Если проба не завершится успешно за отведенное время, контейнер будет убит, подчиняясь политике перезапуска.
  4. Сбой Init Container: Если любой init-контейнер завершится с ошибкой, Pod не запустится и останется в состоянии Init:Error.
  5. Проблемы с нодой (Node):
    • Eviction: Kubelet может выселить Pod с ноды при нехватке ресурсов (DiskPressure, MemoryPressure).
    • Node Failure: Если нода становится недоступной, контроллер репликации (например, Deployment) создаст новый Pod на другой ноде.
  6. Ошибки при работе с образами: Не удалось вытянуть образ (ImagePullBackOff) из-за неверного имени, отсутствия прав в registry или проблем с сетью.
  7. Ошибки конфигурации: Некорректные монтирования томов (например, ссылка на несуществующий PersistentVolumeClaim), проблемы с SecurityContext (например, попытка запуска от root при запрете).

Пример, приводящий к падению из-за liveness probe:

apiVersion: v1
kind: Pod
metadata:
  name: liveness-example
spec:
  containers:
  - name: app
    image: myapp:v1
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 3
      periodSeconds: 3
      failureThreshold: 2 # После 2 неудачных проверок контейнер будет убит
    resources:
      limits:
        memory: "128Mi" # Превышение этого лимита вызовет OOMKill