【Kubernetes】

【k8s学习】Kubernetes StatefulSet介绍

2022-06-22  本文已影响0人  伊丽莎白2015

【本文目标】

【前置文章】


1. StatefulSet介绍

官网:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/statefulset/

StatefulSet组件是用来管理stateful applications的(有状态的应用),如:MySQL,elasticsearch,mongoDB等。或者别的需要存储数据的应用。

对应的stateless applications即无状态的应用,比如普通的前端UI项目或是后台java项目(自身不存储数据)。

2. Deployment vs. StatefulSet

StatefulSet组件和Deployment组件都可以使用Storage

具体来说,假设我们需要部署my-app项目(目标3个Pod),以及数据库mysql(目标也是3个Pod)。

2.1 Deployment

对于my-app Pod,我们会写一个Deployment的yaml配置文件,在里面配上ReplicaSet=3,表示需要创建3个Pod,以及my-app Container的镜像,用来创建Pod时用。创建出来的my-app会是:

2.2 StatefulSet

而对于mysql Pod,会使用StatefulSet组件来创建:

2.2.1 Pod Identity(Pod标志)

听上去很绕,以及有状态的服务为啥需要额外的Pod Identity呢?
主要原因是如下的架构,会导致数据的不一致,多个Pod,都有读写,数据就会变的不同步。

未命名文件 (5).png

通常情况下,只会有一台负责写,负责写的这台叫MASTER,其余的叫WORKER

未命名文件 (6).png

这也是为什么会就StatefulSet创建的Pod并不是完全相同的Pod,因为只有一台是Master。

【整个过程】
Master修改了数据 --> 所有的Worker感知到了数据的变动,开始修改自己的pv --> 这时候要是新加入一个Pod,叫mysql-3,它会创建自己的Storage,然后会先从它顺序的前一个的Pod中clone数据。 --> mysql-3完成了clone数据后,也会开始监听数据的改动,以便及时更新到它自己的Storage中

Pod state
有状态的服务,它的Storage存放的不仅是Pod的数据,还会存Pod的状态,如它所连的Pod是Master Pod还是Worker Pod等。当这个Storage所连的Pod挂了,如上述说的,并不是新起一个Pod,Pod标志什么的都变了,而是新起的这个Pod会替换掉原来的Pod,即Pod Identity都不会变,这时候之前的Storage会re-attached(重新连接)上这个Pod,这样就可以避免新起的Pod上来就先clone数据。--> 当然这里需要使用的是Remote storage!因为Local storage可能会跟随着旧的Node一起挂掉。

Pod endpoints
有服务状态的Service会有自己的DNS name,名字格式:${pod name}.${governing service domain},如mysql-0.svc2mysql-1.svc2mysql-2.svc2
这意味着如果Pod重启了,那么IP地址可以变了,但是name以及endpoint不会变。

3. 总结

关于有状态服务的部署,并没有像无状态服务部署来的容易。需要额外做很多事:


参考:
https://www.youtube.com/watch?v=X48VuDVv0do

上一篇 下一篇

猜你喜欢

热点阅读