1. 一句话解释
OrderedReady 是 StatefulSet 的默认策略,意思是:"排队进场,一个接一个来,前一个准备好了,下一个才启动。"
2. 核心规则(3个要点)
- 按顺序创建 :先建
pod-0,等它 Ready(就绪);再建pod-1,等它 Ready;以此类推。 - 按逆序删除 :删的时候从最后一个开始(如
pod-2->pod-1->pod-0)。 - 严格依赖 :如果
pod-0没启动成功或没通过健康检查,pod-1绝对不会开始创建。
3. 为什么要用它?
为了安全。
很多有状态应用(如数据库 ZooKeeper、Etcd、MySQL主从)对启动顺序很敏感:
- 例子:必须先有"老大"(Master),其他的"小弟"(Slave)才能连上去同步数据。如果大家一起乱哄哄地启动,可能会导致数据混乱或选举失败。
4. 优缺点对比
全屏复制
| 特性 | OrderedReady (有序) | Parallel (并行) |
|---|---|---|
| 速度 | 慢(串行等待) | 快(同时启动) |
| 安全性 | 高(保证顺序) | 低(可能竞态冲突) |
| 适用场景 | 数据库、中间件集群 | 对顺序不敏感的有状态应用 |
5. 怎么配置?
默认情况(不用写也是它)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-db
spec:
# podManagementPolicy 默认为 OrderedReady
replicas: 3
...
显式声明(推荐,代码更清晰)
spec:
podManagementPolicy: OrderedReady # 明确指定有序策略
replicas: 3
...
6. 常见坑与排查
- 现象 :扩容卡住,只起了
pod-0,pod-1一直不出来。 - 原因 :
pod-0还没变绿(Ready)。可能是启动慢、报错、或者健康检查(Readiness Probe)没过。 - 解决 :
- 查日志:
kubectl logs my-db-0 - 查事件:
kubectl describe pod my-db-0 - 修复
pod-0的问题后,pod-1会自动接着启动。
- 查日志:
7. 总结建议
- 如果是 数据库、ZooKeeper、Kafka 等强依赖顺序的应用 用 OrderedReady。
- 如果是 普通有状态服务 ,且希望部署快一点 改用 Parallel。