「连载」边缘计算(十七)02-20:边缘部分源码(源码分析篇)

news/2024/5/19 15:23:39 标签: 边缘计算, 人工智能

(接上篇)

EdgeCore之edged

下面对EdgeCore组件进行剖析,因为EdgeCore中的功能组件比较多,共包括devicetwin、edged、edgehubeventbusedgemeshmetamanagerservicebus和test共8个功能模块。限于篇幅,本文只对edged的具体逻辑以及edged调用容器运行时进行剖析。

1.edged的具体逻辑剖析

EdgeCore模块注册函数入手,具体如下所示。

KubeEdge/edge/cmd/EdgeCore/app/server.go

// registerModules register all the modules started in EdgeCore

func registerModules() {

...

edged.Register()

...

}

进入registerModules()函数中的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()函数中主要做了如下两件事:

1)初始化edged(edged, err := newEdged());

2)注册将已经实例化的edged struct(core.Register(edged))。

下面深入剖析初始化edged过程中具体做了哪些事情。进入newEdged()函数,具体内容如下所示。

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()函数的定义中,我们可以知道其做很多事情,具体如下。

1)获取edged相关配置(conf := getConfig());

2)初始化podmanagerpodManager := podmanager.NewpodManager());

3)初始化edged struct(ed := &edged{});

4)初始化 edged的livenessManager

5)初始化edged的镜像存放地;

6)创建并启动dockershimgrpc server;

7) 初始化运行时服务和镜像服务;

8)初始化通用容器运行时服务;

9)初始化镜像垃圾回收管理器;

10)初始化容器垃圾回收器;

11)初始化edged的server;

12)初始化edged的volume plugin管理器。

针对以上动作,笔者重点分析创建并启动dockershimgrpc server。dockershim是edged与容器运行时交互的管道,所以edged对容器操作在dockershim的方法中都会得到体现。dockershim服务的初始化函数定义具体如下所示。

 「未完待续……


http://www.niftyadmin.cn/n/5384296.html

相关文章

适用于高云FPGA的JTAG

目标板卡:小梅哥芯海无涯GOWIN高云ACG525(GW5A-LV25UG324) 1.软件要求:必须用商业版,因为教育版(V1.9.9Beta-4 Education)不支持此封装的GW5A。商业版需要上网申请License,此处提供D4D853392AD8.lic文件(此方法为临时…

Spring6学习技术|IoC+基于xml管理bean

学习材料 尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解) IoC 控制反转。是一种设计思想。 1.获取bean对象的方法 通过id,通过class,和双重方式。 ApplicationContext context new Cla…

基于JavaWeb开发的小区车辆登记系统计算机毕设[附源码]

基于JavaWeb开发的小区车辆登记系统计算机毕设[附源码] 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统…

深度学习(17)--DataLoader自定义数据集制作

目录 DataLoader自定义数据集制作 1.从标注文件(txt文件)中读取数据和标签 2.分别把数据和标签存在两个list中 3.设置完整的图像数据路径 4.根据任务整合出一个数据处理类 5.数据预处理 6.使用定义好的类来实例化DataLoader 7.检查数据和标签是否对应 8.使用创建好的D…

Arcgis小技巧【17】——如何修改ArcGIS中影像的背景颜色

一、问题分析 在ArcGIS中,有时候会遇到影像有背景色,看上去很不美观。 尤其在多个影像叠加的时候,更是会造成遮挡的问题。 二、解决办法 首先,用【识别】工具在背景色是点击一下,查看弹出的窗口,记住背景…

第六十四天 服务攻防-框架安全CVE复现Apache shiroApache Solr

第六十四天 服务攻防-框架安全&CVE复现Apache shiro&Apache Solr 知识点: 中间件及框架列表: IIS,Apache,Nginx,Tomcat,Docker,K8s,Weblogic.JBoos,WebSphere, Jenkins,GlassFish,Jetty,Jira,Struts2,Laravel,Solr,Shiro,Thinkphp,Spring, Flask,jQuery等 1、开发框…

解锁网络隧道:深入探索PPTP的秘密及其在现代VPN技术中的地位

PPTP定义 点对点隧道协议(PPTP)是一种网络协议,用于在互联网或其他网络环境中实现虚拟私人网络(VPN)。通过PPTP,可以允许远程用户和分支机构通过创建一个安全的、私有的通信隧道来访问企业内部网络。这种协…

大话设计模式——2.简单工厂模式(Simple Factory Pattern)

定义:又称静态工厂方法,可以根据参数的不同返回不同类的实例,专门定义一个类(工厂类)来负责创建其他类的实例可通过类名直接调用,被创建的实例通常具有共同的父类。 UML图: 例子: 计…