本文发布时间超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已失效。

Kubernetes 1.27:StatefulSet PVC 自动删除(beta)

Kubernetes v1.27 将一个新的策略机制升级为 beta 版本,该机制用于 StatefulSets,控制其 PersistentVolumeClaims (PVC) 的生命周期。新的 PVC 保留策略允许用户指定当 StatefulSet 被删除或 StatefulSet 中的副本缩减时,从 StatefulSet 规范模板生成的 PVC 应自动删除还是保留。

这解决了什么问题?

StatefulSet 规范可以包含 Pod 和 PVC 模板。当首次创建副本时,如果尚不存在 PVC,则 Kubernetes 控制平面会为该副本创建一个 PVC。在 PVC 保留策略之前的行为是,控制平面永远不会清理为 StatefulSets 创建的 PVC - 这留给了集群管理员,或者一些你必须找到、检查适用性并部署的附加自动化工具。手动或通过 Helm 等工具管理 PVC 的常见模式是,PVC 由管理它们的工具跟踪,并具有明确的生命周期。使用 StatefulSets 的工作流必须自行确定 StatefulSet 创建了哪些 PVC 以及它们的生命周期应该是什么。

在此新功能之前,当 StatefulSet 管理的副本消失时,无论是由于 StatefulSet 正在减少其副本数量,还是因为其 StatefulSet 被删除,PVC 及其后备卷都会保留下来,必须手动删除。虽然这种行为在数据至关重要时是合适的,但在许多情况下,这些 PVC 中的持久数据要么是临时的,要么可以从其他来源重建。在这些情况下,在其 StatefulSet 或副本被删除后仍然存在的 PVC 及其后备卷是不必要的,会产生成本,并且需要手动清理。

新的 StatefulSet PVC 保留策略

新的 StatefulSet PVC 保留策略用于控制是否以及何时删除从 StatefulSetvolumeClaimTemplate 创建的 PVC。这可能发生在两种情况下。

第一种情况是当 StatefulSet 资源被删除时(这意味着所有副本也被删除)。这由 whenDeleted 策略控制。第二种情况,由 whenScaled 控制,是当 StatefulSet 缩减时,这会删除 StatefulSet 中的一些但不是所有副本。在这两种情况下,策略都可以是 Retain,其中相应的 PVC 不会被触及,或者 Delete,这意味着 PVC 会被删除。删除是使用正常的 对象删除 完成的,因此,例如,基础 PV 的所有保留策略都会得到遵守。

此策略形成一个包含四种情况的矩阵。我将逐一介绍并为每种情况提供一个示例。

  • whenDeletedwhenScaled 均为 Retain

    这与 StatefulSets 的现有行为相匹配,其中不会删除任何 PVC。这也是默认的保留策略。当 StatefulSet 卷上的数据不可替代并且只能手动删除时,使用它是合适的。

  • whenDeletedDeletewhenScaledRetain

    在这种情况下,仅当整个 StatefulSet 被删除时才会删除 PVC。如果 StatefulSet 被缩减,则不会触及 PVC,这意味着如果发生任何先前副本的数据的放大,它们可以重新附加。这可能用于临时 StatefulSet,例如 CI 实例或 ETL 管道中,其中 StatefulSet 上的数据仅在 StatefulSet 的生命周期内需要,但在任务运行时,数据不易重建。任何保留的状态都是任何缩减然后放大的副本所需要的。

  • whenDeletedwhenScaled 均为 Delete

    当不再需要副本时,PVC 会立即被删除。请注意,这不包括当 Pod 被删除并重新安排新版本时,例如当节点被耗尽并且 Pods 需要迁移到其他地方时。只有当副本不再需要时,才删除 PVC,如缩减或 StatefulSet 删除所示。这种情况适用于数据不需要超出其副本的生命周期的情况。也许数据很容易重建,删除未使用 PVC 的成本节省比快速放大更重要,或者当创建新副本时,任何来自先前副本的数据都是不可用的,必须重建。

  • whenDeletedRetainwhenScaledDelete

    这与前一种情况类似,即在放大期间保留 PVC 以快速重用几乎没有好处。您可以使用此方法的情况的一个示例是 Elasticsearch 集群。通常,您会放大和缩小该工作负载以匹配需求,同时确保最少数量的副本(例如:3)。缩小时,数据会从删除的副本中迁移出去,并且保留这些 PVC 没有任何好处。但是,暂时关闭整个 Elasticsearch 集群以进行维护可能很有用。如果您需要将 Elasticsearch 系统脱机,可以通过暂时删除 StatefulSet,然后通过重新创建 StatefulSet 将 Elasticsearch 集群恢复。保存 Elasticsearch 数据的 PVC 仍然存在,并且新副本将自动使用它们。

请访问文档以查看所有详细信息。

下一步是什么?

试一试! StatefulSetAutoDeletePVC 功能门是 beta 版本,并且在运行 Kubernetes 1.27 的集群上默认启用。使用新策略创建 StatefulSet,对其进行测试,并告诉我们您的想法!

我很想知道这种所有者引用机制在实践中是否运作良好。例如,我意识到 Kubernetes 中没有机制来知道是谁设置了引用,因此 StatefulSet 控制器可能会与设置自己引用的自定义控制器发生冲突。幸运的是,维护现有的保留行为不涉及任何新的所有者引用,因此默认行为将是兼容的。

请使用标签 sig/apps 标记您报告的任何问题,并将其分配给 Matthew Cary(GitHub 上的 @mattcary)。

祝您使用愉快!