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