滚动升级时一种平滑过渡的升级方式,采用的是逐步替换的策略从而保证服务的稳定性,在升级时如果发现问题可以及时回滚、调整问题,尽量让问题不会扩大。我们经常使用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则是按逆序的方式即n~0一次删除并创建。

另外SatefulSet的滚动升级还支持Partitions的特性。Partitions通过.spec.updateStrategy.rollingUpdate.partition。 在设置partition后,SatefulSet的Pod中序号大于或等于partition的Pod会在StatefulSet的模板更新后进行滚动升级,而其余的Pod保持不变。

1kubectl apply -f rabbitmq.statefulset.yaml
2
3kubectl get po -lapp=rabbitmq -w
4NAME      READY     STATUS              RESTARTS   	AGE
5rabbitmq-0     1/1       Running             0          12m
6rabbitmq-1     1/1       Running             0          12m
7rabbitmq-2     0/1       ContainerCreating   0          21s
8rabbitmq-2     1/1       Running   			  0         12m

参考