本文已超过一年。旧文章可能包含过时内容。请检查页面信息自发布以来是否仍然准确。
Kubernetes 1.27:StatefulSet PVC 自动删除(beta)
Kubernetes v1.27 为 StatefulSets
引入了一个新的策略机制(已升级到 beta 阶段),该机制控制 PersistentVolumeClaims (PVCs) 的生命周期。新的 PVC 保留策略允许用户指定,当 StatefulSet
被删除或 StatefulSet 中的副本被缩容时,从 StatefulSet
spec 模板生成的 PVC 是否应自动删除或保留。
这个问题解决了什么?
一个 StatefulSet
spec 可以包含 Pod
和 PVC 模板。当一个副本首次创建时,如果对应的 PVC 不存在,Kubernetes 控制平面会为其创建一个 PVC。在引入 PVC 保留策略之前,控制平面对为 StatefulSets
创建的 PVC 从不进行清理——这由集群管理员负责,或者依赖你不得不寻找、检查其适用性并部署的附加自动化工具。管理 PVC 的常见模式,无论是手动还是通过 Helm 等工具,都是由管理它们的工具跟踪 PVC,并具有明确的生命周期。使用 StatefulSets
的工作流必须自行确定由 StatefulSet
创建了哪些 PVC 以及它们的生命周期应如何。
在此新特性之前,当 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 被删除并重新调度新版本的情况,例如当节点被驱逐且
Pods
需要迁移到其他地方时。只有在缩容或StatefulSet
删除表明副本不再需要时,PVC 才会被删除。此用例适用于数据无需在其副本生命周期结束后继续存在的情况。或许数据很容易重建,且删除未使用 PVC 节省的成本比快速扩容更重要,或者当创建一个新副本时,之前副本中的任何数据都无法使用,无论如何都需要重建。whenDeleted
设置为Retain
,whenScaled
设置为Delete
。这类似于前一种情况,即保留 PVC 以便在扩容时快速重用意义不大。一个可能使用此策略的场景是 Elasticsearch 集群。通常你会根据需求对该工作负载进行扩容和缩容,同时确保保持最小副本数(例如:3)。当缩容时,数据会从移除的副本迁移走,保留这些 PVC 没有益处。但是,有时需要暂时关闭整个 Elasticsearch 集群进行维护,这会很有用。如果你需要将 Elasticsearch 系统下线,可以通过临时删除
StatefulSet
来实现,然后通过重新创建StatefulSet
来恢复 Elasticsearch 集群。存放 Elasticsearch 数据的 PVC 仍然存在,新的副本将自动使用它们。
访问文档查看所有细节。
下一步是什么?
快来试试吧! StatefulSetAutoDeletePVC
Feature Gate 已进入 beta 阶段,并在运行 Kubernetes 1.27 的集群上默认启用。使用新策略创建一个 StatefulSet
,测试一下,并告诉我们你的想法!
我很好奇这个 owner reference 机制在实践中是否能很好地工作。例如,我意识到 Kubernetes 中没有机制可以知道是谁设置了 reference,因此 StatefulSet
控制器可能与设置自己 reference 的自定义控制器发生冲突。幸运的是,保持现有的保留行为不涉及任何新的 owner reference,因此默认行为是兼容的。
请为你报告的任何问题打上 sig/apps
标签,并将它们分配给 Matthew Cary(GitHub 上的@mattcary)。
祝您使用愉快!