Kubernetes Deployments与StatefulSets

SS7*_*781 72 kubernetes

我一直在挖掘Kubernetes,我很喜欢我看到的东西!我无法清楚地了解的一件事是Deployment和StatefulSet资源之间的确切区别是什么,以及您在哪些场景中使用它们(或者通常优先于另一个).

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

pag*_*gid 75

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

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

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

有关运行有状态应用程序的更多详细信息,请参阅2016 kubernetes关于有状态应用程序的博客文章

  • 我还可以将部署的pod与持久的卷声明连接起来并且是安全的. (7认同)
  • @HDave随着动态持久性卷和快速开发的存储提供商(如Portworx,OpenEBS),数据持久性问题可以解决,但命名和启动/升级顺序仍然与StatefulSets不同,允许需要主/从或其他设置的应用程序正确组成一个集群.虽然我确实同意所有这些可以折叠成一个`deployment`配置,并带有一个简单的规范来设置每节点1(守护进程),副本或有状态排序. (5认同)
  • @TorstenBronger我同意-在这一点上,我们回到最初的问题是StatefulSets的意义是什么? (3认同)
  • 重要的是要意识到"启动/升级顺序"是关于Pod复制品(即1,2,3 ......) - 不同的pod(即web,srv,db等).换句话说,它不是替代docker-compose依赖项. (3认同)
  • [不错的中等文章](https://medium.com/stakater/k8s-deployments-vs-statefulsets-vs-daemonsets-60582f0c62d4) (2认同)

Emm*_*osu 36

  • 部署 - 指定由所有pod副本共享的PersistentVolumeClaim.换句话说,共享卷.

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

  • StatefulSet - 指定volumeClaimTemplates,以便每个副本pod获得 与其关联的唯一PersistentVolumeClaim.换句话说,没有共享卷.

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

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


小智 10

StatefulSet 和部署的区别

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


Anu*_*rag 7

将"StatefulSet"与分布式应用程序一起使用,该应用程序要求每个节点都具有持久状态,并且能够通过配置配置任意数量的节点(replicas ='X').

主 - 主配置中的所有节点和主从配置中的从节点都可以使用StatefulSet和Service.主节点(如master,master-secondary)可以是具有一些持久卷的Pod以及Service,因为这些节点无需向上或向下扩展.它们也可以是具有副本= 1的StatefulSet.

StatefulSet的示例包括:
- Hadoop集群中的数据
节点(从节点)(主从) - Cassandra集群中的数据库节点(主节点)

StatefulSet中的每个Pod(副本)具有
- 独特且稳定的网络标识
--Kubernetes为每个VolumeClaimTemplate创建一个PersistentVolume
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

另一方面,"部署"适用于无状态应用程序/服务,其中节点不需要任何特殊标识(负载平衡器可以到达它选择的任何节点),并且节点数可以是任意数量.


Ali*_*oot 7

TL; DR

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

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

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

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

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