本文主要分析DaemonSetController
的源码逻辑,daemonset是运行在指定节点上的服务,常用来作为agent类的服务来配置,也是k8s最常用的控制器之一。
1. startDaemonSetController
startDaemonSetController是入口函数,先New后Run。
1 | func startDaemonSetController(ctx context.Context, controllerContext ControllerContext) (controller.Interface, bool, error) { |
2. NewDaemonSetsController
NewDaemonSetsController仍然是常见的k8s controller初始化逻辑:
- 常用配置初始化
- 根据所需要的对象,添加event handler,便于监听所需要对象的事件变化,此处包括ds, pod,node三个对象。
- 赋值syncHandler,即具体实现是syncDaemonSet函数。
1 | func NewDaemonSetsController( |
3. Run
Run
函数与其他controller的逻辑一致不再分析,具体可以阅读本源码分析系列的replicaset-controller分析。
1 | func (dsc *DaemonSetsController) Run(ctx context.Context, workers int) { |
3.1. processNextWorkItem
processNextWorkItem
可参考replicaset-controller对该部分的分析。
1 | func (dsc *DaemonSetsController) runWorker(ctx context.Context) { |
4. syncDaemonSet
syncDaemonSet
是控制器具体的实现逻辑,即每个控制器的核心实现大部分在syncHandler这个函数中。
1 | func (dsc *DaemonSetsController) syncDaemonSet(ctx context.Context, key string) error { |
5. manage
manage
是具体的daemonset的pod创建及删除的具体代码。manage入口在updateDaemonSet的函数中。
1 | func (dsc *DaemonSetsController) updateDaemonSet(ctx context.Context, ds *apps.DaemonSet, nodeList []*v1.Node, hash, key string, old []*apps.ControllerRevision) error { |
以下是manage的具体代码
1 | func (dsc *DaemonSetsController) manage(ctx context.Context, ds *apps.DaemonSet, nodeList []*v1.Node, hash string) error { |
6. syncNodes
syncNodes
根据传入的需要创建和删除的pod,实现具体的创建和删除pod的操作。
1 | func (dsc *DaemonSetsController) syncNodes(ctx context.Context, ds *apps.DaemonSet, podsToDelete, nodesNeedingDaemonPods []string, hash string) error { |
参考:
赞赏一下