From 21a5f875a59a39f4efd39aa51e400502158862bc Mon Sep 17 00:00:00 2001 From: Valery Barsukov Date: Tue, 3 Aug 2021 14:46:06 +0300 Subject: [PATCH] Add ns-remover.sh --- ns-remover.sh | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100755 ns-remover.sh diff --git a/ns-remover.sh b/ns-remover.sh new file mode 100755 index 0000000..716ac0c --- /dev/null +++ b/ns-remover.sh @@ -0,0 +1,102 @@ +#!/bin/bash +# +# NAMESPACE Remover версия 1.0 (15.03.2021) +# Автор: Барсуков В.В. +# Лицензия GPLv2 или выше. +# +# Описание: +# Средство удаления "застрявших" NAMESPACE (находящихся в стадии Terminating) +# +# Использование: +# ns-remover.sh +# + +# ------------------------------------------------------------------ +# Версия и дата +VERNUM="1.0" +VERDATE="15.03.2021" +# ------------------------------------------------------------------ +# Меняем локаль на ru_RU.UTF-8 +export LC_ALL=ru_RU.UTF-8 + +# Выводим шапку +echo +echo "+-------------------------------------------------------+" +echo "| Средство удаления NAMESPACE. Версия $VERNUM от $VERDATE |" +echo "| NAMESPACE Remover (NR) |" +echo "| (C) Барсуков В.В. |" +echo "+-------------------------------------------------------+" +echo "| Формат: ns-remover.sh NAMESPACE |" +echo "+-------------------------------------------------------+" + +# Если число передаваемых параметров меньше 1 +if [[ "$#" -lt "1" ]]; then + echo "NR: Ошибка. Нет обязательного аргумента." + echo "NR: Доступные для удаления окружения:" + kubectl get ns | grep "Terminating" + exit 1 +fi + +# Получаем аргумент +NAMESPACE=$1 + +# Проверка наличия Namespace. Если в выходе "NotFound" - ругаемся и выходим +STATUS=$(kubectl get ns $NAMESPACE | grep "NotFound") +if ! [[ -z "$STATUS" ]]; then + echo "NR: Ошибка. Окружение $NAMESPACE не найдено." + echo "NR: Доступные для удаления окружения:" + kubectl get ns | grep "Terminating" + exit 2 +fi + +# Проверка статуса Namespace (удаляем только окружения в статусе Terminating) +STATUS=$(kubectl get ns $NAMESPACE | grep "Terminating") +if [[ -z "$STATUS" ]]; then + echo "NR: Ошибка. Окружение $NAMESPACE не подходит для удаления." + echo "NR: Доступные для удаления окружения:" + kubectl get ns | grep "Terminating" + exit 3 +fi + +# Проверка наличия подов в статусе "Running" в удаляемом окружении +STATUS=$(kubectl get pods --namespace $NAMESPACE | grep "Running") +if ! [[ -z "$STATUS" ]]; then + echo "NR: Ошибка. Ещё остались запущенные поды в окружении $NAMESPACE:" + kubectl get pods --namespace $NAMESPACE | grep "Running" + exit 4 +fi + +# Готовим tmp.json фйал +kubectl get ns $NAMESPACE -o json > tmp.json +awk 'NR==FNR{if (/spec/) hit=NR; next} {print} FNR==hit{exit}' tmp.json tmp.json > tmp2.json +echo ' "finalizers": []' >> tmp2.json +echo ' }' >> tmp2.json +echo '}' >> tmp2.json + +cat tmp2.json + +# Запускаем отдельный kubectl proxy +kubectl proxy & + +# Небольшая пауза +sleep 3 + +# Удаляем окружение (вариант 2) +echo "GNR: Удаляем окружение $NAMESPACE:" +curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp2.json http://127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize + +# Удаляем окружение (вариант 1) +#kubectl patch namespace $NAMESPACE -p '{"metadata":{"finalizers":[]}}' --type='merge' -n $NAMESPACE +#kubectl delete namespace $NAMESPACE --grace-period=0 --force + +# Проверяем удалено ли окружение +echo "NR: Проверяем удалено ли окружение $NAMESPACE:" +kubectl get ns $NAMESPACE + +# Очищаем за собой +kill -9 $(ps aux | grep "kubectl proxy" | grep -v "grep" | awk '{print $2}') +rm tmp.json +rm tmp2.json + +# Выход +exit 0