Como excluir todos os namespaces, exceto o sistema kube no cluster K3s

Como excluir todos os namespaces, exceto o sistema kube no cluster K3s

Eu tenho um cluster K3s com pods de sistema (ou seja, kube-systemnamespace) 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 -vque 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

informação relacionada