Kubernetes:如何正确删除PV

45

我们测试环境中的有状态集 es-data 失败了,我被要求删除相应的 PV。

因此,我删除了以下内容以针对 es-data: 1)PVC 2)PV 它们显示为终止,并留待周末。今天早上到达时,它们仍然显示为终止,所以强制删除了 PVC 和 PV,但没有成功。 为了修复整个问题,我不得不删除该有状态集。

如果要删除 PV,这样做是否正确?

8个回答

69

您可以使用以下两个命令删除 PV:

kubectl delete pv <pv_name> --grace-period=0 --force

然后使用以下方式删除终结器:

kubectl patch pv <pv_name> -p '{"metadata": {"finalizers": null}}'

如果 PVC 仍然存在,这将把 PVC 的状态设置为“丢失”。我被迫重新创建 PVC 才能让它创建一个新的 PV。 - sshow
3
这绝对不是正确的做法! - user3192295
这只是从etcd(或者你使用的任何键值存储)中移除PV,而不验证它是否实际被删除,很有可能导致相关对象悬空。@ns15提供了一个更正确的答案。 - Alwyn

17

如果我先删除PVC,然后再删除PV,它对我有用。

kubectl delete pvc data-p-0
kubectl delete pv  <pv-name>  --grace-period=0 --force

如果想要删除PVC,否则似乎会挂起。


12

首先运行 kubectl patch pv {PVC_NAME} -p '{"metadata":{"finalizers":null}}'

然后运行 kubectl delete pv {PVC_NAME}


也许需要反转这两个命令才能运行,正如@PrafullLadha在他的答案中所说。实际上我自己试过了。为了成功删除PV,我必须先运行删除命令(会卡住,必须使用ctrl-c返回),然后使用补丁命令删除finalizers - Bruce

8

这个帖子中的大多数答案只是提到了命令,而没有解释根本原因。

这里有一张图表可以帮助更好地理解。有关命令和其他信息,请参见我的其他答案-> https://dev59.com/-1MH5IYBdhLWcg3w92Mu#73534207

此图显示如何清除删除一个卷 enter image description here

在您的情况下,PVC和PV因为终结器(stuck in terminating state)而无法删除,因为终结器是k8s中避免资源意外删除的保护措施。

你的观察是正确的,这就是Kubernetes的工作原理。但是,您删除资源的顺序不正确。

这就是发生的事情:

PV被卡在终止状态中,因为PVC仍然存在。PVC被卡在终止状态中,因为Statefulsets(pods)还在使用这些卷。(volumes are attached to the nodes and mounted to the pods). 当您删除pod / STS时,由于卷不再使用,PVC和PV成功删除。


6

5

提示: PV卷可能会被描述为pvc-volume-name,这可能会令人困惑!

  • PV:Persistent Volume(持久化存储卷)
  • PVC:Persistent Volume Claim(持久化存储卷声明)
  • Pod -> PVC -> PV -> 主机机器

  1. 首先找到已有的PV卷:kubectl get pv -n {namespace}

  2. 然后删除PV卷以将状态设置为Terminating

kubectl delete pv {PV_NAME}

  1. 然后对其进行修补,以将PVC状态设置为Lostkubectl patch pv {PV_NAME} -p '{"metadata":{"finalizers":null}}'

  2. 接着获取PVC卷:kubectl get pvc -n storage

  3. 然后可以删除PVC卷: kubectl delete pvc {PVC_NAME} -n {namespace}


理论示例:

** 假设我们在storage namespace中安装了kafka

$ kubectl get pv -n storage

$ kubectl delete pv pvc-ccdfe297-44c9-4ca7-b44c-415720f428d1

$ kubectl get pv -n storage(挂起但将PV卷状态设置为终止)

$ kubectl patch pv pvc-ccdfe297-44c9-4ca7-b44c-415720f428d1 -p '{"metadata":{"finalizers":null}}'

$ kubectl get pvc -n storage

kubectl delete pvc data-kafka-0 -n storage


3

0
``` kubectl delete pv [pv-name] ```
ksu,你需要检查一下 PV 的策略,它不应该是 Reclaim Policy。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接