K8s工作负载-StatefulSet
K8s工作负载-StatefulSet
基于1.25
什么是StatefulSet
StatefulSet负责管理有状态应用,缩写sts
- 要求管理的Pod具有稳定的网络标识符和存储卷,实现又状态应用的数据持久化和数据访问
- 管理Pod,会对Pod有一个按照顺序增大的ID
使用场景
- 具有稳定、唯一的网络标识符(DNS Name)
- 每个Pod是中对应各自的存储路径(PersistVolumeClaimTempleate)
- 按照顺序增加副本、减少副本,并且在减少副本的时执行清理
- 按照顺序执行滚动更新
限制
- Pod存储的要么由Storage Class的PVC提供,要么事先创建
- 删除或缩容一个StatefulSet不会删除对应的数据卷,确保数据安全
- 在删除StatefulSet,无法确保Pod的终止的正常的
- 如果需要,需要使用优雅的终止,需要先Scale Down到0
- 在使用默认的Pod Management Policy(OraderReady)进行滚动更新,可能会进入到错误状态,需要人工介入
⚠️:不要时强制删除StatefulSet管理的Pod,本身机制,只会最多提供一个对外访问。
强制删除,可能出现超过一个Pod对外提供
StatefulSetSpec
// A StatefulSetSpec is the specification of a StatefulSet. |
Pod管理策略
- OrderedReady:默认值
- 创建副本数为N的StatefulSet,Pod按照(0,1…N-1)顺序依次创建
- 删除副本数为N的StatefulSet,Pod按照(N-1…0)顺序依次删除
- 在对StatefulSet进行扩容操作,新增Pod所有前序Pod必须是Running或者Ready状态
- 终止或者删除Pod,后序所有Pod必须终止
- Paralled:创建或者终止所有Pod
Pod更新策略
提供了俩种更新策略
- OnDelete:更新,不会销毁任何Pod,只有手动删除一个Pod或者STS对象的时候,才会按照新的定义创建Pod
- 会更新所有的Pod
- 网络标识符不会变
- RollingUpdate:逐步更新Pod,默认更新策略(更新速度慢一点)
- 从次序大Pod,逐个更新Pod,至到最小的Pod被更新
- 正在更新的Pod进入Running或者Ready,才继续更新前面一个Pod
- 每一个Pod网络标识符可能会变化
⚠️使用默认管理策略OrderedReady,可能进入卡住
- 更新Pod的Template,导致某一个Pod一致无法启动
- STS停止滚动更新
- 需要删除所有的使用有问题的tamplate的Pod
RollingUpdate参数
// RollingUpdateStatefulSetStrategy is used to communicate parameter for RollingUpdateStatefulSetStrategyType. |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joohwan!
评论