对于数据存储类应用,它的多个实例,往往都会在本地磁盘保存一份数据。
导致这些实例一旦被杀掉,即便重建出来,实例与数据之间的对应关系也已经丢失,从而导致应用创建失败。
这种实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,称为“有状态应用”。
二、StatefulSet 1. 抽象
StatefulSet将应用状态抽象成了两种情况:
- 拓扑状态。应用实例必须按照某种顺序启动。新创建的Pod必须和原来Pod的网络标识一样
- 存储状态。应用的多个实例分别绑定了不同存储数据。
2. 特点
- 稳定的、唯一的网络标识(Pod可以固定IP)。
- 稳定的、持久的存储。
- 有序的、优雅的部署和伸缩。
- 有序的、优雅的删除和停止。
- 有序的、自动的滚动更新。
首先,StatefulSet的控制器直接管理的是Pod。
其次,Kubernetes通过Headless Serrvice,为那些有编号的Pod,在DNS服务器中生成带有同样编号的DNS记录。只要StatefulSet能够保证这些Pod名字中的编号不变,那么Service中类似于web-0.nginx.default.svc.cluster.clocal这样的DNS记录也不会变,这条记录解析出来的Pod的IP地址,随着后端Pod的删除和创建而自动更新。
最后,StatefulSet还会为每一个Pod分配并创建一个同样编号的PVC。这样,kubernetes就可以通过Persistent Volume机制为这个PVC绑定对应的PV,从而保证每一个Pod都拥有一个独立的Volume。
三、StatefulSet和Deployment的区别
“Deployment用于部署无状态服务,StatefulSet用来部署有状态服务”。
四、存储工作原理
当我们进入上述创建的Pod,在/usr/share/nginx/html中写入内容,即使Pod被删除重建,Volume中的内容仍不会丢失。
这是怎么做到的?
StatefulSet控制器恢复Pod的过程分析:
- 首先,当你把一个Pod,比如web-0删除之后,这个Pod对应的PV和PVC并不会被删除,而这个Volume中写入的数据,也依然存储在远程存储服务中。
- 此时,StatefulSet控制器发现,一个名叫web-0的Pod消失了。所以控制器会重新创建一个新的、名字还是叫做web-0的Pod,来进行调谐。
- 并且这个新Pod对象的定义中,它声明使用的PVC的名字,仍是www-web-0。所以这个新的web-0 Pod被创建出来之后,Kubernetes为它查找名叫www-web-0的PVC时,就会将旧Pod遗留的PVC,进而找到和这个PVC绑定在一起的PV
https://www.jianshu.com/p/71c1556b64db