边缘计算
- 1. KubeEdge简介
- 2. 功能说明
- 3. 架构说明
- 3.1 架构图
- 3.2. 云端
- 3.3. 边缘端
- 4. 部署
- 4.1环境准备
- 4.2 云端部署
- 4.2.1 配置 golang 环境
- 4.2.2 配置 cloudcore
- 4.2.3 创建cloud节点
- 4.2 Edge 端部署
- 4.2.1 环境初始化
- 4.2.2 安装部署docker
- 4.2.3 安装keadm
- 4.2.4 从云端获取令牌 token
- 4.2.5 加入边缘节点
- 4.3 验证
- 5. 边缘计算应用Demo
- 5.1 准备工作 (云端操作)
- 5.2 部署云端应用
- 5.3 部署边缘端应用
- 5.4 体验 demo
- 5.5 源码分析
- 5.5.1 代码结构
- 5.5.2 代码说明
- 5.5.2.1 云端应用:web-controller-app
- 5.5.2.2 边缘端应用:counter-mapper
1. KubeEdge简介
KubeEdge
是华为开源出来的边缘计算组件,它是基于kubernetes之上将容器化应用的编排能力拓展到边缘主机或边缘设备,在云端和边缘端提供网络通信,应用部署、元数据同步等功能。同时支持MQTT协议,允许开发者在边缘端自定义接入边缘设备。
为什么要用KubeEdge而不直接使用K8s?
KubeEdge是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的。
2. 功能说明
- 边缘计算:提供边缘节点自治能力,边缘节点数据处理能力。
- 便捷部署:开发者可以开发http或mqtt协议的应用,运行在云端和边缘端。
- k8s原生支持:可以通过k8s管理和监控边缘设备和边缘节点。
- 丰富的应用类型:可以在边缘端部署机器学习、图片识别、事件处理等应用。
3. 架构说明
3.1 架构图
kubeedge分为两个可执行程序,cloudcore和edgecore。
3.2. 云端
- CloudHub:一个web socket服务器,负责监听云端的更新、缓存及向
EdgeHub
发送消息。 - EdgeController:一个扩展的k8s控制器,负责管理边缘节点和pod元数据,同步边缘节点的数据,是
k8s-apiserver
与EdgeCore
的通信桥梁。 - DeviceController:一个扩展的k8s控制器,负责管理节点设备,同步云端和边缘端的设备元数据和状态。
3.3. 边缘端
-
EdgeHub:一个web socket客户端,负责云端与边缘端的信息交互,其中包括将云端的资源变更同步到边缘端及边缘端的状态变化同步到云端。它充当边缘与云之间的通信链接。
-
Edged:运行在边缘节点,管理节点生命周期。可以帮助用户在边缘节点上部署容器化的工作负载或应用程序。 这些工作负载可以执行任何操作,从简单的遥测数据操作到分析或ML推理等。使用kubectl云端的命令行界面,用户可以发出命令来启动工作负载。
-
EventBus:一个MQTT客户端,充当用于发送/接收有关mqtt主题的消息的接口。与MQTT服务端交互,提供发布/订阅的能力。
-
ServiceBus:一个HTTP客户端,与HTTP服务端交互。为云组件提供HTTP客户端功能,以访问在边缘运行的HTTP服务器。
-
DeviceTwin:负责存储设备状态并同步设备状态到云端,同时提供应用的接口查询。
-
MetaManager:
edged
和edgehub
之间的消息处理器,负责向轻量数据库(SQLite)存储或查询元数据。
4. 部署
4.1环境准备
我们在上篇文章中安装好的k8s基础上再增加1台边缘端节点。
从零开始学习部署K8S:https://blog.csdn.net/shyflea/article/details/119758389
注意:往下操作前要先安装好K8S!!!
主机信息如下,系统均采用Centos7.x。
类型 | IP地址 | 主机名 | 内存 | CPU | 部署服务 |
---|---|---|---|---|---|
云端 | 192.168.159.101 | master1 | 4G | 2 | k8s、docker、cloudcore |
云端 | 192.168.159.102 | node1 | 2G | 1 | docker |
云端 | 192.168.159.103 | node2 | 2G | 1 | docker |
边缘端 | 192.168.159.201 | edge1 | 1G | 1 | docker、edgecore |
4.2 云端部署
云端主要是负责编译 kubeEdge 的相关组件与运行 cloudcore,所以需要准备 golang 环境,以及需要去官方 github 上拉取源码,进行编译。
4.2.1 配置 golang 环境
$ cd /home
$ wget https://golang.google.cn/dl/go1.14.4.linux-amd64.tar.gz
$ tar -zxvf go1.14.4.linux-amd64.tar.gz -C /usr/local
配置 golang 环境变量
$ vim /etc/profile
文件末尾追加
# golang env
export GOROOT=/usr/local/go
export GOPATH=/data/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
$ source /etc/profile
# 创建工作目录:
$ mkdir -p /data/gopath && cd /data/gopath
$ mkdir -p src pkg bin
4.2.2 配置 cloudcore
下载 kubeEdge 源码
# 由于从github上下载比较慢,这里使用加速地址
$ cd /home
$ git clone https://hub.fastgit.org/dogfei/kubeedge.git $GOPATH/src/github.com/kubeedge/kubeedge
编译 keadm
$ cd $GOPATH/src/github.com/kubeedge/kubeedge
$ make all WHAT=keadm
$ make all WHAT=cloudcore
$ yum -y install gcc
$ make all WHAT=edgecore
将编译好的二进制文件 copy 到/usr/local/bin 中
$ cp _output/local/bin/* /usr/local/bin/
4.2.3 创建cloud节点
创建 cloudcore 节点
$ keadm init --advertise-address="192.168.159.101" #IP替换为本机IP
问题1: 连接不上raw.githubusercontent.com
解决方法:编辑vi /etc/hosts
,增加
151.101.108.133 raw.githubusercontent.com
问题2: 如果添加完host以后,还是
> Error: failed to run 'sh -c cd /etc/kubeedge/crds/devices && wget -k
> --no-check-certificate --progress=bar:force https://raw.githubusercontent.com/kubeedge/kubeedge/master/build/crds/devices/devices_v1alpha2_device.yaml'
> because of error : exit status 4
解决方法:手动下载后上传到相应目录
# 上传devices_v1alpha2_devicemodel.yaml 和devices_v1alpha2_device.yaml
$ cd /etc/kubeedge/crds/devices
# 下载地址:https://github.com/kubeedge/kubeedge/edit/master/build/crds/devices/
# 上传 cluster_objectsync_v1alpha1.yaml objectsync_v1alpha1.yaml
$ cd /etc/kubeedge/crds/reliablesyncs
# 下载地址:https://github.com/kubeedge/kubeedge/edit/master/build/crds/reliablesyncs
# 手动下载kubeedge-v1.7.2-linux-amd64.tar.gz安装包
$ cd /etc/kubeedge/
$ wget -k --no-check-certificate --progress=bar:force https://ghproxy.com/https://github.com/kubeedge/kubeedge/releases/download/v1.7.2/kubeedge-v1.7.2-linux-amd64.tar.gz
# 重新启动
$ keadm init --advertise-address="192.168.159.101"
# 注意安装过程中提示是否删除kubeedge-v1.7.2-linux-amd64.tar.gz重新下载,要选N
4.2 Edge 端部署
4.2.1 环境初始化
首先对边缘端edge1进行初始化操作:
关闭防火墙和SELinux
$ systemctl stop firewalld && systemctl disable firewalld
$ setenforce 0
$ vi /etc/selinux/config
SELINUX=disabled
设定/etc/host解析到互通的主机
云端控制节点master1:
$ vi /etc/hosts
192.168.159.201 edge1
边缘端节点edge1:
$ vi /etc/hosts
192.168.159.201 edge1
192.168.159.101 master1
配置时间同步定时任务
# 使用公共NTP网络时间服务器地址:阿里云
* * * * * /sbin/ntpdate time1.aliyun.com > /dev/null 2>&1
临时关闭swap分区
$ swapoff -a
# 永久关闭
$ sed -ri 's/.*swap.*/#&/' /etc/fstab
4.2.2 安装部署docker
在边缘节点安装docker
# 1.设置国内YUM源
$ cd /etc/yum.repos.d/
$ yum install wget
$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 2.安装指定的docker版本
$ yum -y install docker-ce-18.09.7-3.el7 docker-ce-cli-18.09.7
# 3.设置docker使用阿里云加速
$ mkdir /etc/docker
$ cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=cgroupfs"]
}
EOF
# 4.启动后台进程
$ systemctl enable docker && systemctl start docker
# 5.查看docker版本
$ docker -v
4.2.3 安装keadm
Edge 端也通过 keadm 进行配置,可以将 cloud 端编译生成的二进制文件 scp 到 Edge 端。
在云端执行如下命令:
$ cd $GOPATH/src/github.com/kubeedge/kubeedge
$ scp -r _output/local/bin/* root@192.168.159.201:/usr/local/bin/
$ scp /etc/kubeedge/kubeedge-v1.7.2-linux-amd64.tar.gz root@192.168.159.201:/etc/kubeedge/
4.2.4 从云端获取令牌 token
获取的令牌用于边缘节点加入时使用,类似于 k8s 的节点加入集群中
$ keadm gettoken
# 输出结果
576713eff1f92ea4a48fda83538354b25d1e42190d17bbbc7b36e07980dfae2c.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2Mjk2MDI3OTJ9.DH78U1CoFiW_v-Qlnscf40b7De7dAy1-Y2bc7FMkxxg
4.2.5 加入边缘节点
在边缘端执行以下命令
$ keadm join --cloudcore-ipport=192.168.159.101:10000 --token=576713eff1f92ea4a48fda83538354b25d1e42190d17bbbc7b36e07980dfae2c.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2Mjk2MDI3OTJ9.DH78U1CoFiW_v-Qlnscf40b7De7dAy1-Y2bc7FMkxxg
# 出现以下输出表示安装成功
KubeEdge edgecore is running, For logs visit: journalctl -u edgecore.service -b
4.3 验证
边缘端 edgecore 启动成功后,会与云端的 cloudcore 进行通信,并且边缘端会加入到 k8s 集群中,所以可以使用 kubectl 命令进行验证
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
edge1 Ready agent,edge 15m v1.18.6-kubeedge-v1.4.0-beta.0.242+8280082f9da41b
master1 Ready master 4d8h v1.16.2
node1 Ready node 4d5h v1.16.2
node2 Ready node 4d5h v1.16.2
在控制台也能够看到新加入的边缘节点。
5. 边缘计算应用Demo
这里拿官方的一个例子,进行测试。
KubeEdge Counter Demo 计数器是一个伪设备,用户无需任何额外的物理设备即可运行此演示。计数器在边缘侧运行,用户可以从云侧在 Web 中对其进行控制,也可以从云侧在 Web 中获得计数器值,原理图如下:
5.1 准备工作 (云端操作)
下载示例代码:
# 使用官方的示例仓库会比较慢,这里使用加速仓库
$ git clone https://hub.fastgit.org/kubeedge/examples.git $GOPATH/src/github.com/kubeedge/examples
创建 device model
$ cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
$ kubectl create -f kubeedge-counter-model.yaml
创建 model
#需要根据实际情况修改yaml文件,修改matchExpressions
$ cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
$ vim kubeedge-counter-instance.yaml
apiVersion: devices.kubeedge.io/v1alpha2
kind: Device
metadata:
name: counter
labels:
description: 'counter'
spec:
deviceModelRef:
name: counter-model
nodeSelector:
nodeSelectorTerms:
- matchExpressions:
- key: 'kubernetes.io/hostname'
operator: In
values:
- edge1
status:
twins:
- propertyName: status
desired:
metadata:
type: string
value: 'OFF'
reported:
metadata:
type: string
value: '0'
# 运行yaml
$ kubectl create -f kubeedge-counter-instance.yaml
5.2 部署云端应用
云端应用 web-controller-app 用来控制边缘端的 pi-counter-app 应用,该程序默认监听的端口号为 80,此处修改为 8089,如下所示:
$ cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/web-controller-app
$ vim main.go
package main
import (
"github.com/astaxie/beego"
"github.com/kubeedge/examples/kubeedge-counter-demo/web-controller-app/controller"
)
func main() {
beego.Router("/", new(controllers.TrackController), "get:Index")
beego.Router("/track/control/:trackId", new(controllers.TrackController), "get,post:ControlTrack")
beego.Run(":8089")
}
构建镜像
#注意:构建镜像时,如果源码不在GOPATH对应的路径下,请将源码拷贝到GOPATH对应的路径下,如果开启了go mod请关闭。
$ make all
$ make docker
#这里会进行构建镜像操作
部署 web-controller-app
$ cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
$ kubectl apply -f kubeedge-web-controller-app.yaml
5.3 部署边缘端应用
修改代码并构建镜像
需要将 Makefile 中的 GOARCH 修改为 amd64 才能运行该容器。
$ cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/counter-mapper
$ vim Makefile
.PHONY: all pi-execute-app docker clean
all: pi-execute-app
pi-execute-app:
GOARCH=amd64 go build -o pi-counter-app main.go
docker:
docker build . -t kubeedge/kubeedge-pi-counter:v1.0.0
clean:
rm -f pi-counter-app
$ make all
$ make docker
部署 Pi Counter App
$ cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
$ kubectl apply -f kubeedge-pi-counter-app.yaml
# 说明:为了防止Pod的部署卡在`ContainerCreating`,这里直接通过docker save、scp和docker load命令将镜像发布到边缘端
$ docker save -o kubeedge-pi-counter.tar kubeedge/kubeedge-pi-counter:v1.0.0
$ scp kubeedge-pi-counter.tar root@192.168.159.201:/home
# 以下在边缘端执行
$ cd /
$ docker load -i kubeedge-pi-counter.tar
5.4 体验 demo
现在,KubeEdge Demo 的云端部分和边缘端的部分都已经部署完毕,如下:
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-7fcbcfdf95-84tjw 1/1 Running 0 4d5h 10.2.1.6 node1 <none> <none>
kube-7fcbcfdf95-g4dzs 1/1 Running 0 4d5h 10.2.2.6 node2 <none> <none>
kubeedge-counter-app-758b9b4ffd-28xq4 1/1 Running 0 4m34s 192.168.159.101 master1 <none> <none>
kubeedge-pi-counter-c69698d6-l7dmt 1/1 Running 0 107s 192.168.159.201 edge1 <none> <none>
访问测试
因为使用的 hostNetwork 模式,所以直接访问即可 。
选择ON
点击Execute
在边缘节点查看执行情况:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8ced25dc67e4 0c040c9b34a0 "/pi-counter-app pi-…" 5 minutes ago Up 5 minutes k8s_kubeedge-pi-counter_kubeedge-pi-counter-c69698d6-l7dmt_default_c01ecd79-daa6-4b6b-a600-f6c71f228167_0
88f4400bda21 kubeedge/pause:3.1 "/pause" 6 minutes ago Up 6 minutes k8s_POD_kubeedge-pi-counter-c69698d6-l7dmt_default_c01ecd79-daa6-4b6b-a600-f6c71f228167_0
$ docker logs -f 8ced25dc67e4
5.5 源码分析
5.5.1 代码结构
代码主要包含3部分:
1、 web-contoller-app:云端应用,用以控制边缘端
2 、counter-mapper:边缘端应用,用以计数
3 、crds:资源文件,用以部署应用
(1)kubeedge-web-controller-app.yaml:用以部署云端web应用
(2)kubeedge-pi-counter-app.yaml:用以部署边缘端应用
(3)kubeedge-counter-model.yaml:Device Model,描述设备的元信息,包括序列号、资产标识符、Mac地址等描述设备的详细信息,也可以称为设备的静态属性或设备属性。
(4)kubeedge-counter-instance.yaml:Device,描述设备的动态数据,包括特定背景下的设备专有实时数据,例如灯的开、关状态,也可以称为设备的孪生属性。设备孪生同时记录设备的Actual State(真实状态)和Expected State(期望状态),这种方式也使设备在离线状况下再次上线时,设备的状态也能得到同步。
status:
twins:
- propertyName: status
desired: # 期望状态
metadata:
type: string
value: 'OFF'
reported: # 真实状态
metadata:
type: string
value: '0'
5.5.2 代码说明
5.5.2.1 云端应用:web-controller-app
1、部署文件:kubeedge-web-controller-app.yaml
2、web开发采用Beego框架。
主要页面为views\content.html,主要JS为static\js\track.js,页面控制类为controller\trackController.go。
3、应用提供3个功能:开、关边缘端的计数功能,以及获取当前计数。
4、通过调用k8s API,逐层往下调用(远端、边缘端、MQTT), 最终实现与边缘端交互的目的。
5.5.2.2 边缘端应用:counter-mapper
1、主程序入口为main.go的main方法
2、通过订阅消息$hw/events/device/counter/twin/update
获取来自云端的指令