(接上篇)
EdgeCore中功能模块的启动
EdgeCore中功能模块的启动与中的CloudCore中功能模块的启动流程完全相同,大家可以参考该部分。
组件源码分析
本节将对Kubernetes的核心组件的源码进行梳理和分析。这些组件包括控制节点的kube-apiserver、kube-controller-manager、kube-scheduler,计算节点的kube-let、kube-proxy。
配置文件读取
截至目前,我们已经分析了KubeEdge源码整体架构以及KubeEdge项目中各组件的源码入口。本节将分析KubeEdge项目中CloudCore和EdgeCore组件都会用到的读取配置文件的逻辑。
配置文件读取流程剖析
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:边缘部分源码(源码分析篇)