「连载」边缘计算(十二)01-31:边缘部分源码(源码分析篇)

(接上篇)

EdgeCore中功能模块的启动

EdgeCore中功能模块的启动与中的CloudCore中功能模块的启动流程完全相同,大家可以参考该部分。

组件源码分析

本节将对Kubernetes的核心组件的源码进行梳理和分析。这些组件包括控制节点的kube-apiserverkube-controller-manager、kube-scheduler,计算节点的kube-let、kube-proxy。

配置文件读取

截至目前,我们已经分析了KubeEdge源码整体架构以及KubeEdge项目中各组件的源码入口。本节将分析KubeEdge项目中CloudCoreEdgeCore组件都会用到的读取配置文件的逻辑。

配置文件读取流程剖析

KubeEdge各模块配置文件读取使用的是相同的,流程也是高度相似的。所以,这里只对KubeEdge其中一个模块读取配置文件的流程进行深入剖析。关于其他模块的配置文件的读取,读者可以在本节的基础上自行剖析。

(1)配置文件读取流程剖析

CloudCore组件的cloudhub模块的配置初始化切入,对KubeEdge的配置文件读取流程进行剖析,具体如下所示。

KubeEdge/cloud/edge/pkg/cloudhub/cloudhub.go

func (a *cloudHub) Start(c *beehiveContext.Context) {

...

initHubConfig()

...

}

initHubConfig()函数定义具体如下所示。

KubeEdge/cloud/pkg/cloudhub/cloudhub.go

import(

...

"GitHub.com/KubeEdge/beehive/pkg/common/config"

...

)

func initHubConfig() {

cafile, err := config.CONFIG.GetValue("cloudhub.ca").ToString()

...

certfile, err := config.CONFIG.GetValue("cloudhub.cert").ToString()

...

keyfile, err := config.CONFIG.GetValue("cloudhub.key").ToString()

...

util.HubConfig.ProtocolUDS, _ = config.CONFIG.GetValue("cloudhub.enable_uds").ToBool()

util.HubConfig.Address, _ = config.CONFIG.GetValue("cloudhub.address").ToString()

util.HubConfig.Port, _ = config.CONFIG.GetValue("cloudhub.port").ToInt()

util.HubConfig.QuicPort, _ = config.CONFIG.GetValue("cloudhub.quic_port").ToInt()

util.HubConfig.MaxIncomingStreams, _ = config.CONFIG.GetValue("cloudhub.max_incomingstreams").ToInt()

util.HubConfig.UDSAddress, _ = config.CONFIG.GetValue("cloudhub.uds_address").ToString()

util.HubConfig.KeepaliveInterval, _ = config.CONFIG.GetValue("cloudhub.keepalive-interval").ToInt()

util.HubConfig.WriteTimeout, _ = config.CONFIG.GetValue("cloudhub.write-timeout").ToInt()

util.HubConfig.NodeLimit, _ = config.CONFIG.GetValue("cloudhub.node-limit").ToInt()

...

}

根据initHubConfig()函数定义和相关导入可知,config是导入的package,真正起作用的是config.CONFIG。config.CONFIG的定义如下所示。

KubeEdge/beehive/pkg/common/config/config.go

// CONFIG conf

var CONFIG archaius.ConfigurationFactory

上述代码中,config.CONFIG是定义的一个archaius.ConfigurationFactory类型的全局变量。至此,读者会疑惑只定义一个全局变量怎么读取配置文件?肯定会有函数对这个全局变量进行赋值,根据以往经验,这样的全局变量会被所在文件的init()函数初始化。检查该变量所在文件的init()函数,具体如下所示。

KubeEdge/beehive/pkg/common/config/config.go

func init() {

InitializeConfig()

}

InitializeConfig()函数定义具体如下所示。

KubeEdge/beehive/pkg/common/config/config.go

import (

...

archaius "GitHub.com/go-chassis/go-archaius"

...

)

// config file  only support .yml or .yaml  !

func InitializeConfig() {

once.Do(func() {

err := archaius.Init()

...

CONFIG = archaius.GetConfigFactory()

ms := memoryconfigsource.NewMemoryConfigurationSource()

CONFIG.AddSource(ms)

cmdSource := commandlinesource.NewCommandlineConfigSource()

CONFIG.AddSource(cmdSource)

envSource := envconfigsource.NewEnvConfigurationSource()

CONFIG.AddSource(envSource)

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

})

...

})

}

上述代码中, InitializeConfig()函数对config.CONFIG进行了赋值,也是读取配置文件内容的真身。

 「未完待续……

点击下方标题可阅读技术文章

「连载」边缘计算(一)01-16:边缘计算系统逻辑架构(原理篇)
「连载」边缘计算(二)01-17:边缘计算系统逻辑架构(原理篇)
「连载」边缘计算(三)01-18:边缘部分原理解析(原理篇)
「连载」边缘计算(四)01-19:边缘部分原理解析(原理篇)
「连载」边缘计算(五)01-22:边缘部分原理解析(原理篇)
「连载」边缘计算(六)01-23:边缘部分原理解析(原理篇)
「连载」边缘计算(七)01-24:边缘部分原理解析(原理篇)
「连载」边缘计算(八)01-25:边缘部分源码(源码分析篇)
「连载」边缘计算(九)01-26:边缘部分源码(源码分析篇)
「连载」边缘计算(十)01-29:边缘部分源码(源码分析篇)
「连载」边缘计算(十一)01-30:边缘部分源码(源码分析篇)

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值