1. Go语言基础概念
1.1. Goroutine
1.2. Channel
2. 其他基础概念
2.1. Beehive
3. k8s基础概念
3.1. Go-client
3.2. SharedInformer
3.3. ListWatch
4. KubeEdge相关概念
4.1. 通用概念
4.1.1. ChannelMessageQueue
4.1.2. Message
在KubeEdge中,组件间传递的消息都是使用的Message结构,具体如下:
1 | type Message struct { |
2 | Header MessageHeader `json:"header"` |
3 | Router MessageRoute `json:"route,omitempty"` |
4 | Content interface{} `json:"content"` |
5 | } |
其中消息头包括消息ID、父ID、创建时间、消息版本号和同步标识符,具体结构如下:
1 | // MessageHeader defines message header details |
2 | type MessageHeader struct { |
3 | // the message uuid |
4 | ID string `json:"msg_id"` |
5 | // the response message parentid must be same with message received |
6 | // please use NewRespByMessage to new response message |
7 | ParentID string `json:"parent_msg_id,omitempty"` |
8 | // the time of creating |
9 | Timestamp int64 `json:"timestamp"` |
10 | // specific resource version for the message, if any. |
11 | // it's currently backed by resource version of the k8s object saved in the Content field. |
12 | // kubeedge leverages the concept of message resource version to achieve reliable transmission. |
13 | ResourceVersion string `json:"resourceversion,omitempty"` |
14 | // the flag will be set in sendsync |
15 | Sync bool `json:"sync,omitempty"` |
16 | } |
消息路径包括消息源、接收组、要进行的操作和要操作的资源,具体结构如下:
1 | // MessageRoute contains structure of message |
2 | type MessageRoute struct { |
3 | // where the message come from |
4 | Source string `json:"source,omitempty"` |
5 | // where the message will broadcasted to |
6 | Group string `json:"group,omitempty"` |
7 | |
8 | // what's the operation on resource |
9 | Operation string `json:"operation,omitempty"` |
10 | // what's the resource want to operate |
11 | Resource string `json:"resource,omitempty"` |
12 | } |
消息体包含消息的具体内容。我们可以拿几个真实的消息来分析一下:
I0420 17:16:27.834358 2015 process.go:117] received msg from cloud-hub:{Header:{ID:c63f4e7b-6010-4919-9a50-775fea6fdae7 ParentID:1c4f5773-6fe6-4cfe-bcd4-c14d4fb40ee0 Timestamp:1587374187834 ResourceVersion:17247759 Sync:false} Router:{Source:edgecontroller Group:resource Operation:response Resource:default/node/edge} Content:OK}
这是边缘节点日志中记录的一个消息,结构如下:
1 | Header: |
2 | ID: c63f4e7b-6010-4919-9a50-775fea6fdae7 |
3 | ParentID: 1c4f5773-6fe6-4cfe-bcd4-c14d4fb40ee0 |
4 | Timestamp: 1587374187834 |
5 | ResourceVersion: 17247759 |
6 | Sync: false |
7 | Router: |
8 | Source: edgecontroller |
9 | Group: resource |
10 | Operation: response |
11 | Resource: default/node/edge |
12 | Content: |
13 | OK |
这是云端的边缘控制器向边缘发出的ACK消息(Operation: response),通过对EdgeController的分析可知,EdgeController针对其上行控制器传递的边缘消息,在操作成功后,要回复OK消息到边缘,这个消息就是这种了。我们根据它的父ID找到了对应的消息,结构如下:
1 | Header: |
2 | ID:1c4f5773-6fe6-4cfe-bcd4-c14d4fb40ee0 |
3 | ParentID: |
4 | Timestamp:1587374187806 |
5 | ResourceVersion: |
6 | Sync:true |
7 | Router: |
8 | Source:edged |
9 | Group:meta |
10 | Operation:update |
11 | Resource:default/nodestatus/edge |
12 | Content: |
13 | { |
14 | UID:38796d14-1df3-11e8-8e5a-286ed488f209 |
15 | Status:{ |
16 | Capacity:map[cpu:{i:{value:2 scale:0} d:{Dec:<nil>} s:2 Format:DecimalSI} memory:{i:{value:3972005888 scale:0} d:{Dec:<nil>} s:3788Mi Format:BinarySI} pods:{i:{value:110 scale:0} d:{Dec:<nil>} s: Format:DecimalSI}] |
17 | Allocatable:map[cpu:{i:{value:2 scale:0} d:{Dec:<nil>} s:2 Format:DecimalSI} memory:{i:{value:3867148288 scale:0} d:{Dec:<nil>} s: Format:BinarySI} pods:{i:{value:110 scale:0} d:{Dec:<nil>} s: Format:DecimalSI}] |
18 | Phase:Running Conditions:[{Type:Ready Status:True LastHeartbeatTime:2020-04-20 17:16:27.746003024 +0800 CST m=+1388866.315239339 LastTransitionTime:2020-04-20 17:16:27.746003024 +0800 CST m=+1388866.315239339 Reason:EdgeReady Message:edge is posting ready status}] |
19 | Addresses:[{Type:InternalIP Address:192.168.1.243} {Type:Hostname Address:edge}] |
20 | DaemonEndpoints:{KubeletEndpoint:{Port:0}} |
21 | NodeInfo:{MachineID: SystemUUID: BootID: KernelVersion:3.10.0-1062.1.1.el7.x86_64 OSImage:CentOS Linux 7 (Core) ContainerRuntimeVersion:remote://19.3.6 KubeletVersion:v1.17.1-kubeedge-v1.2.1 KubeProxyVersion: OperatingSystem:linux Architecture:amd64} Images:[] VolumesInUse:[] VolumesAttached:[] Config:nil} |
22 | ExtendResources:map[] |
23 | } |
24 | } |
这个消息是边缘发往云端的节点状态更新消息,Router.Source只要不是”twin”就是发给EdgeController的,否则是发给DeviceController的。之后边缘收到了上面的OK消息。
4.1.3. DeviceTwin
4.1.4. ChannelContext
在KubeEdge中,组件间的消息传递实际上利用的是ChannelContext(信道上下文)。在云端,它是在StartModules()启动各个模块之前,随beehiveContext的初始化而初始化的,beehiveContext中的成员messageContext和moduleContext实际指向的都是同一个channelContext,其结构如下:
1 | // ChannelContext is object for Context channel |
2 | type ChannelContext struct { |
3 | //ConfigFactory goarchaius.ConfigurationFactory |
4 | channels map[string]chan model.Message |
5 | chsLock sync.RWMutex |
6 | typeChannels map[string]map[string]chan model.Message |
7 | typeChsLock sync.RWMutex |
8 | anonChannels map[string]chan model.Message |
9 | anonChsLock sync.RWMutex |
10 | } |
里面有三个map和对应的三个锁。channels存储向各个模块通信的信道,发往某个模块的消息都要通过该模块的信道发送;typeChannels存储模块所在的组(group)模块自己的信道,用于向组发送消息;anonChannels用于发送同步(Sync)消息和对同步消息的回应(Resp),当发送一个同步消息时,向目标模块信道发送消息后,会在anonChannels中以消息ID创建一个新信道,等待接收回应,可设置超时时间。
4.2. 边缘相关概念
待分析
4.3. 云端相关概念
4.3.1. EdgeController
EdgeController是云端四大组件之一,是k8s api-server 与 edgecore之间的桥梁,主要由两部分构成:
- DownstreamController:下行控制器,同步k8s api-server的增/删/改事件到edgecore
- UpstreamController:上行控制器,订阅edgecore的消息,将资源和事件的监视和更新状态同步到k8s api-server
4.3.2. CloudHub
CloudHub是云端四大组件之一,是各种控制器和边端之间的桥梁,用于开展两者间的通信。它同时支持基于WebSocket的连接和Quic协议的连接。
4.3.3. DeviceController
DeviceController是云端四大组件之一,用于管理设备,以便可以在边缘和云端之间同步设备元数据/状态数据。主要由两部分构成:
- DownstreamController:下行控制器,负责将云端对设备实例的操作同步给对应的边缘节点,将云端对设备模板的操作更新在本地设备模板管理器中
- UpstreamController:上行控制器,负责将设备状态同步给云端,并更新下行控制器里的设备实例
4.3.4. SyncController
SyncController是云端四大组件之一,是KubeEdge v1.2版本新增的组件,负责周期性检查个边缘节点的同步状态,对比K8s中资源的信息,将不一致的状态同步到边缘,确保云边状态的最终一致性。
KubeEdge v1.2版本在加入SyncController的同时,还在CloudHub里加入了一个ObjectSyncController,负责在发送消息前检查消息版本号,在收到ACK后更新对应的ObjectSync。