K8s-StatefulSet
2025-10-27 13:11:02 1 举报
K8s StatefulSet控制器逻辑
作者其他创作
大纲/内容
开始
获取StatefulSet(后续简称STS)查找Pods
根据STS的UID,匹配Pods
如果有孤儿(Orphaned),根据STS的label匹配查找所有孤儿Pods
声明适配Pods
给Pod添加本STS的OwnerReference
给Pod添加STS的selector一致的Label
【核心逻辑】更新STS
【找到STS新旧版本】添加并获取ControllerRevison(后续简称CR), CR中存储着STS核心Template信息,是备份。
根据STS的Label获取所有CR版本
获取UpdateRevison(新版本):
根据STS Template的hash值找到是否存在历史CR
如果存在,就用它当做UpdateRevision
如果不存在,根据最新的STS Template新建CR
获取CurrentRevision(旧版本):
根据STS本身的控制器hash找到对应的控制器
如果不存在,使用UpdateRevison当做CurrentRevision
【处理STS Pod】
【第一步】建设Pod数组:
首先:声明一个STS的replicas长度的空数组([len(sts.replicas)]*corev1.Pod)
其次:根据现有的Pod,计算编号,填充到数组中
最后:将空位置的数组填充新Pod
【新版本】如果是RollingUpdate,Pod序号小于partition的使用旧版本
【就版本】其他情况使用新版本
【第二步】扩容。顺序处理副本数内的Pods。按照序号递增处理Pod:
删除Pod:如果Pod是Fail或者Success,则删除Pod
创建Pod: 如果Pod未创建,则创建Pod
更新:
对于处于Pending中的Pod,会检查PVC是否创建,如果未创建,将创建PVC
对于处于Terminal,UnReady,UnAvailable的Pod,会检查是否设置了OrderedReady,如果是,则返回,等待其变成Available,这也是串行执行的精髓。
【第三步】缩容。也就是处理无用的Pods,Replicas长度之外的Pods构成了无用Pods数组,接下来要清理他们,从后向前清理
如果是Parallel:按照指数级递增并行删除。
如果是OrderReady:这里情况比较复杂,简单的结论是:尽可能按照序号倒序删除,只有当上一个删除完成后,才会删除下一个。
【第四步】RollingUpdate部署升级。从后向前,逐个删除低版本的Pod,直到Partition为止。只有等上一个Pod Available后,才会删除下一个。
0 条评论
下一页