Deployment控制器
2025-09-15 17:43:04 6 举报
K8s Deployment控制器核心逻辑
作者其他创作
大纲/内容
开始
声明适配ReplicaSet(ClaimReplicasSet)
使用Deployment的selector匹配
设置OwnerReference
如果Deployment已经删除(DeletionTimestamp != null),只同步状态
<font color="#e74f4c"><b>【扩容操作】</b></font>如果同步暂停(IsPause),或者正在扩容(isScalingEvent),将做以下操作:
如果只有一个RS(单RS): 直接调整成预期数量
如果发生RollingUpdate:将按照等比扩容,或者缩容(但是非事务性的)
<b><font color="#e74f4c">【回滚】</font></b>如果是回滚(isRollback),将做以下操作:
如果指定了Revision,找到遍历RS列表,找到对应的RS版本,将template内容CopyToDeployment
如果未指定Revision(=0),找到上一个RS版本,将template内容CopyToDeployment
<font color="#e74f4c"><b>【RollingUpdate升级】</b></font>如果配置的升级策略是RollingUpdate,将做以下操作:
<b style=""><font color="#314aa4">【创建或更新RS】</font></b>
<font color="#e74f4c"><b>【创建空RS】</b></font>根据Deployment的Template找RS,如果找不到则视为需要创建新版本
复制Deployment的Label到新RS(额外加新hash)
复制Deployment的LabelSelector到新RS(额外加新hash)
命名新RS为:{deployment-name}_{新hash}
设置新RS的OwnerReference为当前Deployment
<b>【<font color="#e74f4c">更新已有RS】</font></b>如果根据Hash找到已有新版本的RS,则按需更新
如果有Deployment的Annotation有变化,更新到RS中(更新RS的anno并不会导致底层的pod重启)
<font color="#e74f4c"><b>【尽可能扩容】</b></font>
如果最新RS的Replicas = Deployment.spec.replicas,则结束
如果最新RS的Replicas > Deployment.spec.replicas,则直接缩容到目标数量
RS扩容数量 = 尽可能扩容到Deployment的maxSurge(Deployment.replicas * maxSurge - nowPodsCount)
<font color="#e74f4c"><b>【尽可能缩容】</b></font>
如果OldRS的Replicas数量总和为0,则结束
最大旧版本可缩容数量 = 所有RS得Replicas总和 - 最大可用数量 - 新版本RS不可用数量
缩容旧版本时:
优先缩容旧版本RS中不可用Pod
再根据RS CreationTimestamp 顺序缩容RS
【Recreate升级】如果配置的策略是ReCreate,发现新版本后,将做以下操作:缩容旧版本时:
删除所有OldRs
等待oldRs的Pod删除完毕
<font color="#314aa4" style="font-weight: bold;">【创建或更新RS】</font><font color="#000000" style="">直接更新到Deployment最大副本数</font>
0 条评论
下一页