这篇文章已超过一年。较早的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不正确。

Kubernetes 1.23:StatefulSet PVC 自动删除 (alpha)

Kubernetes v1.23 引入了一项新的 alpha 级别策略,用于 StatefulSets,该策略控制从 StatefulSet spec 模板生成的 PersistentVolumeClaims (PVCs) 的生命周期。该策略用于指定在 StatefulSet 被删除或 StatefulSet 中的 Pod 被缩容时,PVC 是否应自动删除。

这解决了什么问题?

一个 StatefulSet spec 可以包含 Pod 和 PVC 模板。当首次创建副本时,如果该副本的 PVC 尚不存在,Kubernetes 控制平面会为其创建一个 PVC。在 Kubernetes v1.23 之前的行为是,控制平面从不清理为 StatefulSets 创建的 PVC——这需要由集群管理员或某些附加自动化工具来完成,而您需要找到、检查适用性并部署这些工具。手动或通过 Helm 等工具管理 PVC 的常见模式是,由管理这些 PVC 的工具来跟踪它们,并带有明确的生命周期。使用 StatefulSets 的工作流必须自行确定 StatefulSet 创建了哪些 PVC 以及它们的生命周期应该是怎样的。

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

新的 StatefulSet PVC 保留策略

如果您启用了此 alpha 功能,StatefulSet spec 会包含一个 PersistentVolumeClaim 保留策略。该策略用于控制是否以及何时删除从 StatefulSet 的 volumeClaimTemplate 创建的 PVC。保留策略的第一个版本包含两种可能删除 PVC 的情况。

第一种情况是当 StatefulSet 资源被删除时(这意味着所有副本也被删除)。这由 whenDeleted 策略控制。第二种情况由 whenScaled 控制,即 StatefulSet 缩容时,这会移除 StatefulSet 中的部分而非全部副本。在这两种情况下,策略可以是 Retain(不触碰相应的 PVC)或 Delete(删除 PVC)。删除操作是正常的对象删除,因此例如,底层 PV 的所有保留策略都会得到遵守。

该策略形成了一个包含四种情况的矩阵。我将逐一介绍并给出示例。

  • whenDeletedwhenScaled 都设置为 Retain 这与 StatefulSets 的现有行为一致,即不删除任何 PVC。这也是默认的保留策略。当 StatefulSet 卷上的数据可能不可替代且只能手动删除时,适合使用此策略。

  • whenDeleted 设置为 DeletewhenScaled 设置为 Retain 在这种情况下,仅当整个 StatefulSet 被删除时,PVC 才会被删除。如果 StatefulSet 缩容,PVC 不会被触碰,这意味着如果在扩容时有来自先前副本的数据,这些 PVC 可用于重新挂载。这可能用于临时 StatefulSet,例如在 CI 实例或 ETL 流水线中,StatefulSet 上的数据仅在 StatefulSet 生命周期内需要,但在任务运行时数据不易重建。任何保留的状态对于任何先缩容后扩容的副本都是必需的。

  • whenDeletedwhenScaled 都设置为 Delete 当副本不再需要时,其 PVC 会立即被删除。请注意,这不包括 Pod 被删除并重新调度新版本的情况,例如当节点被排空且 Pod 需要迁移到其他地方时。PVC 仅在缩容或 StatefulSet 删除表明副本不再需要时才会被删除。此用例适用于数据无需在其副本生命周期结束后继续存在的情况。也许数据易于重建,删除未使用的 PVC 所节省的成本比快速扩容更重要;或者当创建新副本时,来自先前副本的任何数据都无法使用,并且必须重新构建。

  • whenDeleted 设置为 RetainwhenScaled 设置为 Delete 这与前一种情况类似,即保留 PVC 以便在扩容期间快速重用带来的好处很小。可能使用这种情况的一个例子是 Elasticsearch 集群。通常您会根据需求扩展或缩减该工作负载,同时确保最少数量的副本(例如:3)。缩容时,数据会从被移除的副本中迁移出去,保留这些 PVC 没有益处。然而,有时需要暂时关闭整个 Elasticsearch 集群进行维护。如果您需要让 Elasticsearch 系统离线,可以通过临时删除 StatefulSet 来实现,然后通过重新创建 StatefulSet 使 Elasticsearch 集群恢复正常。保存 Elasticsearch 数据的 PVC 将仍然存在,新的副本将自动使用它们。

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

接下来是什么?

启用此功能并尝试一下!在集群上启用 StatefulSetAutoDeletePVC 功能门,然后使用新策略创建一个 StatefulSet。试用一下,并告诉我们您的想法!

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

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

祝您使用愉快!