Kubernetes

如何刪除 K3s 集群中除 kube-system 之外的所有命名空間

  • September 5, 2021

我有一個帶有系統 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"

引用自:https://serverfault.com/questions/1076435