(接上篇)
从启动函数Start()中可以看到,其以go routine的方式启动很多后台处理服务,具体如下。
1)初始化edged的kubeClient,具体如下所示。
// use self defined client to replace fake kube client e.kubeClient = fakekube.NewSimpleClientset(e.metaClient) |
2) 初始化pod status管理器,具体如下所示。
e.statusManager = status.NewManager(e.kubeClient, e.podManager, utilpod.NewpodDeleteSafety(), e.metaClient) |
3)初始化edged节点的模块,具体如下所示。
if err := e.initializeModules(); err != nil { klog.Errorf("initialize module error: %v", err) os.Exit(1) } |
其中,e.initializeModules()函数定义如下所示。
func (e *edged) initializeModules() error { node, _ := e.initialNode() if err := e.containerManager.Start(node, e.GetActivepods, edgedutil.NewSourcesReady(), e.statusManager, e.runtimeService); err != nil { klog.Errorf("Failed to start device plugin manager %v", err) return err } return nil } |
可以看出,initializeModules()函数实际上启动了容器管理器。
4)初始化并启动volume管理器,具体如下所示。
e.volumeManager = volumemanager.NewVolumeManager( ... ) go e.volumeManager.Run(edgedutil.NewSourcesReady(), utilwait.NeverStop) |
5)初始化pod生命周期事件生成器,具体如下所示。
e.pleg = edgepleg.NewGenericLifecycleRemote(...) ... e.pleg.Start() |
6)启动pod增加和删除消息队列,具体如下所示。
e.podAddWorkerRun(concurrentConsumers) e.podRemoveWorkerRun(concurrentConsumers) |
7)启动edged的探针管理器,具体如下所示。
e.probeManager.Start() |
8)启动监听pod事件的loop,具体如下所示。
go e.syncLoopIteration(e.pleg.Watch(), housekeepingTicker.C, syncWorkQueueCh.C) |
9)启动edged的http server,具体如下所示。
go e.server.ListenAndServe() |
10)启动镜像和容器的垃圾回收服务,具体如下所示。
e.imageGCManager.Start() e.StartGarbageCollection() |
11)初始化和启动edged的插件服务,具体如下所示。
e.pluginManager = pluginmanager.NewPluginManager(...) // Adding Registration Callback function for CSI Driver e.pluginManager.AddHandler(pluginwatcherapi.CSIPlugin, plugincache.PluginHandler(csiplugin.PluginHandler)) // Start the plugin manager klog.Infof("starting plugin manager") go e.pluginManager.Run(edgedutil.NewSourcesReady(), utilwait.NeverStop) |
12) 启动与metamanager进行事件同步的服务,具体如下所示。
e.syncpod() |
到此,edged的具体逻辑剖析就结束了。
edged调用容器运行时剖析
edged与容器运行时的调用关系如图8-3所示。
图 8-3 edged与容器运行时的调用关系
从图8-3可以看出,edged首先启动dockershim的grpc server,然后edged通过调用dockershim的grpc server实现与容器运行时(container runtime)的交互,最后dockershim的grpc server将edged具体操作传递给容器运行时。
「未完待续……」