Kubernetes:无法删除 PersistentVolumeClaim (pvc)

Kubernetes: Can't delete PersistentVolumeClaim (pvc)

我通过调用

创建了以下持久卷

kubectl create -f nameOfTheFileContainingTheFollowingContent.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-monitoring-static-content
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/some/path"

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-monitoring-static-content-claim
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: ""
  resources:
    requests:
      storage: 100Mi

在此之后我尝试删除 pvc。但是这个命令卡住了。 调用 kubectl describe pvc pv-monitoring-static-content-claim 时,我得到以下结果

Name:          pv-monitoring-static-content-claim
Namespace:     default
StorageClass:
Status:        Terminating (lasts 5m)
Volume:        pv-monitoring-static-content
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed=yes
               pv.kubernetes.io/bound-by-controller=yes
Finalizers:    [foregroundDeletion]
Capacity:      100Mi
Access Modes:  RWO
Events:        <none>

kubectl describe pv pv-monitoring-static-content

Name:            pv-monitoring-static-content
Labels:          <none>
Annotations:     pv.kubernetes.io/bound-by-controller=yes
Finalizers:      [kubernetes.io/pv-protection foregroundDeletion]
StorageClass:
Status:          Terminating (lasts 16m)
Claim:           default/pv-monitoring-static-content-claim
Reclaim Policy:  Retain
Access Modes:    RWO
Capacity:        100Mi
Node Affinity:   <none>
Message:
Source:
    Type:          HostPath (bare host directory volume)
    Path:          /some/path
    HostPathType:
Events:            <none>

没有使用持久卷的 pod 运行。谁能告诉我为什么 pvc 和 pv 没有被删除?

PV被保护。在删除 PVC 之前先删除 PV。此外,删除声明任何引用的 PVC 的任何 pods/ 部署。如需更多信息,请查看 Storage Object in Use Protection

我不确定为什么会这样,但是在通过 kubernetes 仪表板删除 pv 和 pvc 的终结器后,两者都被删除了。 在重复我在问题中描述的步骤后,这种情况再次发生。 似乎是一个错误。

几小时前刚遇到这个问题。

我删除了使用此引用的部署,PV/PVCs 自动终止。

如果PV仍然存在,可能是因为它的ReclaimPolicy设置为Retain,在这种情况下即使PVC消失也不会被删除。来自文档:

PersistentVolumes can have various reclaim policies, including “Retain”, “Recycle”, and “Delete”. For dynamically provisioned PersistentVolumes, the default reclaim policy is “Delete”. This means that a dynamically provisioned volume is automatically deleted when a user deletes the corresponding PersistentVolumeClaim. This automatic behavior might be inappropriate if the volume contains precious data. In that case, it is more appropriate to use the “Retain” policy. With the “Retain” policy, if a user deletes a PersistentVolumeClaim, the corresponding PersistentVolume is not be deleted. Instead, it is moved to the Released phase, where all of its data can be manually recovered

在我的例子中,只要删除与pvpvc关联的pod,终止状态的pvpvc就消失了

当持久卷受到保护时会发生这种情况。你应该能够交叉验证这个:

命令:

kubectl describe pvc PVC_NAME | grep Finalizers

输出:

Finalizers: [kubernetes.io/pvc-protection]

您可以通过使用 kubectl patch:

将终结器设置为 null 来解决此问题
kubectl patch pvc PVC_NAME -p '{"metadata":{"finalizers": []}}' --type=merge

参考; Storage Object in Use Protection

您可以摆脱编辑您的 pvc!去除 PVC 保护。

  1. kubectl edit pvc YOUR_PVC -n NAME_SPACE
  2. 手动编辑并在这一行前加上#
  3. 所有pv和pvc都将被删除

在我的例子中,pvc 没有被删除,因为缺少命名空间(我在删除所有之前删除了命名空间 resources/pvc) 解决方案:创建名称与之前相同的名称空间,然后我能够删除 finalizers 最后 pvc

对我来说,pv 处于保留状态,因此执行上述步骤无效。

1st 我们需要更改策略状态如下:

kubectl patch pv PV_NAME -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'

然后如下删除pvc

kubectl get pvc

kubectl delete pvc PVC_NAME

最后,用

删除pv
kubectl delete pv PV_NAME

如果您已经删除了 PV 并试图删除 PVC

检查此命令是否附加了卷

kubectl 获取卷附件

正在删除 PVC :-

首先你必须使用这个命令删除一个pvc pne

kubectl delete pvc --grace-period=0 --force

或者您可以使用

删除所有 PVC

kubectl delete pvc --all

现在您可以使用

查看PVC的状态为正在终止

kubectl 获取 pvc

然后您必须使用

应用此删除

kubectl patch pvc {PVC_NAME} -p '{"metadata":{"finalizers":null}}'

kubectl get pvc pvc_name -o yaml > pvcfile.yaml

然后打开pvcfile.yaml并删除终结器行,保存并应用:

kubectl apply -f pvcfile.yaml 

关于终结器的其他答案...

只有删除 Deployment 才能释放资源。之后,终止资源被释放。


删除列出的所有资源:

kubectl get all -n YOURNAMESPACE

使用 kubectl delete -n YOURNAMESPACE <resource> <id> 或(如果您从上面的输出中复制粘贴)kubectl delete -n YOURNAMESPACE <resource>/<id>,对于您在此处看到的每个资源。

你也可以一次完成

kubectl delete -n YOURNAMESPACE <resource>/<id1>  <resource>/<id2>  <resource2>/<id3>  <resource2>/<id4>  <resource3>/<id5>

可能您尝试删除资源,但由于 deploymentreplicaset 资源,它们正在重新创建,从而阻止命名空间释放依赖资源和被清理。