У меня есть кластер K3s с системными модулями (т.е. kube-system
пространством имен) и модулями моих приложений:
kube-system pod/calico-node-xxxx
kube-system pod/calico-kube-controllers-xxxxxx
kube-system pod/metrics-server-xxxxx
kube-system pod/local-path-provisioner-xxxxx
kube-system pod/coredns-xxxxx
app-system pod/my-app-xxxx
db-system pod/my-db-xxxxx
Я ищу команду shell/kubectl (для скрипта автоматизации), которая может удалить пространство имен моего приложения (которое нужно изменить kubectl delete namespace app-system db-system
), не упоминая имя пространства имен приложения в команде (так как в будущем, если в кластере появится больше пространств имен приложений, мне придется каждый раз редактировать этот скрипт).
Это значит, что я хочу удалить все пространства имен в кластере.кроме kube-system
что-то вроде - kubectl delete namespace -v kube-system
(я знаю, -v
что это недопустимый параметр, просто показываю, как в grep -v
используется для исключения следующих слов. Поиск похожей вещи kubectl delete ns...
)
решение1
Я создал следующий код, так что вы можете использовать его как обертку. Вы можете назвать скрипт как хотите. Напримерexclude_ns_removal
#!/usr/bin/env bash
die ()
{
echo "$@" 1>&2
exit 1
}
usage ()
{
echo "usage: $0 [-h] [-v namespace_to_ignore] " 1>&2
exit 0
}
inarray ()
{
local n=$1 h
shift
for h in "$@"
do
[[ $n = "$h" ]] && return
done
return 1
}
while getopts ":v:h" opt; do
case $opt in
h)
usage
;;
v)
case $OPTARG in
'' | *[0-9]*)
die "Digits not allowed $OPTARG"
;;
*)
val=$OPTARG
;;
esac
;;
:)
die "argument needed to -$OPTARG"
;;
*)
die "invalid switch -$OPTARG"
;;
esac
done
shift $((OPTIND - 1))
while IFS='/' read -r _ ns; do
a+=("$ns")
done < <(kubectl get namespaces --no-headers -o name)
if inarray "$val" "${a[@]}"; then
unset 'a'
{
while IFS='/' read -r _ ns; do
a+=("$ns")
for i in "${!a[@]}"
do
if [[ ${a[i]} == $val ]]; then
unset 'a[i]'
fi
done
done
} < <(kubectl get namespaces --no-headers -o name)
printf '%s\n\n' "Excluding ... $val"
for namespace in "${a[@]}"
do
printf 'Deleting ... %s\n' "$namespace"
done
else
die "No namespace found"
fi
Сделайте скрипт исполняемым:
chmod u+x exclude_ns_removal
Запустите его следующим образом:
./exclude_ns_removal -v kube-system
Результат будет примерно таким:
Excluding ... kube-system
Deleting ... app-system
Deleting ... db-system
Если вывод выглядит хорошо, вам следует изменить эту строку.
printf 'Deleting ... %s\n' "$namespace"
к
kubectl delete namespace "$namespace"
решение2
Может быть проще, чем предыдущие ответы — написание скриптов или циклов здесь излишне, kubernetes сделает все за вас:
kubectl label ns foo=bar --all
kubectl label ns kube-system foo-
kubectl delete ns --selector foo=bar
решение3
Это очень много для проблемы, которую можно решить с помощью
for i in `k get ns -o name | grep -v kube-system`; do
k delete $i;
done