首页/开发/CI/CD 与发布速查/StatefulSet 滚动更新与 partition
发布策略60 条

StatefulSet 滚动更新与 partition

有状态工作负载按序号从大到小逐个更新;partition 字段只更新序号不小于该值的 Pod,用它实现有状态服务的单实例先行验证与分批放量。

CI/CD 与发布速查开发更新于 2026-10-13

StatefulSet 滚动更新是什么

StatefulSet 用于有状态工作负载:Pod 有稳定序号与身份,更新时按序号从大到小逐个替换,每个 Pod 就绪后才继续(默认 OrderedReady 语义)。partition 字段是它的发布控制器:只更新序号不小于该值的 Pod——把 partition 设为「副本数-1」时就只动末位实例,用它实现有状态服务的单实例先行验证与分批放量。验证通过后逐步下调 partition(3 → 2 → 1 → 0)直到全部更新;回滚则是把镜像改回旧版本触发反向滚动。

基本信息

更新顺序从高序号向低序号逐个替换
partition仅更新序号 >= partition 的 Pod
就绪约束默认 OrderedReady:每个 Pod 就绪后才继续
回滚镜像改回旧版本触发反向滚动

典型使用场景

  • 数据库集群(主从/分片):先替换从节点,验证复制正常后再动更关键角色。
  • 验证镜像与配置:末位实例先跑新版本,观察日志与同步延迟。
  • 分批放量:按业务低峰窗口逐次下调 partition。
  • 回滚演练:小幅分区更新后立即反向回滚,验证流程可用。
  • 版本兼容验证:新旧版本在集群内共存期间,确认协议与数据格式双兼容。

先更新一个实例

先更新一个实例
kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate","rollingUpdate":{"partition":3}}}}'
kubectl rollout status statefulset/web
# 验证通过后逐步下调 partition(3 → 2 → 1 → 0)

机制读法

机制作用注意
序号稳定身份与顺序依赖序号的拓扑不能乱序
partition圈定更新范围由高到低收敛
OrderedReady逐个就绪推进慢启动实例拖慢整体节奏
反向滚动回滚路径同样按序进行,耗时与发布相当
partition=副本数-1 时只动末位 Pod:观察主从同步与业务指标后再继续放量。
更新节奏受就绪判定影响:就绪探针不准会导致放量过快或过慢,先校准探针再启用分批。
删 StatefulSet 不会自动删 PVC:数据默认保留,想彻底清理要单独删相应 PVC,避免误删或误留存储费用。
podManagementPolicy 选 OrderedReady 才有顺序等待:互不依赖的副本集群可用 Parallel 加速扩缩,但依赖序号语义的集群必须保持有序。

易错点

  • partition 直接调 0:全部实例同时进入更新流程,模板问题会波及整组。
  • 依赖有序启动的集群(主从/分片)打断 OrderedReady 假设:乱序替换破坏一致性。
  • 就绪探针把「进程活着」当「服务可用」:复制未追上就继续更新下一个,故障蔓延。
  • 不演练回滚:反向滚动同样耗时,事故时才发现回滚窗口不可接受。
  • StatefulSet 与无状态服务混用:更新慢、成本高,能用 Deployment 的别用 StatefulSet。

数据来源与参考

  • Kubernetes 文档《StatefulSets》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌