(⊙o⊙)?原来边缘计算是这么开发的!

news/2024/11/2 3:28:58/

边缘计算

  • 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-apiserverEdgeCore的通信桥梁。
  • DeviceController:一个扩展的k8s控制器,负责管理节点设备,同步云端和边缘端的设备元数据和状态。

3.3. 边缘端

  • EdgeHub:一个web socket客户端,负责云端与边缘端的信息交互,其中包括将云端的资源变更同步到边缘端及边缘端的状态变化同步到云端。它充当边缘与云之间的通信链接。

  • Edged:运行在边缘节点,管理节点生命周期。可以帮助用户在边缘节点上部署容器化的工作负载或应用程序。 这些工作负载可以执行任何操作,从简单的遥测数据操作到分析或ML推理等。使用kubectl云端的命令行界面,用户可以发出命令来启动工作负载。

  • EventBus:一个MQTT客户端,充当用于发送/接收有关mqtt主题的消息的接口。与MQTT服务端交互,提供发布/订阅的能力。

  • ServiceBus:一个HTTP客户端,与HTTP服务端交互。为云组件提供HTTP客户端功能,以访问在边缘运行的HTTP服务器。

  • DeviceTwin:负责存储设备状态并同步设备状态到云端,同时提供应用的接口查询。

  • MetaManager:edgededgehub之间的消息处理器,负责向轻量数据库(SQLite)存储或查询元数据。

4. 部署

4.1环境准备

我们在上篇文章中安装好的k8s基础上再增加1台边缘端节点。

从零开始学习部署K8S:https://blog.csdn.net/shyflea/article/details/119758389

注意:往下操作前要先安装好K8S!!!

主机信息如下,系统均采用Centos7.x。

类型IP地址主机名内存CPU部署服务
云端192.168.159.101master14G2k8s、docker、cloudcore
云端192.168.159.102node12G1docker
云端192.168.159.103node22G1docker
边缘端192.168.159.201edge11G1docker、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: counterlabels:description: 'counter'
spec:deviceModelRef:name: counter-modelnodeSelector:nodeSelectorTerms:- matchExpressions:- key: 'kubernetes.io/hostname'operator: Invalues:- edge1status:twins:- propertyName: statusdesired:metadata:type: stringvalue: 'OFF'reported:metadata:type: stringvalue: '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 mainimport ("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-apppi-execute-app:GOARCH=amd64 go build -o pi-counter-app main.godocker:docker build . -t kubeedge/kubeedge-pi-counter:v1.0.0clean: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        

image-20201104231652269

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: statusdesired:  # 期望状态metadata:type: stringvalue: 'OFF'reported: # 真实状态metadata:type: stringvalue: '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获取来自云端的指令


http://www.ppmy.cn/news/335592.html

相关文章

DNA 11. 识别肿瘤蛋白质三维结构上突变热点(HotSpot3D)

点击关注&#xff0c;桓峰基因 桓峰基因 生物信息分析&#xff0c;SCI文章撰写及生物信息基础知识学习&#xff1a;R语言学习&#xff0c;perl基础编程&#xff0c;linux系统命令&#xff0c;Python遇见更好的你 125篇原创内容 公众号 桓峰基因公众号推出基于基因组变异数…

Arcgis for Js之加载wms服务

概述:本节讲述Arcgis for Js加载ArcgisServer和GeoServer发布的wms服务。 1、定义resourceInfo var resourceInfo = { extent: new Extent(-126.40869140625,31.025390625,-109.66552734375,41.5283203125,{wkid: 4326}),…

WEB 视频开发-主流协议 HLS DASH

作者 | 翁鹏 42 上篇文章介绍了 MSE 来播放流媒体&#xff0c;但是 WEB 视频开发并不只依靠 MSE。这篇文章就来介绍主流的两种协议 HLS 和 DASH&#xff0c;以及如何制作并使用支持这些协议开源的客户端库来播放视频。 HLS HLS (HTTP Live Streaming) 是苹果公司开发的流媒体传…

用Eclipse开发Java语言程序,32单片机,51单片机和C语言程序(全部使用开源软件)

1 前言 1.1 本文适合不懂eclipse的开发者&#xff0c;由于所有东西都是开源的&#xff0c;所以你只需百度一下那些软件的名字就可以去它的官网里下载他们的最新版本了 1.2 重要提示&#xff1a;这篇文章的前后关联性很强&#xff0c;比如&#xff1a;你想建立32的标准库版工程…

Matlab中数值类型(三)

目录 创建复数 无穷大和 NaN 无穷大 NaN 确定数值类 数值的显示格式 合并不同的整数类型 合并不同大小的整数的示例 合并有符号与无符号整数的示例 合并整数与非整数数据 空矩阵 创建复数 复数由两个单独的部分组成&#xff1a;实部和虚部。基本虚数单位等于 -1 的平…

B-plus开发像高级驾驶员辅助系统 技术详解

[TOC]B-plus开发像高级驾驶员辅助系统(B-plus开发像高级驾驶员辅助系统) B-plus是汽车行业的一个既定的和公认的合作伙伴。凭借强大的专注于未来技术&#xff0c;B-plus开发像高级驾驶员辅助系统&#xff08;ADAS&#xff09;&#xff0c;安全控制单元&#xff0c;路侧环境和室…

oracle11g dbf恢复数据库,dbf文件如何恢复数据库

数据文件丢失如何恢复 摘要&#xff1a; 数据文件丢失如何恢复,内容来自以下讨论&#xff1a;http://www.itpub.net/348275.html数据库归档模式&#xff0c;新建表空间testtbs&#xff0c; 数据文件testtbs.dbf关闭数据库删除数据文件testtbs.dbf启动数据库提示&#xff1a;ORA…

Linux开发环境搭建

在VMware中安装CentOS7 进入CentOS下载官网&#xff0c;找到64位的CentOS7版本。 点进来后&#xff0c;发现它给我们列出了所在区域可用镜像源&#xff08;可以说是非常的良心的&#xff09;&#xff0c;我们随便选择一个&#xff0c;这里以阿里云的为例&#xff1a; 选择标准的…