本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
Kubernetes 1.27:StatefulSet PVC 自动删除(Beta)
Kubernetes v1.27 将一项针对 StatefulSets
的新策略机制升级至 Beta 阶段,该机制用于控制其 PersistentVolumeClaims
(PVC) 的生命周期。新的 PVC 保留策略允许用户指定当 StatefulSet
被删除或 StatefulSet
中的副本被缩减时,从 StatefulSet
规范模板生成的 PVC 是否应被自动删除或保留。
这解决了什么问题?
一个 StatefulSet
规范可以包含 Pod
和 PVC 模板。当一个副本首次被创建时,如果 PVC 尚不存在,Kubernetes 控制平面会为该副本创建一个 PVC。在引入 PVC 保留策略之前,行为是控制平面从不清理为 StatefulSet
创建的 PVC——这项工作留给了集群管理员,或者需要你自行寻找、检查适用性并部署的附加自动化工具。管理 PVC 的常见模式,无论是手动还是通过 Helm 等工具,都是由管理它们的工具来跟踪 PVC,并具有明确的生命周期。使用 StatefulSet
的工作流必须自行确定哪些 PVC 是由 StatefulSet
创建的,以及它们的生命周期应该如何。
在这个新功能出现之前,当一个由 StatefulSet 管理的副本消失时,无论是因为 StatefulSet
减少了其副本数量,还是因为其 StatefulSet
被删除,PVC 及其后备卷都会保留下来,必须手动删除。虽然当数据至关重要时这种行为是适当的,但在许多情况下,这些 PVC 中的持久化数据要么是临时的,要么可以从另一个来源重建。在这些情况下,StatefulSet
或其副本被删除后保留下来的 PVC 及其后备卷是不必要的,会产生费用,并需要手动清理。
新的 StatefulSet
PVC 保留策略
新的 StatefulSet
PVC 保留策略用于控制从 StatefulSet
的 volumeClaimTemplate
创建的 PVC 是否以及何时被删除。这可能发生在两种情况下。
第一种情况是当 StatefulSet
资源被删除时(这意味着所有副本也被删除)。这由 whenDeleted
策略控制。第二种情况,由 whenScaled
控制,是当 StatefulSet
缩减时,这会移除 StatefulSet
中的部分但非全部副本。在这两种情况下,策略都可以是 Retain
(保留),即相应的 PVC 不会被触动,或者是 Delete
(删除),这意味着 PVC 会被删除。删除操作是通过正常的对象删除来完成的,因此,例如,底层 PV 的所有保留策略都会被遵守。
这个策略形成了一个包含四种情况的矩阵。我将逐一介绍并为每种情况举例说明。
whenDeleted
和whenScaled
均为Retain
。这与
StatefulSets
的现有行为相匹配,即不删除任何 PVC。这也是默认的保留策略。当StatefulSet
卷上的数据可能是不可替代且只应手动删除时,使用此策略是合适的。whenDeleted
为Delete
,whenScaled
为Retain
。在这种情况下,只有当整个
StatefulSet
被删除时,PVC 才会被删除。如果StatefulSet
被缩减,PVC 不会被触动,这意味着如果发生扩容,它们可以被重新挂载,并保留之前副本的任何数据。这可能用于临时的StatefulSet
,例如在 CI 实例或 ETL 管道中,其中StatefulSet
上的数据仅在StatefulSet
的生命周期内需要,但在任务运行期间,数据不易重建。任何被缩减然后又扩容的副本都需要保留的状态。whenDeleted
和whenScaled
均为Delete
。当副本不再需要时,PVC 会被立即删除。请注意,这不包括
Pod
被删除并重新调度一个新版本的情况,例如当一个节点被排空,Pod
需要迁移到别处时。PVC 仅在副本因缩减或StatefulSet
删除而不再需要时才被删除。此用例适用于数据不需要在其副本的生命周期之外存在的情况。也许数据很容易重建,删除未使用的 PVC 所节省的成本比快速扩容更重要,或者当创建新副本时,任何来自先前副本的数据都无法使用,必须重新构建。whenDeleted
为Retain
,whenScaled
为Delete
。这与前一种情况类似,即在扩容期间保留 PVC 以便快速重用的好处很小。一个可能使用此策略的例子是 Elasticsearch 集群。通常,你会根据需求扩缩该工作负载,同时确保最小副本数(例如:3)。缩减时,数据会从被移除的副本中迁移走,保留这些 PVC 没有好处。但是,为了维护而临时关闭整个 Elasticsearch 集群可能很有用。如果需要让 Elasticsearch 系统离线,可以通过临时删除
StatefulSet
来实现,然后通过重新创建StatefulSet
来恢复 Elasticsearch 集群。保存 Elasticsearch 数据的 PVC 仍然存在,新的副本将自动使用它们。
请访问文档查看所有细节。
下一步是什么?
快来试试吧!StatefulSetAutoDeletePVC
特性门控在运行 Kubernetes 1.27 的集群上默认为 Beta 阶段并已启用。使用新策略创建一个 StatefulSet
,测试一下,并告诉我们你的想法!
我很好奇这个所有者引用机制在实践中是否能很好地工作。例如,我意识到 Kubernetes 中没有机制来知道是谁设置了引用,所以 StatefulSet
控制器可能会与设置自己引用的自定义控制器发生冲突。幸运的是,维持现有的保留行为不涉及任何新的所有者引用,因此默认行为将是兼容的。
请为你报告的任何问题打上 sig/apps
标签,并将其分配给 Matthew Cary(GitHub 上的 @mattcary)。
祝你使用愉快!