Deployment和Statefulset区别
Deployment
适合场景
无状态的应用
特点
1.pod之间没有顺序
2.所有pod共享存储
3.pod名字包含随机数字
4.service都有ClusterIP,可以负载均衡
StatefulSet
适合场景
有状态的应用
特点
1.部署、扩展、更新、删除都要有顺序
2.每个pod都有自己存储,所以都用volumeClaimTemplates,为每个pod都生成一个自己的存储,保存自己的状态
3.pod名字始终是固定的
4.service没有ClusterIP,是headlessservice,所以无法负载均衡,返回的都是pod名,所以pod名字都必须固定,StatefulSet在Headless Service的基础上又为StatefulSet控制的每个Pod副本创建了一个DNS域名:$(podname).(headless server name).namespace.svc.cluster.local
链接
[官方StatefulSet定义](K8s -- StatefulSet)
什么是有状态应用?
在Kubernetes中,StatefulSet用于管理有状态的应用。有状态的应用是指具有持久性数据或内部状态的应用程序,其中数据或状态的持久性对应用程序的正确运行至关重要。
举个例子来说明什么是有状态的应用:
数据库:数据库服务器(如MySQL、PostgreSQL)是一个典型的有状态的应用。它们存储和处理大量持久化数据,并依赖于数据的一致性和可靠性。每个数据库实例都有自己的标识和状态,需要保证数据的持久性和有序性。
消息队列:消息队列系统(如RabbitMQ、Apache Kafka)也是有状态的应用。它们用于异步处理和传递消息,确保消息的顺序和一致性。这些应用通常需要维护内部的队列和状态信息,以确保可靠的消息传递。
缓存服务:缓存服务(如Redis、Memcached)也属于有状态的应用。它们存储内存中的数据以提供高速读取和写入操作,通常用作数据库查询的缓存层。这些应用需要维护缓存的状态并确保数据的持久性。
有状态的应用与无状态的应用(例如Web服务器、应用程序前端等)不同,无状态应用通常只处理请求并返回响应,不需要维护持久化数据或状态信息。
使用StatefulSet来管理有状态的应用可以提供以下好处:
稳定的网络标识:每个有状态应用实例(Pod)都具有唯一的网络标识和稳定的主机名,这使得应用能够保持与其他实例的连接和通信。
顺序部署和扩展:StatefulSet可按照定义的顺序逐个部署和扩展有状态应用的实例。这在某些场景下非常重要,例如数据库集群中的主从复制、分布式存储系统中的数据同步等。
持久化存储:StatefulSet可配合PersistentVolumeClaim(PVC)使用持久化存储来确保有状态应用数据的持久性,并允许数据在Pod重新启动或重新调度后仍然可用。
总之,有状态的应用是指那些具有持久化数据或内部状态的应用程序,例如数据库、消息队列和缓存服务。StatefulSet是Kubernetes中用于管理这类应用的控制器,提供了有状态应用部署、扩展和持久化存储等功能。