本文已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
Kubernetes 1.23:StatefulSet PVC 自动删除(alpha)
Kubernetes v1.23 引入了一个新的、alpha 级别的策略,用于 StatefulSet,它控制 PersistentVolumeClaims (PVC) 的生命周期,这些 PVC 是从 StatefulSet 规范模板生成的,用于当 StatefulSet 被删除或 StatefulSet 中的 Pod 缩减时应该自动删除的情况。
这解决了什么问题?
StatefulSet 规范可以包含 Pod 和 PVC 模板。当第一次创建副本时,如果不存在 PVC,Kubernetes 控制平面会为该副本创建一个 PVC。在 Kubernetes v1.23 之前的行为是,控制平面从不清理为 StatefulSet 创建的 PVC - 这留给集群管理员或一些您需要查找、检查适用性并部署的附加自动化功能。管理 PVC 的常见模式(无论是手动还是通过 Helm 等工具)是,PVC 由管理它们的工具跟踪,并具有显式的生命周期。使用 StatefulSet 的工作流程必须自行确定 StatefulSet 创建了哪些 PVC 以及它们的生命周期应该是什么。
在此新功能之前,当由 StatefulSet 管理的副本消失时,无论是由于 StatefulSet 正在减少其副本计数,还是由于其 StatefulSet 被删除,PVC 及其后备卷仍然存在,必须手动删除。虽然当数据至关重要时,此行为是合适的,但在许多情况下,这些 PVC 中的持久数据是临时的,或者可以从其他来源重建。在这些情况下,在 StatefulSet 或副本删除后仍然存在的 PVC 及其后备卷是不必要的,会产生成本,并且需要手动清理。
新的 StatefulSet PVC 保留策略
如果您启用 alpha 功能,StatefulSet 规范将包含 PersistentVolumeClaim 保留策略。这用于控制何时以及是否删除从 StatefulSet 的 volumeClaimTemplate
创建的 PVC。保留策略的第一次迭代包含可能删除 PVC 的两种情况。
第一种情况是当 StatefulSet 资源被删除时(这意味着所有副本也被删除)。这由 whenDeleted
策略控制。第二种情况,由 whenScaled
控制,是当 StatefulSet 缩减时,这会删除 StatefulSet 中的一些但不是所有副本。在这两种情况下,该策略可以是 Retain
,即不触碰相应的 PVC,也可以是 Delete
,这意味着删除 PVC。删除操作使用正常的对象删除完成,以便例如遵守底层 PV 的所有保留策略。
此策略形成一个包含四种情况的矩阵。我将逐一介绍并给出每个示例。
whenDeleted
和whenScaled
都是Retain
。 这与 StatefulSet 的现有行为相匹配,即不删除任何 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
功能门,然后使用新策略创建 StatefulSet。测试一下,告诉我们您的想法!
我很好奇这种所有者引用机制在实践中是否能很好地工作。例如,我们意识到 Kubernetes 中没有机制可以知道是谁设置了引用,因此 StatefulSet 控制器可能会与设置自己引用的自定义控制器发生冲突。幸运的是,维护现有的保留行为不涉及任何新的所有者引用,因此默认行为将是兼容的。
请使用标签 sig/apps
标记您报告的任何问题,并将其分配给 Matthew Cary (@mattcary 在 GitHub 上)。
尽情享受!