如何仅删除未安装的 PVC 和 PV?

Pav*_* K. 12 kubernetes kubernetes-pvc

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

Pav*_* K. 18

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

kubectl get pv | grep Released | awk '$1 {print$1}' | while read vol; do kubectl delete pv/${vol}; done
Run Code Online (Sandbox Code Playgroud)


iri*_*ian 13

查看当前的答案,看起来其中大多数都没有直接回答问题(我可能会弄错)。一个PVC是Bound不一样的Mounted。当前的答案应该足以清理UnboundPVC,但查找和清理所有UnmountedPVC 似乎没有答案。

不幸的是,它看起来-o=go-template=...没有Mounted By:如 中所示的变量kubectl describe pvc

这是我经过一些黑客攻击后得出的结论:

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

-A会在集群中的每个命名空间回报每一位PVC。然后我们进行过滤以仅显示Name,NamespaceMounted By字段。

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

kubectl describe -A pvc | grep -E "^Name:.*$|^Namespace:.*$|^Mounted By:.*$" | grep -B 2 "<none>" | grep -E "^Name:.*$|^Namespace:.*$"
Run Code Online (Sandbox Code Playgroud)

实际删除 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}'
Run Code Online (Sandbox Code Playgroud)
  • cut删除Name:Namespace:因为他们只是挡路
  • pasteNamePVCNamespace放在同一行上
  • xargs -n bash使 PVC 名称为${0},命名空间为${1}.

我承认我有一种感觉,这不是做到这一点的最佳方式,但这是我能想出(在 CLI 上)做到这一点的唯一明显方式。

运行此程序后,您的卷将从BoundUnbound并且此线程中的其他答案有关于如何清理它们的好主意。

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

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

我希望这有帮助!