(接上篇)
EdgeCore之edged
下面對(duì)EdgeCore組件進(jìn)行剖析,因?yàn)?span style="color:#ff0000;">EdgeCore中的功能組件比較多,共包括devicetwin、edged、edgehub、eventbus、edgemesh、metamanager、servicebus和test共8個(gè)功能模塊。限于篇幅,本文只對(duì)edged的具體邏輯以及edged調(diào)用容器運(yùn)行時(shí)進(jìn)行剖析。
1.edged的具體邏輯剖析
從EdgeCore模塊注冊(cè)函數(shù)入手,具體如下所示。
KubeEdge/edge/cmd/EdgeCore/app/server.go |
// registerModules?register all the modules started in EdgeCore func?registerModules() { ... edged.Register() ... } |
進(jìn)入registerModules()函數(shù)中的edged.Register(),具體如下所示。
KubeEdge/edge/pkg/edged/edged.go |
// Register register edged func?Register() { edged, err := newEdged() if err != nil { klog.Errorf("init new edged error, %v", err) return } core.Register(edged) } |
Register()函數(shù)中主要做了如下兩件事:
1)初始化edged(edged, err := newEdged());
2)注冊(cè)將已經(jīng)實(shí)例化的edged struct(core.Register(edged))。
下面深入剖析初始化edged過程中具體做了哪些事情。進(jìn)入newEdged()函數(shù),具體內(nèi)容如下所示。
KubeEdge/edge/pkg/edged/edged.go |
//newEdged?creates new edged object and initialises?it func?newEdged() (*edged, error) { conf := getConfig() backoff := flowcontrol.NewBackOff(backOffPeriod, MaxContainerBackOff) podManager?:= podmanager.NewpodManager() policy := images.ImageGCPolicy{ ... } // build new object to match interface recorder := record.NewEventRecorder() ed := &edged{ ... } ... ed.livenessManager?= proberesults.NewManager() ... statsProvider?:= edgeimages.NewStatsProvider() ... //create and start the docker shim running as a grpc?server if conf.remoteRuntimeEndpoint == dockerShimEndpoint?|| conf.remoteRuntimeEndpoint == dockerShimEndpointDeprecated { streamingConfig?:= &streaming.Config{} dockerClientConfig?:= &dockershim.ClientConfig{ dockerEndpoint: ???????????conf.dockerAddress, ImagePullProgressDeadline: time.Duration(conf.imagePullProgressDeadline) * time.Second, EnableSleep: ??????????????true, WithTraceDisabled: ????????true, } pluginConfigs?:= dockershim.NetworkPluginSettings{ ... } ... ds, err := dockershim.NewdockerService(dockerClientConfig, conf.podSandboxImage, streamingConfig, &pluginConfigs, cgroupName, cgroupDriver, dockershimRootDir, redirectContainerStream) if err != nil { return nil, err } klog.Infof("RemoteRuntimeEndpoint: %q, remoteImageEndpoint: %q", conf.remoteRuntimeEndpoint, conf.remoteRuntimeEndpoint) klog.Info("Starting the GRPC server for the docker CRI shim.") server := dockerremote.NewdockerServer(conf.remoteRuntimeEndpoint, ds) if err := server.Start(); err != nil { return nil, err } } ed.clusterDNS?= convertStrToIP(conf.clusterDNS) ed.dnsConfigurer?= kubedns.NewConfigurer(recorder, nodeRef, ed.nodeIP, ed.clusterDNS, conf.clusterDomain, ResolvConfDefault) containerRefManager?:= kubecontainer.NewRefManager() httpClient?:= &http.Client{} runtimeService, imageService, err := getRuntimeAndImageServices(conf.remoteRuntimeEndpoint, conf.remoteRuntimeEndpoint, conf.RuntimeRequestTimeout) if err != nil { return nil, err } if ed.os == nil { ed.os = kubecontainer.RealOS{} } ed.clcm, err = clcm.NewContainerLifecycleManager(DefaultRootDir) var machineInfo?cadvisorapi.MachineInfo machineInfo.MemoryCapacity?= uint64(conf.memoryCapacity) containerRuntime, err := kuberuntime.NewKubeGenericRuntimeManager( ... ) cadvisorInterface, err := cadvisor.New("") containerManager, err := cm.NewContainerManager(mount.New(""), cadvisorInterface, cm.NodeConfig{ ... }, false, conf.devicePluginEnabled, recorder) ed.containerRuntime?= containerRuntime ed.containerRuntimeName = RemoteContainerRuntime ed.containerManager?= containerManager ed.runtimeService?= runtimeService imageGCManager, err := images.NewImageGCManager(ed.containerRuntime, statsProvider, recorder, nodeRef, policy, conf.podSandboxImage) ... ed.imageGCManager?= imageGCManager containerGCManager, err := kubecontainer.NewContainerGC(containerRuntime, containerGCPolicy, &containers.KubeSourcesReady{}) ... ed.containerGCManager?= containerGCManager ed.server = server.NewServer(ed.podManager) ed.volumePluginMgr, err = NewInitializedVolumePluginMgr(ed, ProbeVolumePlugins("")) ... return ed, nil } |
從newEdged()函數(shù)的定義中,我們可以知道其做很多事情,具體如下。
1)獲取edged相關(guān)配置(conf := getConfig());
2)初始化podmanager(podManager?:= podmanager.NewpodManager());
3)初始化edged struct(ed := &edged{});
4)初始化 edged的livenessManager;
5)初始化edged的鏡像存放地;
6)創(chuàng)建并啟動(dòng)dockershim的grpc?server;
7)?初始化運(yùn)行時(shí)服務(wù)和鏡像服務(wù);
8)初始化通用容器運(yùn)行時(shí)服務(wù);
9)初始化鏡像垃圾回收管理器;
10)初始化容器垃圾回收器;
11)初始化edged的server;
12)初始化edged的volume plugin管理器。
針對(duì)以上動(dòng)作,筆者重點(diǎn)分析創(chuàng)建并啟動(dòng)dockershim的grpc?server。dockershim是edged與容器運(yùn)行時(shí)交互的管道,所以edged對(duì)容器操作在dockershim的方法中都會(huì)得到體現(xiàn)。dockershim服務(wù)的初始化函數(shù)定義具體如下所示。文章來源:http://www.zghlxwxcb.cn/news/detail-837043.html
?「未完待續(xù)……」文章來源地址http://www.zghlxwxcb.cn/news/detail-837043.html
到了這里,關(guān)于「連載」邊緣計(jì)算(十七)02-20:邊緣部分源碼(源碼分析篇)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!