看到 PVC 的Unused=True,可以把它列入核查清单,但还不能据此删除。这个条件回答的是“现在有没有非终态 Pod 引用它”,并不回答“业务是否还需要里面的数据”。
本文是一份面向 Kubernetes 平台与存储团队的技术决策备忘录,依据截至 2026 年 10 月 7 日复核的上游资料。未在读者的集群做实测,也不提供删除命令。
先确认你的集群支持什么
Kubernetes v1.37 将PersistentVolumeClaimUnusedSinceTime提升为 Beta,默认启用。启用后,PVC protection controller 会维护Unused条件。[1]
本稿把核查范围限定为已绑定(Bound)、尚未进入删除流程的 PVC。未绑定、正在删除及临时卷生命周期的排查,不在下文只读示例的覆盖范围内。
目标发行版是否包含该功能、是否被管理员关闭,仍需现场核实。只看到集群版本号,不能代替检查功能门和控制器状态;旧版本也不能直接套用本稿结论。
Unused 实际在判断什么
| 现场情况 | 条件含义 |
|---|---|
| 没有非终态 Pod 引用 PVC | Unused=True |
| 至少有一个运行中或 Pending Pod 引用 | Unused=False;Pending 即使尚未调度成功也算引用 |
| 引用它的 Pod 已进入 Succeeded 或 Failed | 这些终态 Pod 不再计入使用判定 |
| 有多个非终态 Pod 引用 | 最后一个引用消失或对应 Pod 进入终态后,才可能转为 True |
| 条件缺失、Unknown,或功能门/控制器状态未确认 | 先核实,不能当作 True |
这里的引用,不等于应用正在读写磁盘。Pod 对 PVC 的引用在同一命名空间内解析;核查一个 PVC 时,先查它所在命名空间的 Pod。做全局盘点时可以遍历各命名空间,但要始终用namespace + name + UID标识对象,避免混淆同名 PVC。[2]
还要另查 Deployment、StatefulSet、CronJob 等工作负载配置。这些模板不是当前 Pod 引用的替代证据,却可能说明稍后仍有业务会创建 Pod 使用该卷。这一步属于业务保留核查。[4]
lastTransitionTime 不是最近一次磁盘读写时间
lastTransitionTime表示条件发生状态切换的时间。在Unused=True时,可以据此观察控制器记录的“未使用状态持续了多久”;它不代表应用最后一次读写,也不保证与底层卸载完成时间一致。[1][3][4]
时间戳很旧,不能单独证明状态过期。条件持续不变时,这个时间本来就可能不变。应结合功能门、控制器健康和当前引用核对结果判断可信度,不能把它当心跳时间。
KEP 还说明:功能关闭后,已有条件可能保留却不再更新;控制器、API server 或 etcd 不可用时,条件无法及时更新;PVC 数量较多时也可能出现更新延迟。[4]
删除前,至少核对这五项证据
| 检查项 | 需要留下的证据 | 尚不满足时的动作 |
|---|---|---|
| 1. 状态与身份 | 集群/发行版、功能门、namespace、name、UID、当前条件及核查时间;控制器健康和 Pod 引用核对结果 | 状态不明或引用存在,停止处置 |
| 2. 业务保留要求 | 业务负责人确认、周期任务与工作负载模板检查、保留期限 | 找不到负责人或保留要求不清,保留数据 |
| 3. 实际回收策略 | 绑定 PV 的persistentVolumeReclaimPolicy,及相关 StorageClass 配置 | 策略或存储插件行为不清,交存储负责人确认 |
| 4. 恢复能力 | 对该类数据适用的备份,以及可核对的恢复验证记录 | 只有“备份成功”提示时,不把它当作恢复证明 |
| 5. 变更批准 | 精确对象清单、影响范围、批准记录与执行窗口 | 未批准,不执行删除 |
回收策略尤其容易被忽略。Retain通常把后续回收留给人工处理;支持Delete的卷插件可能随回收删除 PV 和底层存储资产。动态创建的 PV 通常继承 StorageClass 的回收策略,但判断时应读取这个 PV 的实际字段,不只看当前 StorageClass。[2]
这张表是建议的业务验收方法,不是 Kubernetes 对数据价值或恢复结果的保证。
可以先做的只读核查
以下是命令示例,需把命名空间与名称替换为实际值。操作者应先取得相应只读权限;示例未在你的集群执行,不包含任何删除或配置修改:
kubectl version kubectl get pvc <PVC名称> -n <命名空间> -o yaml kubectl get pods -n <命名空间> -o json kubectl get pv <绑定PV名称> -o yaml查看 PVC 的spec.volumeName确定绑定 PV;在 Pod JSON 中核对spec.volumes[].persistentVolumeClaim.claimName,同时核对 Pod phase。上述方法只提供显式 PVC 引用的基础核对,不覆盖所有卷类型和控制器行为。使用 generic ephemeral volumes 等场景时,不要仅凭本示例未找到claimName就认定没有引用,应单独核对其生命周期和所有者关系。
没有 PV 读取权限时,交由有权限的存储负责人确认,不扩大自身权限。
保留只读结果时记录检查时间、集群标识与对象 UID,并按内部资料要求控制访问。输出中可能包含业务名称和配置,不能直接贴到公开评论区。
什么情况下应停止
发现非终态引用、对象身份不一致、功能门或控制器状态不明、业务保留要求不清、回收策略不确定、缺少恢复证据或变更批准,均先停止处置并补齐证据。Unknown或缺失条件也不能自动归入闲置卷。
KEP-5541 明确不负责自动删除未使用 PVC;是否删除仍由集群管理员决定。[4]Unused帮助缩小核查范围,业务判断与变更责任仍需有人承担。
建议先选择一个非生产命名空间,把五项证据填完整,检查其中哪些信息目前拿不到。若要交流问题,提供脱敏的版本、条件状态和疑问即可,不提交客户数据或完整配置。
资料来源
[1] Kubernetes v1.37 官方功能说明(2026-09-21):https://kubernetes.io/blog/2026/09/21/kubernetes-v1-37-pvc-last-used-time/
[2] Kubernetes Persistent Volumes 文档:https://kubernetes.io/docs/concepts/storage/persistent-volumes/
[3] PersistentVolumeClaim API 文档:https://kubernetes.io/docs/reference/kubernetes-api/core/persistent-volume-claim-v1/
[4] KEP-5541:https://www.kubernetes.dev/resources/keps/5541/