本文主要分析replicaset-controller的源码逻辑,replicas对象创建主要是由deployment-controller中封装。而replicas是pod的维护控制器。可以把replicas理解为deployment中的版本控制器,该控制器封装每次版本的pod对象。
1. startReplicaSetController
startReplicaSetController函数是ReplicaSetController的入口函数。基本的操作即new controller对象,然后起一个goroutine运行run函数。
1 | func startReplicaSetController(ctx context.Context, controllerContext ControllerContext) (controller.Interface, bool, error) { |
2. NewReplicaSetController
NewReplicaSetController初始化controller对象,最终通过NewBaseController实现具体的初始化操作。
1 | // NewReplicaSetController configures a replica set controller with the specified event recorder |
2.1. NewBaseController
NewBaseController是一个常见的k8s controller构建函数,主要包括以下几个部分:
- 初始化常用client,包括kube client
- 添加event handler对象。
- 添加informer索引。
- 添加informer syncCache的函数,在处理controller逻辑前先同步一下etcd的数据到本地cache。
- 赋值syncHandler函数,是具体实现controller逻辑的函数。
1 | func NewBaseController(logger klog.Logger, rsInformer appsinformers.ReplicaSetInformer, podInformer coreinformers.PodInformer, kubeClient clientset.Interface, burstReplicas int, |
3. Run
Run
函数仍然是k8s controller的代码风格。主要包含了以下几个部分。
- 同步本地cache内容
- 运行多个不退出的goroutine处理控制器逻辑。
1 | func (rsc *ReplicaSetController) Run(ctx context.Context, workers int) { |
3.1. processNextWorkItem
processNextWorkItemz
主要运行syncHandler函数,和对返回的错误进行处理。
- 如果错误为空,则不再入队。
- 如果错误不为空,则入队重新处理。
1 | func (rsc *ReplicaSetController) worker(ctx context.Context) { |
4. syncReplicaSet
syncReplicaSet
是syncHandler的具体实现,常见的syncHandler的实现包含以下几个部分
- 获取集群中的controller对象,例如 rs。
- 获取该controller对象及其子对象的当前状态。
- 对比当前状态与预期状态是否一致。
- 更新当前状态,以上循环直到当前状态达到期望状态。
1 | func (rsc *ReplicaSetController) syncReplicaSet(ctx context.Context, key string) error { |
5. manageReplicas
manageReplicas
主要实现pod的创建和删除,从而保证当前rs下的pod跟预期的一致。
1 | func (rsc *ReplicaSetController) manageReplicas(ctx context.Context, filteredPods []*v1.Pod, rs *apps.ReplicaSet) error { |
总结
replicaset-controller的代码逻辑相对简单,基本的代码风格是k8s控制器通用的代码逻辑,由于k8s的代码风格高度一致,因此如果读清楚一类controller的控制逻辑。其他的控制器的代码逻辑大同小异。
参考:
赞赏一下