Kubernetes v1.37:追踪 PersistentVolumeClaim 的最后使用时间(Beta)

💡 原文英文,约800词,阅读约需3分钟。
📝

内容提要

Kubernetes v1.37 将 PersistentVolumeClaimUnusedSinceTime 特性门控升级为 Beta 并默认启用。PVC 保护控制器会为每个 PVC 添加 Unused 状况,直接显示是否有运行中的 Pod 引用它,无需自定义工具。当状况从 False 变为 True 时,lastTransitionTime 记录 PVC 变为空闲的时间,可用于查找闲置超 30 天的 PVC,帮助清理孤立存储、降低成本。

🔎

延伸解读

从 Alpha 到 Beta:默认启用意味着什么

该特性在 v1.36 以 Alpha 形式引入,需要手动开启特性门控;v1.37 升级为 Beta 并默认启用,且具备完整的端到端测试覆盖。这意味着升级到 v1.37 后,无需额外配置,所有 PVC 都会自动带有 Unused 状况。对于运维团队而言,这降低了采用门槛,但也需注意:默认行为变化可能影响依赖 PVC 状态字段的现有监控或自动化脚本,建议升级前检查相关逻辑。

Unused 状况如何判断与记录空闲时间

PVC 保护控制器原本就监视 Pod 以实施存储对象使用保护,现在它同时管理 Unused 状况。当没有运行中的 Pod 引用 PVC 时,状况为 True,原因为 NoPodsUsingPVC;有 Pod 引用时为 False,原因为 PodUsingPVC。状况的 lastTransitionTime 字段在从 False 变为 True 时,精确记录 PVC 变为空闲的时刻,因此可直接回答“这个 PVC 闲置了多久”,无需自行推算。

清理孤立存储的实用查询示例

文章给出了一条基于 kubectl 和 jq 的查询命令,用于列出所有 Unused 状况为 True 且空闲超过 30 天的 PVC。该命令遍历所有命名空间的 PVC,筛选出 Unused 状况为 True 的项,再比较 lastTransitionTime 与当前时间的差值是否超过 30 天。这为识别长期未使用的存储、清理孤立 PVC 并降低成本提供了可直接复用的方法,但执行删除前仍应人工确认数据是否可安全释放。

使用限制与后续演进

Unused 状况仅反映当前是否有运行中的 Pod 引用 PVC,并不判断 PVC 是否曾被使用或数据是否重要。对于已成功或失败且 restartPolicy 为 Never 的 Pod,其引用关系可能不再计入,具体行为需参考官方文档。该特性目前为 Beta,Kubernetes 项目计划根据反馈和采用情况在未来的版本中将其推进至 GA,因此 API 细节仍可能调整,生产环境使用时应关注版本发布说明。

Q&A

Kubernetes v1.37 中 PersistentVolumeClaimUnusedSinceTime 特性门控是什么状态?

在 Kubernetes v1.37 中,PersistentVolumeClaimUnusedSinceTime 特性门控已升级为 Beta 并默认启用。

PVC 的 Unused 状况是如何工作的?

PVC 保护控制器会为每个 PVC 添加一个 Unused 状况。当没有运行中的 Pod 引用该 PVC 时,状况为 True,原因为 NoPodsUsingPVC;当有 Pod 引用时,状况为 False,原因为 PodUsingPVC。

如何利用 Unused 状况的 lastTransitionTime 来识别闲置 PVC?

当 Unused 状况从 False 变为 True 时,lastTransitionTime 记录了 PVC 变为空闲的时间。你可以使用这个时间戳来查找闲置超过一定时间(例如 30 天)的 PVC。

为什么需要 PersistentVolumeClaimUnusedSinceTime 这个特性?

在大型集群中,用户可能创建 PVC 后删除关联的 Pod 但未清理存储,导致孤立 PVC 积累,消耗存储容量并增加云成本。之前很难判断 PVC 是否仍在使用,需要交叉引用 Pod、PV 和 PVC,而该特性原生提供了答案。

如何查看一个 PVC 的 Unused 状况?

可以使用命令:kubectl get pvc <pvc-name> -o jsonpath='{.status.conditions[*]}' | jq . 来查看 PVC 的状况,其中会包含 Unused 状况。

如何列出所有闲置超过 30 天的 PVC?

可以使用如下命令:kubectl get pvc -A -o json | jq -r '.items[] | select(.status.conditions[]? | select(.type=="Unused" and .status=="True")) | select( (.status.conditions[] | select(.type=="Unused") | .lastTransitionTime) as $t | (now - ($t | fromdateiso8601)) > (30 * 86400) ) | "\(.metadata.namespace)/\(.metadata.name) unused since \(.status.conditions[] | select(.type=="Unused") | .lastTransitionTime)"'

PersistentVolumeClaimUnusedSinceTime 特性未来会 GA 吗?

根据反馈和采用情况,Kubernetes 项目计划在未来版本中将此特性升级为 General Availability (GA)。

🏷️

标签

➡️

继续阅读