问题描述
我在开发环境和CI上有关于StatefulSet更新的简单问题。
我想立即替换所有StatefulSet副本,而不先使用Kubectl delete。 是否可以将清单更改为策略:替换为“部署”,然后继续使用kubectl apply ...
解决方法
当前StatefulSets仅支持两种update strategies:
-
RollingUpdate
:RollingUpdate
更新策略为StatefulSet中的Pod实现了自动的滚动更新。如果未指定.spec.updateStrategy
,这是默认策略。当StatefulSet的.spec.updateStrategy.type
设置为RollingUpdate
时,StatefulSet控制器将删除并重新创建StatefulSet中的每个Pod。它将以Pod终止的顺序进行(从最大顺序到最小顺序),一次更新每个Pod。它会等到更新的Pod运行并就绪后再更新其前身。 -
OnDelete
:OnDelete
更新策略实现了旧版(1.6及以前版本)行为。当StatefulSet的.spec.updateStrategy.type
设置为OnDelete
时,StatefulSet控制器将不会自动更新StatefulSet中的Pod。用户必须手动删除Pod,以使控制器创建新的Pod,以反映对StatefulSet的.spec.template
所做的修改。
但是,有一个实施MaxUnavailable Rolling Update to StatefulSet的计划。它将允许您基于maxUnavailble
策略一起更新X个副本。它导致了update proposal,但尚未完成,从最新评论来看,应该将其设置为Kubernetes 1.20的里程碑。