每个实例都是不可替代的个体.

10.2.1 对比 Statefulset 和 ReplicaSet

通过宠物与牛的类比来理解有状态

  • 宠物: 有状态的应用
  • 牛: 无状态的应用

Statefulset 与 ReplicaSet 或 ReplicationController 的对比

  • ReplicaSet 或 ReplicationController: 像牛
  • Statefulset 保证 pod 在重新调度后保留它们的标识和状态
    • 名称
    • 网络标识
    • 状态

10.2.2 提供稳定的网络标识

名称等信息有顺序的编号:

image.png

控制服务介绍

  • 通过主机名定位 pod
  • 通过 SRV 记录发现一个 Statefulset 中的所有成员

替换消失的宠物

  • 重启失效的 pod, 新 pod 有完全一致的名称和主机名
  • 即使新的 pod 被调度到一个不同的节点, 同样可以通过主机名来访问

image.png

扩缩容 Statefulset

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

image.png

10.2.3 为每个有状态实例提供稳定的专属存储

在 pod 模板中添加卷声明模板

不行就加抽象层.

image.png

pv 可以通过两种方式创建:

  • admin 提前创建
  • 第6章, 持久卷的动态供应机制

持久卷的创建和删除

删除持久卷声明会删除对应的持久卷, StatefulSet 在缩容时不会删除持久卷声明, 所以数据得以保留.

重新挂载持久卷声明到相同 pod 的新实例上

先缩容后扩容, 新的 pod 实例会使用绑定在持久卷上的相同声明和其上的数据.

  • 状态与之前完全一致

image.png

10.2.4 Statefulset 的保障

稳定标识和独立存储的影响

如果创建一个完全一致的 pod, 那么这两个 pod 会同时写相同文件.

介绍 Statefulset 的 at-most-one 的语义

Statefulset 必须在确认一个 pod 不再运行后, 才去创建新的 pod.