K3s クラスター内の kube-system 以外のすべての名前空間を削除する方法

K3s クラスター内の kube-system 以外のすべての名前空間を削除する方法

kube-systemシステム ポッド (つまり名前空間) とアプリケーション ポッドを備えた K3s クラスターがあります。

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

コマンドでアプリケーション名前空間名を指定せずにアプリケーション名前空間を削除できる (変更したいkubectl delete namespace app-system db-system) シェル/kubectl コマンド (自動化スクリプト用) を探しています (将来、クラスターにさらに多くのアプリケーション名前空間が追加された場合、このスクリプトを毎回編集する必要があります)。

つまり、クラスター内のすべての名前空間を削除したいのですを除外する kube-system

のようなもの - (ここでは有効なパラメータではないことはkubectl delete namespace -v kube-systemわかっていますが、grep で次の単語を除外する方法を示しているだけです。類似のものを探しています)-v-vkubectl delete ns...

答え1

以下のコードを作成しましたので、ラッパーとして使用できます。スクリプトには任意の名前を付けることができます。たとえば、exclude_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

スクリプトを実行可能にします。

chmod u+x exclude_ns_removal

次のように実行します。

./exclude_ns_removal -v kube-system

結果は次のようになります。

Excluding ... kube-system

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

出力が良ければ、この行を変更する必要があります

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

kubectl delete namespace "$namespace"

答え2

以前の回答よりも簡単かもしれません。ここでスクリプトやループを書くのはやりすぎです。kubernetes がすべてを実行します。

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

答え3

それは解決できる問題としては多すぎる

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

関連情報