前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >KubeEdge - edgecore初始化源码分析

KubeEdge - edgecore初始化源码分析

作者头像
有点技术
发布2020-07-14 14:57:34
6010
发布2020-07-14 14:57:34
举报
文章被收录于专栏:有点技术有点技术

edgecore功能

由官方文档我们知道,kubeedge核心为cloudcore和edgecore,edgecore主要分为以下几个组件

  • Edged:在边缘管理容器化的应用程序。
  • EdgeHub:Edge上的通信接口模块。
  • EventBus:使用MQTT处理内部边缘通信。
  • DeviceTwin:它是用于处理设备元数据的设备的软件镜像。
  • MetaManager:它管理边缘节点上的元数据。

启动代码

代码语言:javascript
复制
Run: func(cmd *cobra.Command, args []string) {    verflag.PrintAndExitIfRequested()    flag.PrintFlags(cmd.Flags())
    // To help debugging, immediately log version    klog.Infof("Version: %+v", version.Get())
    registerModules()    // start all modules    core.Run()},

配置初始化

在初始化时,会初始化配置,配置使用了华为CSE github.com/go-chassis/go-archaius的微服务框架 go-archaius依次从配置中心,命令行,环境变量,文件,外部配置源读取配置,

在beehive中的InitializeConfig中以下代码为本地文件配置的代码实现,在不进行配置configpath的情况下遍历当前的conf目录读取yml或yaml结尾的文件:

代码语言:javascript
复制
confLocation := getConfigDirectory() + "/conf"_, err = os.Stat(confLocation)if !os.IsExist(err) {    os.Mkdir(confLocation, os.ModePerm)}err = filepath.Walk(confLocation, func(location string, f os.FileInfo, err error) error {    if f == nil {        return err    }    if f.IsDir() {        return nil    }    ext := strings.ToLower(path.Ext(location))    if ext == ".yml" || ext == ".yaml" {        archaius.AddFile(location)    }    return nil})

registerModules

edgecore通过registerModules函数注册对应的模块

代码语言:javascript
复制
func registerModules() {    devicetwin.Register()    edged.Register()    edgehub.Register()    eventbus.Register()    edgemesh.Register()    metamanager.Register()    servicebus.Register()    test.Register()    dbm.InitDBManager()}

在模块注册时会判断在配置中是否启用了该模块,从而选择性加载

代码语言:javascript
复制
func Register(m Module) {    if isModuleEnabled(m.Name()) {        modules[m.Name()] = m        klog.Infof("Module %v registered", m.Name())    } else {        disabledModules[m.Name()] = m        klog.Warningf("Module %v is not register, please check modules.yaml", m.Name())    }}

另外registerModules中的initdbmanager比较简单,根据orm初始化数据库,不再赘述

StartModules

初始化一个上下文,当前只有一种类型,也就是go channel,可能以后会有更多的上下文实现

初始化全局上下文context,context包含两个对象moduleContext,messageContext,

moduleContext用于模块管理

代码语言:javascript
复制
type ModuleContext interface {    AddModule(module string)    AddModuleGroup(module, group string)    Cleanup(module string)}

messageContext 用于消息同步

代码语言:javascript
复制
type MessageContext interface {    // async mode    Send(module string, message model.Message)    Receive(module string) (model.Message, error)    // sync mode    SendSync(module string, message model.Message, timeout time.Duration) (model.Message, error)    SendResp(message model.Message)    // group broadcast    SendToGroup(moduleType string, message model.Message)    SendToGroupSync(moduleType string, message model.Message, timeout time.Duration) error}

遍历要加载的models,通过AddModule将模块添加到模块上下文的channel上下文里面,AddModuleGroup 根据组模块添加channel到typeChannels

有三个channel channels,typeChannels,anonChannels:

代码语言:javascript
复制
type ChannelContext struct {    channels,     map[string]chan model.Message    chsLock      sync.RWMutex    typeChannels map[string]map[string]chan model.Message    typeChsLock  sync.RWMutex    anonChannels map[string]chan model.Message    anonChsLock  sync.RWMutex}

然后每个模块通过根据Context启动自身

代码语言:javascript
复制
go module.Start(coreContext)

优雅停止

捕捉信号量,然后对模块进行清理

代码语言:javascript
复制
func GracefulShutdown() {    c := make(chan os.Signal)    signal.Notify(c, syscall.SIGINT, syscall.SIGHUP, syscall.SIGTERM,        syscall.SIGQUIT, syscall.SIGILL, syscall.SIGTRAP, syscall.SIGABRT)    select {    case s := <-c:        klog.Infof("Get os signal %v", s.String())        //Cleanup each modules        modules := GetModules()        for name, module := range modules {            klog.Infof("Cleanup module %v", name)            module.Cleanup()        }    }}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有点技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • edgecore功能
  • 启动代码
  • 配置初始化
  • registerModules
  • StartModules
  • 优雅停止
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档