什么时候用StatefulSet?可以在StatefulSet中部署数据库吗?

When should I use StatefulSet?Can I deploy database in StatefulSet?

听说statefulset适合做数据库。 但是 StatefulSet 会为 echo pod 创建不同的 pvc。 如果我设置 replicas=3.then 我会得到 3 个 pod 和 3 个不同的 pvc 不同的数据。 对于数据库用户,他们只想要一个数据库而不是 3 个数据库。 所以很明显我们不应该在这种情况下使用 statefulset。 但是什么时候应该使用statefulset。

stateful set 对于 运行ning 基本上存储 state 的应用程序很有用。

状态集数据库运行 POD 和PVC 的多个 副本,但在内部它们都自动同步。 pods 和 PVC 之间的数据同步。

因此,理想情况下,最好的选择是使用具有多个副本的有状态集来获取 HA 数据库

现在取决于你想使用哪个数据库的用例,它支持复制或不支持集群等

这里是 MySQL 带有复制详细信息的示例:https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/

StatefulSet 与 Deployment 有三大不同之处:

  1. 它为每个副本创建一个新的 PersistentVolumeClaim;
  2. 它给出了 pods 个顺序名称,从 statefulsetname-0 开始;和
  3. 它以特定顺序(数字升序)启动 pods。

当数据库本身知道如何在自身的不同副本之间复制数据时,这很有用。例如,在 Elasticsearch 中,索引被分解成碎片。每个分片默认有两个副本。如果你有五个 Pods 运行 Elasticsearch,每个都有不同的数据部分,但在内部数据库系统知道如何将请求路由到具有相关数据的特定服务器。

我建议优先使用 StatefulSet,而不是手动创建 PersistentVolumeClaim。对于无法复制的数据库工作负载,在任何一种情况下都不能将 replicas: 设置为大于 1,但 PVC 管理很有价值。您通常不能让多个数据库指向相同的物理存储、容器或其他方式,并且大多数类型的卷不能在 Pods.

之间共享

我们可以将数据库作为有状态应用程序部署到 Kubernetes。通常,当我们部署时 pods 他们有自己的存储,但该存储是短暂的——如果容器杀死了它的存储,它就会随之消失。

因此,我们将有一个 Kubernetes 对象来解决这种情况:当我们希望我们的数据持久化时,我们附加一个具有相应持久卷声明的 pod。通过这样做,如果我们的容器杀死了我们的数据,它将在集群中,并且新的 pod 将相应地访问数据。

使用 StatefulSet 的一些限制是:

1.Required 使用持久卷供应器根据请求存储为 Pod 供应存储 class。

2.Deleting 或缩减副本不会删除附加到 StatefulSet 的卷。保证了数据的安全。

3.StatefulSets 目前需要 Headless Service 来负责 Pods 的网络身份。

4.StatefulSet 不提供任何保证在删除 StatefulSet 时删除所有 pods,这与 deployment 不同,它会在删除 deployment 时删除与 deployment 关联的所有 pods。在删除 StatefulSet 之前,您必须将 pod 副本缩减为 0。