1)概述
replicaset对象描述一个[ 特定版本 ]的[ 应用 ],控制着pod的属性(镜像、容器的环境变量等等)以及数量。
说明:
1)replicaset对象不控制pod对象的版本,针对的是同一个镜像的pod。
2)deployment对象控制的是replicaset对象,它才能描述一个应用,因为应用有版本之分。
2)大致原理
replicaset的控制器会监听kuberntes的pod对象、replicaset对象,这些被监听的对象之变动,就会触发syncLoop循环(叫做syncReplicaSet()方法)让kubernetes集群朝着replicaset对象描述的状态进行演进。
3)细节实现
控制器每一次执行回调方法syncReplicaSet(),都执行了以下操作:
1)根据入参字符串key,获取rs对象:
namespace, name, err := cache.SplitMetaNamespaceKey(key)
rs, err := rsc.rsLister.ReplicaSets(namespace).Get(name)
2)获得一个布尔值:检查是否需要真的执行同步pod数量的操作
rsNeedsSync := rsc.expectations.SatisfiedExpectations(key)
3)获取rs对象底下的pod,这个pod列表称为filteredPods:
allPods, err := rsc.podLister.Pods(rs.Namespace).List(labels.Everything())
filteredPods := controller.FilterActivePods(allPods)
filteredPods, err = rsc.claimPods(rs, selector, filteredPods)
4)根据rsNeedsSync的值决定是否同步pod的[ 数量 ]:实际创建Pod或删除pod:批量新建pod或删除pod
rsc.manageReplicas(filteredPods, rs)
5)更新rs对象的status字段
4)源码简易流程图
SatisfiedExpectations(此机制决定是否真的执行manageReplicas()方法)
|
|
∨
rs对象的变更或pod对象的变更 --> syncReplicaSet方法 --> manageReplicas(保持数量一致性:为rs创建pod或删除pod) --> 1.判断究竟是新建pod还是删除pod
2. 创建为rs对象创建一个expectations对象,并设置add值/del值
3.调用slowStartBatch()方法批量创建pod 或 删除经过筛选出的多余的pod
4.更新rs对象关联的expectations对象
|
|
∨
updateReplicaSetStatus(更新rs对象的status字段)