【问题标题】:Kubernetes Deployments vs StatefulSetsKubernetes 部署与 StatefulSet
【发布时间】:2017-05-25 19:38:55
【问题描述】:

我一直在对 Kubernetes 进行大量研究,我很喜欢我看到的很多东西!我一直无法清楚了解的一件事是 Deployment 和 StatefulSet 资源之间的确切区别是什么,以及您将在哪些场景中使用它们(或者一个通常优于另一个)。

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    Deployments 和 ReplicationController 用于无状态使用,并且相当轻量级。当必须保持状态时使用StatefulSets。因此后者在持久卷上使用volumeClaimTemplates / 声明,以确保它们可以在组件重新启动时保持状态。

    因此,如果您的应用程序是有状态的,或者如果您想在 Kubernetes 上部署有状态存储,请使用 StatefulSet。

    如果您的应用程序是无状态的,或者如果可以在启动期间从后端系统建立状态,则使用部署。

    有关运行有状态应用程序的更多详细信息,请参阅2016 kubernetes' blog entry about stateful applications

    【讨论】:

    • 我还可以将部署的 pod 与持久卷声明连接起来,以确保安全。
    • @TorstenBronger 我同意——此时我们又回到了最初的问题,即 StatefulSet 的意义何在?
    • @HDave 使用动态持久卷和快速发展的存储提供商(如 Portworx、OpenEBS),可以解决数据持久性问题,但命名和启动/升级顺序与 StatefulSets 仍然不同,允许应用需要主/从或其他设置才能正确形成集群。尽管我确实同意,也许所有这些都可以合并到一个 deployment 配置中,并使用一个简单的规范来设置每个节点 1 个(守护程序集)、副本或有状态的排序。
    • 重要的是要意识到“启动/升级顺序”是关于 Pod 副本(即 1、2、3...)——而不是不同的 pod(即 web、srv、db 等) .换句话说,它不能替代 docker-compose 依赖项。
    【解决方案2】:

    有状态集

    将“StatefulSet”与有状态分布式应用程序一起使用,这要求每个节点都具有持久状态。 StatefulSet 提供了通过配置(replicas = N)为有状态的应用程序/组件配置任意数量的节点的能力。

    有两种状态的分布式应用程序:Master-Master 和 Master-Slave。 Master-Master 配置中的所有节点和 Master-Slave 配置中的 Slave 节点都可以使用 StatefulSet。
    示例:
    主从 -> Hadoop 集群中的数据节点(从属)
    Master-Master -> Cassandra 集群中的数据库节点(master-master)

    StatefulSet 中的每个 Pod(副本/节点)都具有唯一且稳定的网络身份。例如,在名称为“cassandra”且副本节点数为 N 的 Cassandra StatefulSet 中,每个 Cassandra pod(节点)具有:

    • 每个 pod 的序号索引:0,1,..,N-1
    • 稳定网络ID:cassandra-0, cassandra-1,.., cassandra-N-1
    • 针对每个 pod 的单独持久卷 卷声明模板,即每个 pod(节点)的单独存储
    • Pod 以 0 到 N-1 的顺序创建,并以 N-1 到 0 的相反顺序终止

    参考:https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

    部署

    另一方面,“部署”适用于节点不需要任何特殊身份的无状态应用程序/服务。负载均衡器可以到达它选择的任何节点。所有节点都是平等的。 Deployment 可用于通过配置(副本 = N)创建任意数量的任意节点。

    【讨论】:

      【解决方案3】:
      • 部署 - 您指定一个共享的 PersistentVolumeClaim 所有 pod 副本。换句话说,共享卷。

        后备存储显然必须具有 ReadWriteManyReadOnlyMany 如果您有多个副本 pod,则为 accessMode。

      • StatefulSet - 您指定一个 volumeClaimTemplates 以便每个副本 pod 获得一个唯一的 PersistentVolumeClaim 它。换句话说,没有共享卷。

        这里,后备存储可以有 ReadWriteOnce 访问模式。

        StatefulSet 对于在集群中运行事物很有用,例如 Hadoop cluster,MySQL 集群,每个节点都有自己的存储。

      【讨论】:

      • 那么当你说no shared volume的时候,就是说同一个部署的每个pod都有不同的数据?
      • @JananathBanuka 是的
      • 这取决于您正在运行的集群解决方案或数据库...它们是完全独立的存储
      【解决方案4】:

      TL;DR

      Deployment 是部署无状态应用程序的资源,如果使用 PVC,所有副本都将使用相同的 Volume,并且没有一个具有自己的状态。

      Statefulsets 用于有状态的应用程序,pod 的每个副本都有自己的状态,并且会使用自己的 Volume。

      DaemonSet 是一个类似于 ReplicaSet 的控制器,它确保 Pod 在集群的所有节点上运行。如果从集群中添加/删除节点,DaemonSet 会自动添加/删除 pod。

      我已经写了关于部署、StatefulSets 和守护程序集之间的详细区别,以及如何使用这些资源K8s: Deployments vs StatefulSets vs DaemonSets 部署示例应用程序。

      【讨论】:

      • 跟进您的评论,在我看来,两者之间的区别在于,一个能够指定 pod 特定的存储(并因此保持 pod 特定的状态),而另一个则不能t (因此只能保持服务范围的状态)。从这个意义上说,在服务级别上,两者都可以被视为有状态的。但是在 pod 级别,只有 Statefulsets 是有状态的。
      【解决方案5】:

      StatefulSet和部署的区别

      StatefulSet 相当于一个特殊的部署。 StatefulSet 中的每个 pod 都有一个稳定的、唯一的网络标识符,可用于发现集群中的其他成员。如果StatefulSet的名字是Kafka,那么第一个pod叫做Kafka-0,第二个叫做Kafka-1,以此类推;由 StatefulSet 控制的 Pod 副本的启动和停止顺序是受控的。当第 n 个 pod 运行时,前 N-1 个 pod 已经在运行,并且处于就绪状态; StatefulSet 中的 pod 使用稳定的持久存储卷,由 PV 或 PVC 实现。删除 pod 时,默认不删除 StatefulSet 关联的存储卷(为了数据安全); StatefulSet 必然会绑定到 PV 卷。用于存储pod状态数据,也可以和headless services配合使用,声明属于那个headless service;

      【讨论】:

        【解决方案6】:

        StatefulSet 与 ReplicaSet 的比较

        Feature StatefulSets Deployment
        State Statefull Stateless
        Definition Stateful app: Stateful applications typically involve some database, such as Cassandra, MongoDB, or MySQL, and processes a read and/or write to it. Usually, frontend components have completely different scaling requirements than the backends, so we tend to scale them individually. Not to mention the fact that backends such as databases are usually much harder to scale compared to (stateless) frontend web servers. Yes, the term “stateless” means that no past data nor state is stored or needs to be persistent when a new container is created
        Behaviour When a stateful pod instance dies (or the node it’s running on fails), the pod instance needs to be resurrected on another node, new instance get the same name, network identity, and state as the one it’s replacing. Pod replicas managed by a Deployment; they’re mostly stateless, they can be replaced with a completely new pod replica at any time.
        Pod Mechanism Pods created by the StatefulSet aren’t exact replicas of each other. Each can have its own set of volumes—in other words, storage (and thus persistent state)—which differentiates it from its peers. When a Deployment replaces a pod, the new pod is a completely new pod with a new hostname and IP

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-13
          • 1970-01-01
          • 2020-05-28
          • 2020-12-02
          • 1970-01-01
          • 2019-10-28
          • 1970-01-01
          相关资源
          最近更新 更多