如何只删除未挂载的 PVC 和 PV?

How to delete only unmounted PVCs and PVs?

我们不想删除 PV 和 PVC,因为 pods 大多数时候会重复使用它们。 然而,从长远来看,我们最终会得到许多未使用的 PV 和 PVC。 如何安全清洁?

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

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

首先删除 PVC:

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

然后删除PV:

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

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

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

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

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

查看当前的答案,其中大部分似乎都没有直接回答问题(我可能弄错了)。 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 将 return 每个命名空间中集群中的每个 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  delete pvc [=11=]'
  • cut 删除了 Name:Namespace:,因为它们只是妨碍了
  • paste 将 PVC 的 Name 和它的 Namespace 放在 相同的
  • xargs -n bash 使得 PVC 名称为 [=31=],命名空间为 </code>.</li> </ul> <p>我承认我觉得这不是最好的方法,但这是我(在 CLI 上)能想到的唯一明显的方法。</p> <p>在 运行 完成此操作后,您的卷将从 <code>Bound 变为 Unbound,并且该线程中的其他答案对如何清理它们有很好的想法。

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

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

    希望对您有所帮助!

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

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

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

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