15

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

4

6 回答 6

21

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

kubectl get pv | grep Released | awk '$1 {print$1}' | while read vol; do kubectl delete pv/${vol}; done
于 2019-12-04T14:24:09.513 回答
14

查看当前的答案,其中大多数似乎都没有直接回答问题(我可能弄错了)。一个 PVCBoundMounted. 当前的答案应该足以清理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:.*$"

实际删除 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:因为他们只是妨碍
  • pasteNamePVC 和它Namespace放在一条线上
  • xargs -n bash使它成为 PVC 名称${0}和命名空间是${1}.

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

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

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

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

我希望这有帮助!

于 2020-01-15T20:14:34.857 回答
2

如果你想删除所有未绑定的 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 {}
于 2018-11-08T19:32:28.320 回答
2

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

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

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

kubectl get --no-headers persistentvolumes|awk '$5=="Released" { print $1 }'|xargs echo "kubectl delete persistentvolumes"
于 2020-03-04T13:13:04.020 回答
1

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

于 2018-11-08T08:02:03.280 回答
0

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

kubectl patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'
于 2018-11-14T21:35:16.040 回答