![如何删除 K3s 集群中除 kube-system 之外的所有命名空间](https://linux22.com/image/770169/%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%20K3s%20%E9%9B%86%E7%BE%A4%E4%B8%AD%E9%99%A4%20kube-system%20%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4.png)
我有一个带有系统 pod(即命名空间)和我的应用程序 pod 的 K3s 集群kube-system
:
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...
)
答案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