T4L2

Time to learn for everything

0%

KubeEdge概念一览

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。

4.4. EdgeSite
4.5. Mapper相关概念