kubernetes errors
March 12, 2023

Поды в статусе Failed, Succeeded.

В данной статье рассмотрим три конечных или завершённых статуса у пода.

Начнём рассмотрение со статуса Failed.

При данном статусе все контейнеры в Pod были завершены и, по крайней мере, один контейнер завершил работу в результате сбоя. То есть контейнер либо вышел с ненулевым статусом, либо был завершен системой (а точнее kubelet'ом), а не самостоятельно.

Контейнер завершается с ненулевым статусом (exit code не равно 0), т.е. с ошибкой, в случае сбоя со стороны приложения в этом контейнере.

Является противоположностью для статуса Succeeded. При котором контейнер завершается корректно.

Причины появления.

  • Wrong image used for POD.
  • Wrong command/arguments are passed to the POD.
  • Kubelet failed to check POD liveliness(i.e., liveliness probe failed).
  • POD failed health check.
  • Problem in network CNI plugin (misconfiguration of CNI plugin used for networking).
  • Pod eviction (частая проблема).

Wrong image used for POD

В этом случае используется имидж с ошибкой. Это может быть следствием неправильной сборки образа.

То есть образ есть, он доступен для скачивания из репозитория, но в самом образе есть неустранимая ошибка, которая приводит к тому, что контейнер не стартует.

Wrong command/arguments are passed to the POD.

При создании пода ему можно передать команды, которые приведут к его краху. Например, rm -rf /etc

Kubelet failed to check POD

Под не прошёл пробы в момент их проведения. Имеет смысл проверить выполняется ли под без проб. И если так, то скорректировать настройки проб.

Pod eviction

Возникает при попытке kubelet завершить и вытеснить под с ноды кластера. Может происходить по нескольким причинам:

  1. Нода кластера preemptible и должна быть перезагружена;
  2. На ноде не хватает ресурсов для запуска высокоприоритетных подов.
  3. На ноду повесили taint NoExecute.

Если нода кластера вытесняемая (preemptible), то перед обязательной перезагрузкой такой ноды поду даётся время на завершение контейнера. Такое поведение называется gracefulShutdown. В течении времени, указанного в terminationGracePeriod, контейнер может корректно завершить свою работу. По-умолчанию terminationGracePeriod равен 30 секундам.

Если контейнер не успевает корректно завершиться за указанный период, то он переходит в состояние Failed. При этом он находится в завершённом состоянии (Terminated). Причина (Reason) при этом будет указана как Error т.е завершено с ошибкой.

Во втором случае под будет подлежать эвакуации если на ноду запланированы поды с высоким приоритетом, а ресурсов для их запуска будет не хватать. Если при создании подов пользователем не указывать специально приоритет, то по-умолчанию он будет равен нулю. Для реализации приоритетов у подов в Kubernetes есть специальный объект, который называется PriorityClass. А подключить его можно при создании манифеста пода, использовав параметр priorityClassName: <имя PriorityClass>

Если количество подов в состоянии Failed становится равным 12500, то включается механизм автоматического удаления таких подов. Идёт запуск Garbage Collection с помощью Kubernetes API. Про работу Garbage Collection нужно говорить отдельно.

Такие поды никак не влияют на производительность кластера, но могут вызывать некоторое эстетическое неудобство. В случае необходимости их можно удалить вручную.

Удаление подов в статусе failed в ручном режиме.

kubectl delete pods --field-selector=status.phase=Failed --force

Статус пода Succeded.

В этом случае приложение в контейнере отработало корректно и перезапуска пода не будет. Контейнер при этом находится в завершённом состоянии (Terminated). Причина (Reason) при этом будет указана как Completed т.е готово.

Полезные ссылки.

Про статус Failed у пода на stackoverflow:
https://stackoverflow.com/questions/55570194/reasons-of-pod-status-failed

Жизненный цикл пода:
https://kubernetes-blog.blogspot.com/2019/09/pod-lifecycle.html

Про Garbage Collection:
https://kubernetes.io/docs/concepts/architecture/garbage-collection/

Understanding Kubernetes Evicted Pods:
https://dev.to/sysdig/understanding-kubernetes-evicted-pods-1hmd

Про приоритет подов и вытеснение:
https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/

Фазы жизни пода:
https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase