报错是这么冒出来的。腾讯云 TKE 1.26 集群,Ubuntu 20.04 节点,删掉一个不再使用的 PVC 后状态一直是 Terminating,kubectl describe 显示 kubernetes.io/pvc-protection finalizer,重新 apply 也删不掉,命名空间里已经看不到 Pod。
中间走过弯路,把「存储插件是 NFS 或 local,删除逻辑卡在外部存储一侧」当成主因,改完现象没变。
把日志和配置对完,能解释这个现象的基本就这几处。pvc-protection 控制器还在,需要确认没有 Pod 引用这个 PVC。还有一种是有 Pod 处于 Terminating 状态,挂载点没有真正卸载。
还有一种情况,集群的 pvc-protection 准入插件被关掉,finalizer 没人负责摘。
上来先确认还有没有 Pod 在引用这个 PVC
kubectl get pods -A -o json | jq '.items[] | select(.spec.volumes[]?.persistentVolumeClaim.claimName=="data-pvc") | .metadata.name'
随后找出卡在 Terminating 的 Pod 逐个清理
kubectl get pods -A | grep Terminating
再往下确认存储侧已经解绑再摘 finalizer
kubectl patch pvc data-pvc -p '{"metadata":{"finalizers":null}}'
剩下的就是检查 PV 的回收策略和残留状态
kubectl get pv | grep data-pvc
别只看报错消失,验证要多做一步。PVC 从列表里消失,PV 状态变成 Released 或被回收,重建同名 PVC 能正常 Bound 并挂载。
容易忽略的是,直接摘 finalizer 只是抹掉状态,存储端的卷和目录可能还在,删之前务必确认数据不再需要。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
