Поды в статусе 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 command/arguments are passed to the POD.
При создании пода ему можно передать команды, которые приведут к его краху. Например, rm -rf /etc
Под не прошёл пробы в момент их проведения. Имеет смысл проверить выполняется ли под без проб. И если так, то скорректировать настройки проб.
Возникает при попытке kubelet завершить и вытеснить под с ноды кластера. Может происходить по нескольким причинам:
- Нода кластера preemptible и должна быть перезагружена;
- На ноде не хватает ресурсов для запуска высокоприоритетных подов.
- На ноду повесили 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