
Tengo un clúster K3s con pods del sistema (es decir, kube-system
espacio de nombres) y mis pods de aplicaciones:
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
Estoy buscando un comando shell/kubectl (para script de automatización) que pueda eliminar el espacio de nombres de mi aplicación (quiero modificarlo kubectl delete namespace app-system db-system
) sin mencionar el nombre de los espacios de nombres de la aplicación en el comando (ya que en el futuro, si vinieran más espacios de nombres de aplicaciones en el clúster, tengo que edite este script cada vez).
Eso significa que quiero eliminar todo el espacio de nombres en el clúster.excepto kube-system
algo como - kubectl delete namespace -v kube-system
(Sé -v
que no es un parámetro válido aquí, solo muestra cómo -v
se usa en grep para exceptuar las siguientes palabras. Se busca algo similar kubectl delete ns...
)
Respuesta1
He creado el siguiente código, para que puedas usarlo como contenedor. Puedes nombrar el script como quieras. Por ejemploexclude_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
Haga que el script sea ejecutable:
chmod u+x exclude_ns_removal
Ejecútelo de la siguiente manera:
./exclude_ns_removal -v kube-system
El resultado será algo como:
Excluding ... kube-system
Deleting ... app-system
Deleting ... db-system
Si el resultado se ve bien, debes modificar esta línea.
printf 'Deleting ... %s\n' "$namespace"
a
kubectl delete namespace "$namespace"
Respuesta2
Puede ser más simple que las respuestas anteriores: escribir scripts o bucles aquí es excesivo, Kubernetes lo hace todo por usted:
kubectl label ns foo=bar --all
kubectl label ns kube-system foo-
kubectl delete ns --selector foo=bar
Respuesta3
Eso es mucho para algo que podría resolverse con
for i in `k get ns -o name | grep -v kube-system`; do
k delete $i;
done