StatefulSet 是有状态的聚集,管理有状态的服务,它所管理的 Pod 的名称不能随意变革。数据持久化的目录也是不一样,每一个 Pod 都有本身独有的数据持久化存储目录。比如 MySQL 主从、redis 集群等。
让每个Pod独立的
让每个Pod独立的,保持Pod启动次序和唯一性
唯一的网络标识符,持久存储
有序,比如mysql中的主从
适合StatefulSet的业务包括数据库服务 MySQL 和 PostgreSQL,集群化管理服务Zookeeper、etcd等有状态服务
StatefulSet的另一种典范应用场景是作为一种比普通容器更稳定可靠的模拟虚拟机的机制。传统的虚拟机正是一种有状态的宠物,运维人员需要不断地维护它,容器刚开始流行时,我们用容器来模拟虚拟机使用,所有状态都保存在容器里,而这已被证明是非常不安全、不可靠的。
使用StatefulSet,Pod仍然可以通过漂移到差别节点提供高可用,而存储也可以通过外挂的存储来提供高可靠性,StatefulSet做的只是将确定的Pod与确定的存储关联起来保证状态的连续性。
无状态服务?
RC、Deployment、DaemonSet 都是管理无状态的服务,它们所管理的 Pod 的 IP、名字,启停次序等都是随机的。个体对团体无影响,所有 pod 都是共用一个数据卷的,摆设的 tomcat 就是无状态的服务,tomcat 被删除,在启动一个新的 tomcat,到场到集群即可,跟 tomcat 的名字无关。
以为Pod都是一样的
没有次序要求
不考虑应用在哪个node上运行
可以大概举行随意伸缩和扩展
StatefulSet 由以下几个部门组成:
1.Headless Service:用来定义 pod 网路标识,生成可剖析的 DNS 记录
2.volumeClaimTemplates:存储卷申请模板,创建 pvc,指定 pvc 名称巨细,主动创建 pvc,且 pvc 由存储类供应。
3.StatefulSet:管理 pod 的
什么是 Headless service
Headless service 不分配 clusterIP,headless service 可以通过剖析 service 的 DNS,返回所有 Pod 的 dns 和 ip 地点 (statefulSet 摆设的 Pod 才有 DNS),普通的 service,只能通过剖析 service 的 DNS 返回 service 的 ClusterIP。
为什么要用 headless service(没有 service ip 的 service)?
在使用 Deployment 时,创建的 Pod 名称是没有次序的,是随机字符串,在用 statefulset 管理 pod 时要求 pod 名称必须是有序的 ,每一个 pod 不能被随意代替,pod 重建后 pod 名称还是一样的。因为 pod IP 是变革的,以是要用 Pod 名称来辨认。pod 名称是 pod 唯一性的标识符, 必须持久稳定有用。这时间要用到无头服务,它可以给每个 Pod 一个唯一的名称。
对于有状态应用都会用到持久化存储,比如 mysql 主从,由于主从数据库的数据是不能存放在一个目录下的,每个 mysql 节点都需要有本身独立的存储空间。而在 deployment 中创建的存储卷是一个共享的存储卷,多个 pod 使用同一个存储卷,它们数据是同步的,而 statefulset 定义中的每一个 pod 都不能使用同一个存储卷,这就需要使用 volumeClainTemplate,当在使用statefulset 创建 pod 时,volumeClainTemplate 会主动生成一个 PVC,从而请求绑定一个PV,每一个 pod 都有本身专用的存储卷。Pod、PVC 和 PV 对应的关系图如下:
Statefulset 资源清单文件编写本领
#查看定义 Statefulset 资源需要的字段
[root@k8smaster ~]# kubectl explain statefulset
KIND: StatefulSet
VERSION: apps/v1
DESCRIPTION:
StatefulSet represents a set of pods with consistent identities. Identities
are defined as: - Network: A single stable DNS and hostname. - Storage: As
many VolumeClaims as requested. The StatefulSet guarantees that a given
network identity will always map to the same storage identity.
FIELDS:
apiVersion <string> #定义 statefulset 资源需要使用的 api 版本