Kubernetes Deployments与StatefulSets

时间:2017-01-11 05:57:28

标签: kubernetes

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

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

5 个答案:

答案 0 :(得分:60)

Deployments和ReplicationControllers适用于无状态使用,而且非常轻量级。在必须保持状态时使用StatefulSets。因此,后者在持久卷上使用volumeClaimTemplates / claim来确保它们可以在组件重新启动时保持状态。

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

如果您的应用程序是无状态的,或者在开始时可以从后端系统构建状态,那么请使用部署。

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

答案 1 :(得分:17)

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

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

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

    此处,后备存储可以具有 ReadWriteOnce accessMode。

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

答案 2 :(得分:5)

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

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

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

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

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

答案 3 :(得分:3)

StatefulSet与部署之间的区别

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

答案 4 :(得分:0)

TL; DR

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

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

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

我已经撰写了有关Deployment,StatefulSet和Daemonset之间的详细区别,以及如何使用这些资源K8s: Deployments vs StatefulSets vs DaemonSets来部署示例应用程序的文章。