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 加速扩缩,但依赖序号语义的集群必须保持有序。