Cómo eliminar todos los espacios de nombres excepto el sistema kube en el clúster K3s

Cómo eliminar todos los espacios de nombres excepto el sistema kube en el clúster K3s

Tengo un clúster K3s con pods del sistema (es decir, kube-systemespacio 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é -vque no es un parámetro válido aquí, solo muestra cómo -vse 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

información relacionada