我们不想删除 PV 和 PVC,因为 pod 大部分时间都在重用它们。但是,从长远来看,我们最终会得到许多未使用的 PV 和 PVC。如何安全清洁?
6 回答
不是很优雅但删除已发布 PV 的 bash 方式
kubectl get pv | grep Released | awk '$1 {print$1}' | while read vol; do kubectl delete pv/${vol}; done
查看当前的答案,其中大多数似乎都没有直接回答问题(我可能弄错了)。一个 PVCBound
与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。然后我们向下过滤以仅显示Name
,Namespace
和Mounted 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
把Name
PVC 和它Namespace
放在同一条线上xargs -n bash
使它成为 PVC 名称${0}
和命名空间是${1}
.
我承认我有一种感觉,这不是做到这一点的最佳方式,但这是我(在 CLI 上)能想到的唯一明显的方式来做到这一点。
运行此操作后,您的卷将从Bound
到 ,Unbound
并且该线程中的其他答案对如何清理它们有很好的想法。
此外,请记住,在 Kubernetes 中删除卷时,某些卷控制器实际上并不会删除您的数据。您可能仍然需要在您使用的任何系统中清理它。
例如,在 NFS 控制器中,数据使用archived-
前缀重命名,在 NFS 端,您可以运行rm -rf /persistentvolumes/archived-*
. 对于 AWS EBS,如果 EBS 卷与任何实例分离,您可能仍需要删除它们。
我希望这有帮助!
如果你想删除所有未绑定的 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 {}
以前的所有答案都是有效且有趣的。这是删除持久卷的另一种简单方法。
您应该首先删除关联的 persistentvolumeclaim,但在某些情况下,persistentvolumes 无法自动删除。(例如:“保留”回收政策)。
这是使用已发布状态(未使用和未安装)删除持久卷的安全语法。
kubectl get --no-headers persistentvolumes|awk '$5=="Released" { print $1 }'|xargs echo "kubectl delete persistentvolumes"
在您保留 pvc 之前,您的 pv 将处于 Bound 状态。因此,您可以使用以下命令删除未使用的 pvc:
kubectl -n namespace get pvc -o name | grep myname | xargs kubectl -n namespace delete
是的,首先你需要删除未使用的 PVC。您可以在kubectl get pvc --all-namespaces
所有命名空间中列出所有它们以及相应的 PV。为了删除未使用的 PV,您需要更改其 ReclaimPolicy,因为如果将其设置为 Retain,PV 将不会被删除,而是会处于“已发布”状态。kubectl edit
因此,为了做到这一点,您需要修补 PV(由于某种原因无法手动编辑它):
kubectl patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'