Kubernetes部署与StatefulSets


110

我已经在Kubernetes上进行了很多挖掘工作,并且我喜欢我看到的很多东西!我一直无法弄清楚的一件事是Deployment资源和StatefulSet资源之间的确切区别是什么,以及您将在哪种方案中使用每种方案(或者通常首选一种方案)。

人们可以分享的任何经验都很棒!!

Answers:


113

部署和ReplicationController用于无状态使用,并且非常轻巧。当状态必须持久时使用StatefulSets。因此,后者volumeClaimTemplates对持久性卷使用/声明以确保它们可以在组件重新启动之间保持状态。

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

如果您的应用程序是无状态的,或者在启动过程中可以从后端系统建立状态,请使用Deployments。

有关运行有状态应用程序的更多详细信息,请参见2016 kubernetes关于有状态应用程序的博客条目。


16
我还可以将部署的Pod与持久的批量声明连接在一起,并且很安全。
Torsten Bronger

9
@TorstenBronger我同意-在这一点上,我们回到最初的问题是StatefulSets的意义是什么?
HDave

6
@HDave通过动态持久卷和快速发展的存储提供程序(例如Portworx,OpenEBS),可以解决数据持久性问题,但是StatefulSets的命名和启动/升级顺序仍然不同,从而允许需要主/从或其他设置的应用程序正确地形成一个集群。尽管我确实同意,也许所有这些都可以通过deployment简单的规范折叠到单个配置中,以设置每个节点1个(守护程序),副本或有状态排序。
Mani Gandham '17

4
重要的是要意识到“启动/升级顺序”是关于Pod副本(即1、2、3 ...)的,而不是关于不同的Pod(即Web,srv,db等)。换句话说,它不能代替docker-compose依赖关系。
HDave

72
  • 部署-您指定所有Pod副本共享的PersistentVolumeClaim。换句话说,共享量。

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

  • StatefulSet-您指定一个volumeClaimTemplates,以便每个副本容器获得 与之关联的唯一PersistentVolumeClaim。换句话说,没有共享卷。

    在这里,后备存储可以具有ReadWriteOnce accessMode。

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


23

TL; DR

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

Statefulsets用于有状态应用程序,吊舱的每个副本将具有其自己的状态,并且将使用其自己的卷。

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

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


4
为了跟进您的评论,在我看来,两者之间的区别是,一个可以指定特定于Pod的存储(从而保持特定于Pod的状态),而另一个则不可以(因此只能持久化服务) -全州)。从这个意义上讲,在服务级别上,两者都可以视为有状态的。但是在pod级别上,只有Statefulsets是有状态的。
刺伤

14

有状态集

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

有状态的分布式应用程序有两种:Master-Master和Master-Slave。主-主配置中的所有节点和主-从配置中的从节点都可以使用StatefulSet。
示例:
Hadoop集群中的
Master- Slave-> Datanodes(从属服务器)Master-Master-Cassandra集群中的Database Nodes(主-主机)

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

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

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

部署方式

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


7

StatefulSet和部署之间的区别

StatefulSet等效于特殊部署。StatefulSet中的每个Pod都有一个稳定的唯一网络标识符,可用于发现集群中的其他成员。如果StatefulSet的名称是Kafka,则第一个容器称为Kafka-0,第二个容器称为Kafka-1,依此类推;控制由StatefulSet控制的pod副本的开始和停止顺序。当第n个Pod运行时,第一个N-1 Pod已在运行并处于“良好”状态;StatefulSet中的pod使用由PV或PVC实现的稳定的持久存储卷。删除容器时,默认情况下不会删除与StatefulSet关联的存储卷(出于数据安全性);StatefulSet必须绑定到PV体积。用于存储Pod状态数据,还与声明属于该无头服务的无头服务一起使用;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.