如果 StatefulSet 被删除并重新创建,持久卷会发生啥?

Posted

技术标签:

【中文标题】如果 StatefulSet 被删除并重新创建,持久卷会发生啥?【英文标题】:What happens to persistent volume if the StatefulSet got deleted and re-created?如果 StatefulSet 被删除并重新创建,持久卷会发生什么? 【发布时间】:2019-11-21 11:55:57 【问题描述】:

我将 Kafka 和 zookeeper 作为 statefulset 并将 Kafka 暴露在集群外部。但是,每当我尝试删除 Kafka statefulset 并重新创建一个时,数据似乎消失了? (当我尝试使用kafkacat 消费所有消息时,旧消息似乎消失了)即使它使用相同的 PVC 和 PV。我目前使用 EBS 作为我的持久卷。

有人可以向我解释当我删除 statefulset 时 PV 发生了什么吗?请帮帮我。

【问题讨论】:

删除statefulsets并检查是否可以看到ebs卷文件夹中的数据。 【参考方案1】:

我可能会看看持久卷是如何创建的。 如果你运行命令 kubectl get pv 你可以看到Reclaim policy,如果它被设置为retain,那么即使有状态集被删除,你的volume也会继续存在

【讨论】:

回收策略设置为保留。我想每当我尝试重新创建或重新开始时,我都会看到它连接到现有的 pvc 和 pv,但似乎之前的所有数据都被清除了。 不应该这样!即使在删除之后,持久卷也应该能够保存数据。我的猜测是,当你重新创建一个有状态的集合时,它可能是在创建一个新的 PV? 不,我认为它仍在使用相同的 pv。可能重新创建的 Kafka 集群找不到现有数据?【参考方案2】:

这是预期的行为,因为新的 statefulSet 将创建一组新的 PV 并重新开始。 (如果没有其他选择,它也可以随机降落在旧 PV 上,例如本地卷)

StatefulSet 并不意味着 kubernetes 会记住您在您删除的其他旧 statefulset 中所做的事情。

Statefulset 表示如果 Pod 因某种原因重新启动或重新创建,将为其分配相同的卷。这并不意味着卷将在 StatefulSet 中分配。

【讨论】:

你有这方面的资料吗?这似乎并不普遍正确。【参考方案3】:

我假设您的情况是您有一个 statefulset,其中有一个 persistentvolumeclaim 定义 - 或者它只是引用现有卷 - 您尝试删除它。

在这种情况下,持久卷将保留在那里。 pvc也不会消失;

这样您就可以根据需要将相同的卷重新挂载到不同的 statefulset pod - 或更新之前的一个。

如果你想删除持久化卷,你应该删除 pvc,buond PV 就会消失。

【讨论】:

以上是关于如果 StatefulSet 被删除并重新创建,持久卷会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

k8s数据持久化之statefulset的数据持久化,并自动创建PV与PVC

Statefulset详细解析

StatefulSet

k8s集群线上某些特殊情况强制删除 StatefulSet 的 Pod 隐患考虑?

k8s学习-StatefulSet(模板更新扩缩容删除等)

有没有办法在 kubernetes 部署(或 statefulset)中为每个 pod 创建一个持久卷?