So löschen Sie alle Namespaces außer dem Kube-System im K3s-Cluster

So löschen Sie alle Namespaces außer dem Kube-System im K3s-Cluster

Ich habe einen K3s-Cluster mit System-Pods (also kube-systemNamespace) und meinen Anwendungs-Pods:

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

Ich suche nach einem Shell-/Kubectl-Befehl (für ein Automatisierungsskript), mit dem ich meinen Anwendungsnamespace (den ich ändern möchte kubectl delete namespace app-system db-system) löschen kann, ohne den Namen des App-Namespaces im Befehl zu erwähnen (da ich dieses Skript in Zukunft jedes Mal bearbeiten muss, wenn mehr App-Namespaces in den Cluster kommen).

Das heißt, ich möchte alle Namespaces im Cluster löschenaußer kube-system

so etwas wie - kubectl delete namespace -v kube-system(ich weiß, -vdass dies hier kein gültiger Parameter ist, es zeigt nur, wie es in grep -vverwendet wird, um die folgenden Wörter auszuschließen. Suche nach etwas Ähnlichem kubectl delete ns...)

Antwort1

Ich habe den folgenden Code erstellt, damit Sie ihn als Wrapper verwenden können. Sie können das Skript beliebig benennen. Zum Beispielexclude_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

Machen Sie das Skript ausführbar:

chmod u+x exclude_ns_removal

Führen Sie es wie folgt aus:

./exclude_ns_removal -v kube-system

Das Ergebnis wird ungefähr so ​​aussehen:

Excluding ... kube-system

Deleting ... app-system
Deleting ... db-system

Wenn die Ausgabe gut aussieht, sollten Sie diese Zeile ändern

printf 'Deleting ... %s\n' "$namespace"

Zu

kubectl delete namespace "$namespace"

Antwort2

Ist möglicherweise einfacher als die vorherigen Antworten – das Schreiben von Skripten oder Schleifen ist hier übertrieben, Kubernetes erledigt das alles für Sie:

kubectl label ns foo=bar --all
kubectl label ns kube-system foo-
kubectl delete ns --selector foo=bar

Antwort3

Das ist viel für etwas, das gelöst werden könnte mit

for i in `k get ns -o name | grep -v kube-system`; do
k delete $i;
done

verwandte Informationen