我正在使用 Helm 将我的应用程序的多个“组件”部署到单个命名空间中,并使用 Jenkins 来触发创建和销毁作业。我似乎无法使用 Helm 删除命名空间,因此我希望只使用 Kubernetes 命令。
但是,似乎如果我使用kubectl delete namespace
它会强制破坏命名空间及其所有资源。
我只想在名称空间为空时销毁名称空间。有没有命令可以做到这一点?
我正在使用 Helm 将我的应用程序的多个“组件”部署到单个命名空间中,并使用 Jenkins 来触发创建和销毁作业。我似乎无法使用 Helm 删除命名空间,因此我希望只使用 Kubernetes 命令。
但是,似乎如果我使用kubectl delete namespace
它会强制破坏命名空间及其所有资源。
我只想在名称空间为空时销毁名称空间。有没有命令可以做到这一点?
我只想在名称空间为空时销毁名称空间。有没有命令可以做到这一点?
不,没有命令可以这样做。此行为是设计使然。
我会建议一种不同的方法。您应该在版本控制系统中为所有组件(包括命名空间)提供所有部署 yaml。何时创建使用kubectl create -f deployment.yaml
以及何时删除使用kubectl delete -f deployment.yaml
您可以运行kubectl get all --namespace YOUR_NAMESPACE
然后依赖于输出调用删除命名空间
试试这个,更好地迭代 kube-api 资源,这将给出命名空间内的每个资源列表。
kubectl api-resources --verbs=list --namespaced -o name \
| xargs -n 1 kubectl get --show-kind --ignore-not-found -l <label>=<value> -n
<namespace>
或其他方法
kubectl api-resources --verbs=list --namespaced -o name | `
%{ kubectl get $_ --show-kind --ignore-not-found -l <label>=<value> -n
<namespace> }
在删除之前检查命名空间并不是一个简单的命令,它需要一些 kubectl 脚本或 kube API 客户端。
从讨论get all
s 限制的 github 问题中, liggit 提供了一个示例并添加了一些 jq 处理,您可以获得一个(慢)命令,除非它成功发现所有资源类型都是空的(否items
),否则会出错:
set -o pipefail
kubectl api-resources --verbs=list --namespaced -o name \
| xargs -n 1 kubectl get --ignore-not-found -n staging -o json \
| jq '.items[]| .kind + "/" + .metadata.name | error'