如何只删除未挂载的 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。然后我们向下过滤以仅显示 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 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"
我们不想删除 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。然后我们向下过滤以仅显示 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 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"