2

我正在使用 Helm 将我的应用程序的多个“组件”部署到单个命名空间中,并使用 Jenkins 来触发创建和销毁作业。我似乎无法使用 Helm 删除命名空间,因此我希望只使用 Kubernetes 命令。

但是,似乎如果我使用kubectl delete namespace它会强制破坏命名空间及其所有资源。

我只想在名称空间为空时销毁名称空间。有没有命令可以做到这一点?

4

4 回答 4

2

我只想在名称空间为空时销毁名称空间。有没有命令可以做到这一点?

不,没有命令可以这样做。此行为是设计使然。

我会建议一种不同的方法。您应该在版本控制系统中为所有组件(包括命名空间)提供所有部署 yaml。何时创建使用kubectl create -f deployment.yaml以及何时删除使用kubectl delete -f deployment.yaml

于 2020-07-15T03:11:52.217 回答
1

您可以运行kubectl get all --namespace YOUR_NAMESPACE然后依赖于输出调用删除命名空间

于 2020-07-15T03:51:15.573 回答
0

试试这个,更好地迭代 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> }
于 2020-07-15T11:15:58.673 回答
0

在删除之前检查命名空间并不是一个简单的命令,它需要一些 kubectl 脚本或 kube API 客户端。

从讨论get alls 限制的 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'
于 2020-07-15T05:38:35.663 回答