【发布时间】:2018-11-08 06:50:09
【问题描述】:
我们不想删除 PV 和 PVC,因为 pod 大部分时间都在重复使用它们。 但是,从长远来看,我们最终会得到许多未使用的 PV 和 PVC。 如何安全清洁?
【问题讨论】:
我们不想删除 PV 和 PVC,因为 pod 大部分时间都在重复使用它们。 但是,从长远来看,我们最终会得到许多未使用的 PV 和 PVC。 如何安全清洁?
【问题讨论】:
删除已发布 PV 的方式不是很优雅,但 bash 的方式
kubectl get pv | grep Released | awk '$1 {print$1}' | 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 将返回集群中每个命名空间中的每个 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 把 PVC 的 Name 和 Namespace 放在 same 行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 {}
【讨论】:
docker system prune 的东西。或者感觉我需要通过以下方式连接:if pvc['Mounted By"]=None -> delete
kubectl get pvc -o name 只返回名称。它不返回详细信息。你的意思可能是-o wide。
-o=jsonpath 做到这一点。您可以发布已安装和未安装的示例吗?
所有以前的答案都是有效且有趣的。这是删除持久卷的另一种简单方法。
您应该首先删除关联的持久化卷声明,但在某些情况下,持久化卷无法自动删除。 (例如:“保留”回收政策)。
这是一个安全的语法,用于删除具有已发布状态(未使用和卸载)的持久卷。
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
【讨论】:
kubectl delete pvc,pv --all -n namespace一样吗?
是的,首先您需要删除未使用的 PVC。
使用kubectl get pvc --all-namespaces,您可以在所有命名空间中列出所有它们以及相应的 PV。
为了删除未使用的 PV,您需要更改其 ReclaimPolicy,因为如果将其设置为 Retain,PV 将不会被删除,而是会处于“已发布”状态。因此,为了做到这一点,您需要修补 PV(由于某种原因,无法使用 kubectl edit 手动编辑它):
kubectl patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'
【讨论】: