В этом коротком руководстве мы рассмотрим, как удалить удаленные или завершенные поды в кластере Kubernetes.
Есть много причин, по которым вы можете обнаружить, что некоторые поды находятся в состоянии Evicted и Terminated.
В случае eviction это часто происходит в результате нехватки ресурсов на рабочих нодах или ошибки приложения.
Terminated может быть результатом уменьшения масштаба приложения или развертывания новой версии приложения, после которой прекращается работа старых подов.
Служба kubelet, которая работает на каждом узле кластера, отвечает за состояние eviction подов.
Вы можете получить список подов в пространстве имен, застрявших в состоянии Evicted и Terminated, выполнив следующую команду:
kubectl get pods -n namespace | egrep -i 'Terminated|Evicted'
Как удалить поды в Kubernetes
Вы можете удалить эти поды разными способами.
Использование собственных команд kubectl и Bash
Это команды bash с фильтрацией, которые вы можете запустить для принудительного удаления подов в пространстве имен, которые застряли в завершенном состоянии.
# Определение неймспейса
namespace="mynamespace"
B
# Получаем поды
epods=$(kubectl get pods -n ${namespace} | egrep -i 'Terminated|Evicted' | awk '{print $1 }')
# Удаляем их
for i in ${epods[@]}; do
kubectl delete pod --force=true --wait=false --grace-period=0 $i -n ${namespace}
done
Подтвердите, есть ли еще контейнеры в этом состоянии.
kubectl get pods -n ${namespace} | egrep -i 'Terminated|Evicted'
Удаление всех исключенных и завершенных подов из всех пространств имен:
kubectl get pods --all-namespaces | egrep -i 'Evicted|Terminated' | awk '{print $2 " --namespace=" $1}' | xargs kubectl delete pod --force=true --wait=false --grace-period=0
Удалите все контейнеры в состоянии ImagePullBackOff из всех пространств имен – Бонус:
kubectl get pods --all-namespaces | grep -E 'ImagePullBackOff|ErrImagePull|Evicted' | awk '{print $2 " --namespace=" $1}' | xargs kubectl delete pod
Использование фильтров kubectl и jq
Вы также можете отфильтровать вывод команды kubectl и перенаправить в jq для получения определенных столбцов.
Сначала установите команду jq:
--- Ubuntu / Debian ---
$ sudo apt update && sudo apt install jq
--- CentOS/Fedora ---
$ sudo yum -y install epel-release
$ sudo yum -y install jq
--- RHEL ---
wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 -O jq
chmod +x jq
sudo mv jq /usr/local/bin
Затем удалите застрявшие поды с помощью команды:
kubectl get pods --all-namespaces -o json | jq '.items[] | select(.status.reason!=null) | select(.status.reason | contains("Evicted")) | "kubectl delete pods \(.metadata.name) -n \(.metadata.namespace)"' | xargs -n 1 bash -c
Оставайтесь на связи, чтобы прочитать еще больще интересных руководств по контейнерам.
Бонус – удаление подов с статусом Failed
Для удаления подов в namespace mobsf-test:
kubectl get pods --field-selector 'status.phase=Failed' -o name -n mobsf-test | xargs kubectl delete -n mobsf-test