Kubernetes
如何刪除 K3s 集群中除 kube-system 之外的所有命名空間
我有一個帶有系統 pod(即
kube-system
命名空間)和我的應用程序 pod 的 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
我正在尋找一個 shell/kubectl 命令(用於自動化腳本),它可以刪除我的應用程序命名空間(想要修改
kubectl delete namespace app-system db-system
)而不在命令中提及應用程序命名空間名稱(因為將來如果集群中有更多應用程序命名空間,我必須每次編輯此腳本)。這意味著我想刪除集群中的所有命名空間,除了
kube-system
類似的東西 -
kubectl delete namespace -v kube-system
(我知道-v
這裡不是一個有效的參數,只是展示了 grep-v
是如何使用除了以下單詞的。尋找類似的東西kubectl delete ns...
)
我創建了以下程式碼,因此您可以將其用作包裝器。您可以隨意命名腳本。例如
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"