Kubernetes部署与状态集

Kubernetes部署与状态集,kubernetes,Kubernetes,我在库伯内特斯身上做了很多挖掘工作,我喜欢我经常看到的东西!有一件事我一直无法弄清楚,即部署和状态集资源之间的确切区别,以及在哪些场景中使用它们(或者通常是一种优于另一种)。部署和复制控制器用于无状态使用,而且相当轻量级。在必须持久化状态时使用。因此,后者在持久卷上使用volumeClaimTemplates/声明,以确保它们可以在组件重新启动时保持状态 因此,如果您的应用程序是有状态的,或者您希望在Kubernetes之上部署有状态存储,请使用有状态集 如果您的应用程序是无状态的,或者在启动期

我在库伯内特斯身上做了很多挖掘工作,我喜欢我经常看到的东西!有一件事我一直无法弄清楚,即部署和状态集资源之间的确切区别,以及在哪些场景中使用它们(或者通常是一种优于另一种)。

部署和复制控制器用于无状态使用,而且相当轻量级。在必须持久化状态时使用。因此,后者在持久卷上使用
volumeClaimTemplates
/声明,以确保它们可以在组件重新启动时保持状态

因此,如果您的应用程序是有状态的,或者您希望在Kubernetes之上部署有状态存储,请使用有状态集

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

有关运行有状态应用程序的更多详细信息,请参见

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

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

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

  • 每个豆荚的顺序指数:0,1,…,N-1
  • 稳定网络id:cassandra-0,cassandra-1,…,cassandra-N-1
  • 一个单独的持久性卷,用于每个豆荚 批量索赔模板,即每个pod(节点)的单独存储
  • POD以0到N-1的顺序创建,并以N-1到0的相反顺序终止
参考:

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

  • 部署-指定一个共享的PersistentVolumeClaim 所有的pod复制品。换句话说,共享卷

    备份存储器显然必须具有读写权限ReadOnlyManyaccessMode(如果您有多个副本盒)

  • StatefulSet—指定一个volumeClaimTemplates,以便每个副本pod获得一个与之关联的唯一PersistentVolumeClaim 信息技术换句话说,没有共享卷

    这里,后备存储器可以具有ReadWriteOnceaccessMode

    StatefulSet对于在集群中运行东西很有用,例如Hadoop 集群,MySQL集群,其中每个节点都有自己的存储

    • TL;博士

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

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

      守护程序是确保pod在集群的所有节点上运行的控制器。如果在集群中添加/删除节点,守护程序将自动添加/删除pod


      我已经详细介绍了部署、状态集和守护程序集之间的区别,以及如何使用这些资源部署示例应用程序

      StatefulSet和部署之间的区别


      StatefulSet相当于一个特殊的部署。StatefulSet中的每个pod都有一个稳定、唯一的网络标识符,可用于发现集群中的其他成员。如果StatefulSet的名称为Kafka,则第一个pod称为Kafka-0,第二个称为Kafka-1,依此类推;StatefulSet控制的pod副本的启动和停止顺序受到控制。当第N个吊舱运行时,前N-1个吊舱已经运行且处于就绪良好状态;状态集中的pod使用稳定的持久存储卷,由PV或PVC实现。删除pod时,默认不删除与StatefulSet关联的存储卷(为了数据安全);StatefulSet绑定到PV卷。用于存储pod状态数据,也与声明属于该无头服务的无头服务一起使用

      我还可以将部署的POD与持久卷声明连接起来,这样就安全了。@TorstenBronger我同意-在这一点上,我们回到了最初的问题,即状态集的意义是什么?@HDave与动态持久卷和快速发展的存储提供程序(如Portworx、OpenEBS),数据持久性问题可以解决,但命名和启动/升级顺序与statefulset仍然不同,允许需要主/从或其他设置的应用程序正确组成集群。尽管我确实同意,也许所有这些都可以折叠成一个
      部署
      配置,并使用一个简单的规范来设置每个节点1个(守护程序)、副本或有状态排序。重要的是要认识到“启动/升级顺序”是关于Pod副本(即1、2、3…),而不是不同的Pod(即web、srv、db等)。换句话说,它并不是docker compose依赖项的替代品。为了跟进您的评论,在我看来,两者之间的区别在于,一个可以指定特定于pod的存储(从而持久化特定于pod的存储)