statefulset (有状态负载)控制器
有状态pod一般有以下几个特点
- 稳定且有唯一的标识符(pod名称作为标识符,必须稳定唯一且持久,pod被删除或重建后pod名称不会发生改变)
- 稳定且持久的存储
- 有序、平滑的部署和扩展(比如redis:应该先启动主节点再启动从节点)
- 有序、平滑的终止、删除(先终止从节点)
- 有序的滚动更新(先更新从节点)
三个组件:
1.headless service (无头service)
2.statefulset
3.volumeclaimTemlate (存储卷申请模板,每一个pod都会有一个自己专用的PV)
deployment 控制器创建的pod 是无序的
statefulset 创建的pod是有序的,这样就可以根据每个pod的标识符进行管理
volumeClaim
1.为每一个pod定义volumeClaim
2.在pod所在的名称空间创建pvc
可以看到PVC已创建并自动绑定到PV,且pod名称固定且唯一
当pod删除后,PVC不会被删除,一旦PV与PVC绑定后,PV不支持删除,防止误删除。
当pod重建后,PVC与pod再次绑定,一 一对应关系,实现有状态负载
每个pod的名称唯一并且可以被解析
pod_name.service_name.ns_name.svc.cluster.loal //pod域名解析格式
statefulset控制器的滚动更新与扩展
扩容
可以看到有序的扩展3-4
缩容
可以看到是从后往前依次删除,此时PVC并不会被删除
滚动升级
partition(分区): 》=N的被更新
这种方法可以用于做金丝雀发布
通过打补丁方式设置partition更新策略为4,也就是说当partition大于等于4的都被更新
升级镜像为v2
验证
kubectl get pods myapp-4 -o yaml
kubectl get pods myapp-3 -o yaml
一段时间后,确认全部发布
再次查看
kubectl get pods myapp-3 -o yaml