每个实例都是不可替代的个体.
10.2.1 对比 Statefulset 和 ReplicaSet
通过宠物与牛的类比来理解有状态
- 宠物: 有状态的应用
- 牛: 无状态的应用
Statefulset 与 ReplicaSet 或 ReplicationController 的对比
- ReplicaSet 或 ReplicationController: 像牛
- Statefulset 保证 pod 在重新调度后保留它们的标识和状态
- 名称
- 网络标识
- 状态
10.2.2 提供稳定的网络标识
名称等信息有顺序的编号:

控制服务介绍
- 通过主机名定位 pod
- 通过 SRV 记录发现一个 Statefulset 中的所有成员
替换消失的宠物
- 重启失效的 pod, 新 pod 有完全一致的名称和主机名
- 即使新的 pod 被调度到一个不同的节点, 同样可以通过主机名来访问

扩缩容 Statefulset
- 扩容, 索引+1
- 缩容, 删除具有最大索引的 pod
- 缩容不会很迅速
- 有实例不健康的情况下是不允许做缩容操作的

10.2.3 为每个有状态实例提供稳定的专属存储
在 pod 模板中添加卷声明模板
不行就加抽象层.

pv 可以通过两种方式创建:
- admin 提前创建
- 第6章, 持久卷的动态供应机制
持久卷的创建和删除
删除持久卷声明会删除对应的持久卷, StatefulSet 在缩容时不会删除持久卷声明, 所以数据得以保留.
重新挂载持久卷声明到相同 pod 的新实例上
先缩容后扩容, 新的 pod 实例会使用绑定在持久卷上的相同声明和其上的数据.
- 状态与之前完全一致

10.2.4 Statefulset 的保障
稳定标识和独立存储的影响
如果创建一个完全一致的 pod, 那么这两个 pod 会同时写相同文件.
介绍 Statefulset 的 at-most-one 的语义
Statefulset 必须在确认一个 pod 不再运行后, 才去创建新的 pod.
