Icebound

icebound-area

KubeEdge入门与实践

刚刚接触,所有信息来源于文档和实践,如有错误请直接指出!

首先说一个前提:KubeEdge有两个部分:CloudCore和EdgeCore。

KubeEdge Architecture
整体架构

CloudCore实际上是一个k8s的插件,采用非侵入式的方法部署在云端,完全兼容所有k8s的API。CloudCore会把边缘节点的状态做一个映射,以mock的方式反馈个k8s,这样k8s会有一个操作普通云节点的假象,也就能兼容API了。在云端,用户的操作会被K8S-Api服务器以RestFul形式发给EdgeController,再由CloudHub发送给在边缘的EdgeCore。云端还有一个重要的组件:DeviceController。其作用是以K8S CRD的方式对边缘设备进行建模,同时实现边缘设备信息同步(如DeviceTwin[1]的同步)。

EdgeCore是一个非常非常轻量化的k8s,占用内存很低,因此可以部署在边缘的docker上。EdgeCore可以实现边缘的自主管理(如自主拉起pod,云边断开后在边缘持久化存储pod信息),并且兼容云端进行的各种k8s API操作(如k8s的调度操作)。在EdgeCore中,边缘设备通过MQTT协议,或者使用自由协议经Mapper[2]转发至MQTT协议的方式访问EventBus。EventBus可以将消息转发至DeviceTwin[1],以可靠方式同步云边状态,或者直接发给EdgeHub,上传至云端。云端下发的场景与上传类似。

[1]:DeviceTwin可以理解为一些键值对,这些键值对描述了边缘设备的状态。DeviceTwin的一个key可以对应两个值,desire值和report值。desire值是云端想要边缘保持的值,report值为边缘设备实际值。KubeEdge会尽量保证value=desire。如果desire留空,则report值可以被边缘完全控制。

[2]:Mapper是一个程序,运行在pod里,可以将一些协议转化为MQTT协议,以发送给EventBus。KubeEdge本身定义了一些Mapper,也支持用户自己写Mapper(存疑,似乎难以实现)。

在这样一个系统中,想要顺利搭建一个完整的环境需要以下几步:

  1. 完成KubeEdge各节点的搭建,详见这里
  2. 为边缘设备定义DeviceModel,即设备模板,描述一类设备的属性与访问方式
  3. 定义DeviceInstance,即设备实例。定义设备对应的设备模板,实际的访问协议,还有关联的边缘节点信息(一个设备可以关联多个边缘节点,但是要做好并发处理)。此外,DeviceInstance中还包含了之前提到的DeviceTwin。
  4. 部署Mapper,实现边缘设备与边缘节点的通信,如果直接是MQTT就不用了。无论是MQTT直连还是Mapper,都需要符合一些规范,具体见官方Demo。
  5. 部署其他应用。这时候设备已经接入KubeEdge了,你可以用API操作他们,查看/修改状态,也可以部署你自己定义的一些应用了。

未完待续。。。