【问题标题】:How to delete only unmounted PVCs and PVs?如何只删除未挂载的 PVC 和 PV?
【发布时间】:2018-11-08 06:50:09
【问题描述】:

我们不想删除 PV 和 PVC,因为 pod 大部分时间都在重复使用它们。 但是,从长远来看,我们最终会得到许多未使用的 PV 和 PVC。 如何安全清洁?

【问题讨论】:

    标签: kubernetes kubernetes-pvc


    【解决方案1】:

    删除已发布 PV 的方式不是很优雅,但 bash 的方式

    kubectl get pv | grep Released | awk '$1 {print$1}' | while read vol; do kubectl delete pv/${vol}; done
    

    【讨论】:

      【解决方案2】:

      查看当前答案,其中大多数似乎都没有直接回答问题(我可能弄错了)。 Bound 的 PVC 与 Mounted 不同。当前的答案应该足以清理 Unbound PVC,但查找并清理所有 Unmounted PVC 似乎没有答案。

      不幸的是,-o=go-template=... 似乎没有Mounted By: 的变量,如kubectl describe pvc 所示。

      这是我经过一番修改后得出的结论:

      要列出集群中的所有 PVC(已安装和未安装),您可以这样做:kubectl describe -A pvc | grep -E "^Name:.*$|^Namespace:.*$|^Mounted By:.*$"

      -A 将返回集群中每个命名空间中的每个 PVC。然后我们向下过滤,只显示NameNamespaceMounted By 字段。

      我能想到的最好的方法是获取所有未安装 PVC 的名称和命名空间:

      kubectl describe -A pvc | grep -E "^Name:.*$|^Namespace:.*$|^Mounted By:.*$" | grep -B 2 "<none>" | grep -E "^Name:.*$|^Namespace:.*$"
      

      要真正删除 PVC 有点困难,因为我们需要知道 PVC 的名称以及它的命名空间。我们使用剪切、粘贴和 xargs 来执行此操作:

      kubectl describe -A pvc | grep -E "^Name:.*$|^Namespace:.*$|^Mounted By:.*$" | grep -B 2 "<none>" | grep -E "^Name:.*$|^Namespace:.*$" | cut -f2 -d: | paste -d " " - - | xargs -n2 bash -c 'kubectl -n ${1} delete pvc ${0}'
      
      • cut 删除了 Name:Namespace:,因为它们只是碍事
      • paste 把 PVC 的 NameNamespace 放在 same
      • xargs -n bash 使得 PVC 名称为 ${0},命名空间为 ${1}

      我承认我有一种感觉,这不是执行此操作的最佳方式,但这是我可以(在 CLI 上)想出的唯一明显方式来执行此操作。

      运行此操作后,您的卷将从 Bound 变为 Unbound,并且此线程中的其他答案对如何清理它们有很好的想法。

      另外,请记住,在 Kubernetes 中删除卷时,某些卷控制器实际上不会删除您的数据。您可能仍然需要在您使用的任何系统中清理它。

      例如,在 NFS 控制器中,数据使用 archived- 前缀重命名,而在 NFS 端,您可以运行 rm -rf /persistentvolumes/archived-*。对于 AWS EBS,如果 EBS 卷与任何实例分离,您可能仍需要删除它们。

      我希望这会有所帮助!

      【讨论】:

        【解决方案3】:

        如果您想删除所有未绑定的 PV 和 PVC,您可以这样做:

        首先删除 PVC:

        $ kubectl -n <namespace> get pvc | tail -n +2 | grep -v Bound | \
          awk '{print $1}' | xargs -I{} kubectl -n namespace delete pvc {}
        

        然后删除 PV:

        $ kubectl -n <namespace> get pv | tail -n +2 | grep -v Bound | \
          awk '{print $1}' | xargs -I{} kubectl -n namespace delete pv {}
        

        【讨论】:

        • 不要认为这是一个正确的语法或选项。即使我设置 -o wide 以获取更多详细信息,我所有的 pvc 都保持绑定。我正在寻找类似docker system prune 的东西。或者感觉我需要通过以下方式连接:if pvc['Mounted By"]=None -> delete
        • kubectl get pvc -o name 只返回名称。它不返回详细信息。你的意思可能是-o wide
        • 我不是说宽...没有输出选项。您可以通过常规的get pv或pvc输出来获取PV和PVC是否绑定。看到你改变了问题。
        • 我所有的 PVC 都有绑定状态(已安装和已卸载)。感觉我需要通过以下方式连接:if pvc['Mounted By"]=None -> delete。我想我必须阅读如何通过模板获取它
        • 您可以使用-o=jsonpath 做到这一点。您可以发布已安装和未安装的示例吗?
        【解决方案4】:

        所有以前的答案都是有效且有趣的。这是删除持久卷的另一种简单方法。

        您应该首先删除关联的持久化卷声明,但在某些情况下,持久化卷无法自动删除。 (例如:“保留”回收政策)。

        这是一个安全的语法,用于删除具有已发布状态(未使用和卸载)的持久卷。

        kubectl get --no-headers persistentvolumes|awk '$5=="Released" { print $1 }'|xargs echo "kubectl delete persistentvolumes"
        

        【讨论】:

          【解决方案5】:

          在您保留 pvc 之前,您的 pv 将处于 Bound 状态。因此,您可以使用以下命令删除未使用的 pvc: kubectl -n namespace get pvc -o name | grep myname | xargs kubectl -n namespace delete

          【讨论】:

          • 我理解正确你建议删除所有 pvc 吗?和kubectl delete pvc,pv --all -n namespace一样吗?
          【解决方案6】:

          是的,首先您需要删除未使用的 PVC。 使用kubectl get pvc --all-namespaces,您可以在所有命名空间中列出所有它们以及相应的 PV。 为了删除未使用的 PV,您需要更改其 ReclaimPolicy,因为如果将其设置为 Retain,PV 将不会被删除,而是会处于“已发布”状态。因此,为了做到这一点,您需要修补 PV(由于某种原因,无法使用 kubectl edit 手动编辑它):

          kubectl patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'
          

          【讨论】:

            猜你喜欢
            • 2021-05-07
            • 2020-02-13
            • 2021-03-20
            • 1970-01-01
            • 2022-11-09
            • 1970-01-01
            • 1970-01-01
            • 2019-04-10
            • 2019-10-09
            相关资源
            最近更新 更多