本文已发布一年多。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否仍然准确。

Kubernetes 中的 PersistentVolume 最后阶段过渡时间

在最近的 Kubernetes v1.28 版本中,我们 (SIG Storage) 引入了一个新的 Alpha 特性,旨在改进持久卷 (PV) 的存储管理,并帮助集群管理员更好地了解 PV 的生命周期。通过在 PV 的状态中添加 lastPhaseTransitionTime 字段,集群管理员现在能够跟踪 PV 最后一次转换为不同阶段 (phase) 的时间,从而实现更高效和明智的资源管理。

为什么需要新的 PV 字段?

Kubernetes 中的持久卷 (PersistentVolumes) 在为集群中运行的工作负载提供存储资源方面起着至关重要的作用。然而,有效管理这些 PV 可能具有挑战性,尤其是在确定 PV 最后一次在不同阶段 (phase),例如 Pending (挂起)、Bound (绑定) 或 Released (释放) 之间转换的时间。管理员通常需要知道 PV 最后一次使用或转换为特定阶段的时间;例如,为了实施保留策略、执行清理或监控存储健康状况。

过去,Kubernetes 用户在使用 Delete (删除) 保留策略时曾面临数据丢失问题,不得不求助于更安全的 Retain (保留) 策略。当我们计划引入新的 lastPhaseTransitionTime 字段时,我们希望提供一个更通用的解决方案,可用于各种用例,包括基于卷最后使用时间的手动清理或基于阶段转换时间生成警报。

lastPhaseTransitionTime 如何提供帮助

如果你已启用功能门控 (feature gate) (参见如何使用),则 PersistentVolume (PV) 的新字段 .status.lastPhaseTransitionTime 会在 PV 每次从一个阶段转换为另一个阶段时更新。无论是从 Pending (挂起) 到 Bound (绑定),从 BoundReleased (释放),还是任何其他阶段转换,都会记录 lastPhaseTransitionTime。对于新创建的 PV,其阶段将被设置为 Pending,同时也会记录 lastPhaseTransitionTime

此特性允许集群管理员进行以下操作

  1. 实施保留策略

    借助 lastPhaseTransitionTime,管理员现在可以跟踪 PV 最后一次使用或转换为 Released (释放) 阶段的时间。此信息对于实施保留策略以清理在 Released 阶段停留了特定时长的资源至关重要。例如,现在可以轻松编写一个脚本或策略,删除所有在 Released 阶段停留了一周的 PV。

  2. 监控存储健康状况

    通过分析 PV 的阶段转换时间,管理员可以更有效地监控存储健康状况。例如,他们可以识别在 Pending (挂起) 阶段停留了异常长时间的 PV,这可能表明存储提供商存在潜在问题。

如何使用

lastPhaseTransitionTime 字段自 Kubernetes v1.28 起为 Alpha 特性,因此需要启用 PersistentVolumeLastPhaseTransitionTime 功能门控。

如果你想在 Alpha 阶段测试该特性,需要在 kube-controller-managerkube-apiserver 上启用此功能门控。

使用 --feature-gates 命令行参数

--feature-gates="...,PersistentVolumeLastPhaseTransitionTime=true"

请注意,启用特性不会立即生效;新字段将在 PV 更新并在阶段之间转换时填充。管理员随后可以通过 PV 状态访问新字段,这可以通过标准的 Kubernetes API 调用或 Kubernetes 客户端库来检索。

以下是使用 kubectl 命令行工具检索特定 PV 的 lastPhaseTransitionTime 的示例

kubectl get pv <pv-name> -o jsonpath='{.status.lastPhaseTransitionTime}'

未来展望

此特性最初作为 Alpha 特性引入,默认情况下其功能门控是禁用的。在 Alpha 阶段,我们 (Kubernetes SIG Storage) 将收集终端用户社区的反馈,并解决发现的任何问题或进行改进。

一旦收到足够的反馈,或者没有收到投诉,该特性就可以进入 Beta 阶段。Beta 阶段将使我们能够进一步验证实现并确保其稳定性。

从该字段升级到 Beta 的版本到该字段升级到正式发布 (GA) 的版本之间,至少会有两个 Kubernetes 发布周期。这意味着该字段最早可能在 Kubernetes 1.32 中正式发布,预计将在 2025 年初发布。

参与其中

我们随时欢迎新的贡献者,如果你想参与其中,可以加入我们的 Kubernetes 存储特别兴趣小组 (SIG Storage)

如果您想分享反馈意见,可以在我们的 公共 Slack 频道中进行。如果您尚未加入该 Slack 工作区,可以访问 https://slack.k8s.io/ 获取邀请。

特别感谢所有提供了出色评审、分享了宝贵见解并帮助实现此特性的贡献者 (按字母顺序排列)