Eu tenho um cluster K3s com pods de sistema (ou seja, kube-system
namespace) e meus pods de aplicativos:
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
Estou procurando um comando shell/kubectl (para script de automação) que possa excluir o namespace do meu aplicativo (desejo modificar kubectl delete namespace app-system db-system
) sem mencionar o nome dos namespaces do aplicativo no comando (como no futuro, se mais namespace do aplicativo vier no cluster, eu tenho que edite este script sempre).
Isso significa que quero excluir todos os namespaces do clusterexceto kube-system
algo como - kubectl delete namespace -v kube-system
(eu sei -v
que não é um parâmetro válido aqui, apenas mostrando como no grep -v
é usado para exceto as seguintes palavras. Algo semelhante procurando kubectl delete ns...
)
Responder1
Eu criei o código a seguir, para que você possa usá-lo como wrapper. Você pode nomear o script como quiser. Por exemploexclude_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
Torne o script executável:
chmod u+x exclude_ns_removal
Execute-o da seguinte maneira:
./exclude_ns_removal -v kube-system
O resultado será algo como:
Excluding ... kube-system
Deleting ... app-system
Deleting ... db-system
Se a saída parecer boa, você deve modificar esta linha
printf 'Deleting ... %s\n' "$namespace"
para
kubectl delete namespace "$namespace"
Responder2
Pode ser mais simples que as respostas anteriores - escrever scripts ou loops aqui é um exagero, o kubernetes faz tudo por você:
kubectl label ns foo=bar --all
kubectl label ns kube-system foo-
kubectl delete ns --selector foo=bar
Responder3
Isso é muito para algo que poderia ser resolvido com
for i in `k get ns -o name | grep -v kube-system`; do
k delete $i;
done