滚动升级时一种平滑过渡的升级方式,采用的是逐步替换的策略从而保证服务的稳定性,在升级时如果发现问题可以及时回滚、调整问题,尽量让问题不会扩大。我们经常使用Kubernetes的两种资源对象Deployment和DaemonSet的滚动升级,本篇来看一下StatefulSet的滚动升级。
Kubernetes 1.7开始支持StatefulSet的滚动升级,在1.7中这个功能还处于beta状态。从1.7开始支持设置OnDelete和RollingUpdate两种更新策略,可以通过.spec.updateStrategy.type指定。
- OnDelete: 该策略表示当更新了StatefulSet的模板后,只有手动删除旧的StatefulSet Pod才会创建新的StatefulSet Pod。这是默认的更新策略,兼容1.6及1.6以前的版本。
- RollingUpdate: 该策略表示当更新StatefulSet模板后会自动删除旧的StatefulSet Pod并创建新的StatefulSet Pod。注意StatefulSet的Pod在部署时是顺序从0
n的,而在滚动更新时,这些Pod则是按逆序的方式即n0一次删除并创建。
另外SatefulSet的滚动升级还支持Partitions的特性。Partitions通过.spec.updateStrategy.rollingUpdate.partition。
在设置partition后,SatefulSet的Pod中序号大于或等于partition的Pod会在StatefulSet的模板更新后进行滚动升级,而其余的Pod保持不变。
kubectl apply -f rabbitmq.statefulset.yaml
kubectl get po -lapp=rabbitmq -w
NAME READY STATUS RESTARTS AGE
rabbitmq-0 1/1 Running 0 12m
rabbitmq-1 1/1 Running 0 12m
rabbitmq-2 0/1 ContainerCreating 0 21s
rabbitmq-2 1/1 Running 0 12m