【问题标题】:Delete Kubernetes namespace only if it's empty?仅当它为空时才删除 Kubernetes 命名空间?
【发布时间】:2020-07-15 19:22:12
【问题描述】:

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

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

我只想在命名空间为空时销毁它。有命令吗?

【问题讨论】:

    标签: kubernetes kubernetes-helm


    【解决方案1】:

    我只想在命名空间为空时销毁它。有没有命令 这样做?

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 不幸的是 get all doesn't actually output all : /
      • 是的,这就是我现在正在做的事情,但意识到它实际上并没有全部输出:(
      • 您可以使用这个kubectl plugin 真正获得所有。
      【解决方案3】:

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

      从讨论get alls 限制liggit provides 一个示例并添加一些jq 处理的github 问题中,您可以获得一个(慢)命令,除非它成功找到所有资源类型都是空的(没有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'
      

      【讨论】:

        【解决方案4】:

        试试这个,更好地迭代 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> }
        

        【讨论】:

          猜你喜欢
          • 2019-09-15
          • 2022-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-14
          • 2016-12-18
          • 1970-01-01
          相关资源
          最近更新 更多