首页/云/Kubernetes 速查/StatefulSet 更新策略(含 partition 灰度)

StatefulSet 更新策略(含 partition 灰度)

RollingUpdate 默认按序号从大到小逐个逆序更新并在每一步等待就绪;partition 可只更新序号 ≥ 分区的 Pod,实现灰度/预热。

Kubernetes 速查云更新于 2026-10-13

StatefulSet 怎么更新

StatefulSet 默认采用逆序滚动更新:从序号最大的副本开始,逐个替换,并且必须等当前副本就绪后才继续下一个。这样有状态服务在更新期间不会同时失去多个实例。updateStrategy 里的 partition 可以把更新范围限制在序号不低于某个值的副本上,让改动先落到高序号实例上观察。

基本信息

两种策略RollingUpdate(默认)与 OnDelete
更新顺序序号从大到小逐个进行
灰度字段updateStrategy.rollingUpdate.partition
推进条件当前副本就绪后才处理下一个
失败行为停在该序号不再推进,不会自动回滚

典型使用场景

  • 数据库集群先把最后一个副本升级,验证兼容性后再滚动全量
  • 需要人工确认窗口的服务用 OnDelete,手动删除副本才触发更新
  • 镜像或配置改动影响面大,先在非主节点序号上试运行
  • 配合就绪探针确保新版本真正可用,避免带病推进
  • 回滚同样逆序执行,把影响控制在单个副本内

更新策略与灰度配置

更新策略与灰度配置
spec:
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      partition: 2      # 只更新序号 >= 2 的 Pod

操作与观察

操作与观察
kubectl patch sts/db -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":2}}}}'
kubectl rollout status sts/db          # 观察推进到哪个序号
kubectl get pods -l app=db -o custom-columns='POD:.metadata.name,IMAGE:.spec.containers[0].image'
kubectl rollout undo sts/db            # 需要回滚时执行

参数与表现

配置含义注意点
RollingUpdate自动逆序滚动更新逐个等待就绪,整体耗时较长
partition: N只更新序号大于等于 N 的 Pod递减到 0 才算完成全量更新
OnDelete不自动更新,删除 Pod 才重建适合需要人工窗口的场景
rollout status查看更新进度卡住时先看该序号副本的就绪状态
灰度从高序号开始:先把分区设成比总副本数少一,只更新最后一个副本,验证通过后逐步下调分区值,直到设为零完成全量。
分区只约束控制器的自动更新,不会阻止你手动删除低序号 Pod。被删掉的实例会用新模板重建,灰度范围就被破坏了。

易错点

  • 以为更新失败会自动回滚:实际是停在当前序号不再推进,需要人工判断和处理
  • 灰度期间随意重启低序号实例:该实例按新模板重建,等于提前把改动推给主节点
  • 没有就绪探针:控制器无法判断新副本是否可用,可能带着故障继续推进更新
  • 回滚时忽略顺序:逆序是更新规则,回滚同样要逐个观察,不能一次性全部删除

数据来源与参考

  • Kubernetes 官方文档 · StatefulSet(Update Strategies)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌