正常的删除顺序应该是 StatefulSet
或 Deployment
-> Pod
-> PVC
-> PV
。其中 Pod 一般会随着 StatefulSet 或 Deployment 删除自动删除,但如果运行失败的 Pod(容器组) 会一直保留,需要手动删除。
删除上游依赖
如果出现 PVC
和 PV
无法删除的情况,通常是因为没有按照顺序删除,特别是有失败的 Pod 未被删除。只要删除上游的依赖,就会自动删除。
顽固的 PV
在上游依赖都已删除的情况下,依然无法删除的顽固 PV
,可继续以下步骤。
删除 PV 绑定
PV 状态为 Released,就是无法删除,查看 PV 详情,依然显示有绑定的 PVC(实际该 PVC 已经删除)。此时可删除 claimRef
字段:
# 删除该字段
claimRef:
apiVersion: v1
kind: PersistentVolumeClaim
name: my-pvc
namespace: my-namespace
...
清除 Finalizers
删除 claimRef
字段后,PV 状态变为 Available
,但依然无法删除。此时可以将 Finalizers
设置为 []
:
metadata:
finalizers: []
此时 PV 终于被删除。
This happens when persistent volume is protected. You should be able to cross verify this:
Command:
kubectl describe pvc PVC_NAME | grep Finalizers
Output:
Finalizers: [kubernetes.io/pvc-protection]
You can fix this by setting finalizers to null using kubectl patch:
kubectl patch pvc PVC_NAME -p '{"metadata":{"finalizers": []}}' --type=merge