k8s-statefulset (有状态负载)控制器

statefulset (有状态负载)控制器
有状态pod一般有以下几个特点

  1. 稳定且有唯一的标识符(pod名称作为标识符,必须稳定唯一且持久,pod被删除或重建后pod名称不会发生改变)
  2. 稳定且持久的存储
  3. 有序、平滑的部署和扩展(比如redis:应该先启动主节点再启动从节点)
  4. 有序、平滑的终止、删除(先终止从节点)
  5. 有序的滚动更新(先更新从节点)

三个组件:
1.headless service (无头service)
2.statefulset
3.volumeclaimTemlate (存储卷申请模板,每一个pod都会有一个自己专用的PV)

deployment 控制器创建的pod 是无序的
statefulset 创建的pod是有序的,这样就可以根据每个pod的标识符进行管理

k8s-statefulset (有状态负载)控制器
k8s-statefulset (有状态负载)控制器
volumeClaim
1.为每一个pod定义volumeClaim
2.在pod所在的名称空间创建pvc

可以看到PVC已创建并自动绑定到PV,且pod名称固定且唯一
k8s-statefulset (有状态负载)控制器
当pod删除后,PVC不会被删除,一旦PV与PVC绑定后,PV不支持删除,防止误删除。
当pod重建后,PVC与pod再次绑定,一 一对应关系,实现有状态负载
每个pod的名称唯一并且可以被解析
pod_name.service_name.ns_name.svc.cluster.loal //pod域名解析格式
k8s-statefulset (有状态负载)控制器
statefulset控制器的滚动更新与扩展

扩容
k8s-statefulset (有状态负载)控制器
可以看到有序的扩展3-4
k8s-statefulset (有状态负载)控制器
缩容
k8s-statefulset (有状态负载)控制器
可以看到是从后往前依次删除,此时PVC并不会被删除
k8s-statefulset (有状态负载)控制器
滚动升级
partition(分区): 》=N的被更新
这种方法可以用于做金丝雀发布

通过打补丁方式设置partition更新策略为4,也就是说当partition大于等于4的都被更新
k8s-statefulset (有状态负载)控制器
升级镜像为v2
k8s-statefulset (有状态负载)控制器
验证
kubectl get pods myapp-4 -o yaml
k8s-statefulset (有状态负载)控制器

kubectl get pods myapp-3 -o yaml
k8s-statefulset (有状态负载)控制器

一段时间后,确认全部发布

k8s-statefulset (有状态负载)控制器
k8s-statefulset (有状态负载)控制器
再次查看
kubectl get pods myapp-3 -o yaml
k8s-statefulset (有状态负载)控制器

上一篇:Kubernetes 部署Redis主从服务(StatefulSet)


下一篇:kubernetes常用控制器之StatefulSet