查看原文
其他

手把手教你在 SuperEdge 上用 EdgeX Foundry 接入 IoT 设备

泓乔,王冬,腾飞 腾讯云原生 2022-11-21

连泓乔,华南理工计算机科学与技术大三在读,主要研究容器领域,Kubernetes、容器等云原生技术爱好者,SuperEdge 优秀贡献者。


王冬,腾讯云研发工程师,专注于 Kubernetes、容器等云原生领域,SuperEdge 核心开发人员,现负责腾讯云边缘容器 TKE Edge 私有化相关工作。

李腾飞,腾讯容器技术研发工程师,腾讯云 TKE 后台研发,SuperEdge 核心开发成员。

背景

随着物联网的发展,连接云的设备种类和数量越来越多,2020年全球物联网设备已高达126亿个[1],并且还以每年百分之十几的速度在增长。对众多的设备进行统一管控和众多设备产生的数据进行处理是无法回避的难题。
EdgeX Foundry 是一个开源的边缘设备管理平台,可以部署在网络边缘连接各设备和上层组件进行交互,对设备管理和控制有一套成熟的解决方案。部署 EdgeX Foundry 在边缘集群,可以进一步增强边缘集群的功能,同相比将 EdgeX Foundry 部署在中心云集群,可以利用边缘集群的优势,更大发挥 EdgeX Foundry 的功能。
  • EdgeX Foundry 运行在边缘需要一个边缘计算平台作为支撑,在中间起到承上启下的作用,上可连接到中心云,下可管控设备

  • 边缘计算平台需要 EdgeX Foundry 通用的设备管理能力,打通云边端,形成云边端一体化。二者相辅相成,互相补足,为云边端赋能。

方案设计

为了能让用户快速在边缘集群使用 EdgeX Foundry 的功能,我们提供了 EdgeX Foundry 在边缘集群的一键部署。通过配置相关文件,按层级分类,将命令集成到 edgeadm 的 addon 命令下,并进行了相应测试,减少可能的错误。使用户仅需简单几步,就可以轻松的在边缘集群上部署和使用 EdgeX Foundry 的功能。
本方案的优点
  • 完全原生

    我们对 EdgeX Foundry 没有任何修改,也没有任何封装,只是原生的部署。下一期我们会提供新的组件与 SuperEdge 及 Kubernetes 和 EdgeX Foundry 的对接,但是我们依然会保持所有组件及能力可选,以插件方式集成,不会强绑定用户使用任何额外的功能。
  • 组件可选

    我们对 EdgeX Foundry 集成目前支持到层级可选,后面我们还会继续细化,细化到组件可选,让用户完全按自己的意愿和业务需要去部署需要的组件。
    层级可选见 EdgeX Foundry 的架构图:

图片来源于EdgeX Foundry[2]官网,有关 EdgeX Foundry 的更多资料可参考其官网,及EdgeX Foundry Github[3]

  • 所有参数可自定义

    我们是以 yaml 模板方式集成的 EdgeX Foundry, 用户可修改 yaml 模板的任何参数,实现自己业务自定义的需求。

EdgeX Foundry 组件的安装

准备条件

执行以下命令下载 edgeadm 静态安装包,注意修改"arch=amd64"参数,目前支持[amd64, arm64],下载自己机器对应的体系结构,其他参数不变
arch=amd64 version=v0.6.0-beta.0 && rm -rf edgeadm-linux-* && wget https://attlee-1251707795.cos.ap-chengdu.myqcloud.com/superedge/$version/$arch/edgeadm-linux-$arch-$version.tar.gz && tar -xzvf edgeadm-linux-* && cd edgeadm-linux-$arch-$version && ./edgeadm
安装一个边缘集群可参考:一键安装边缘独立 Kubernetes 集群[4]

安装 EdgeX Foundry 的组件

执行以下命令,即可一键安装 EdgeX Foundry 的所有组件
./edgeadm addon edgex
如果得到以下成功提示,说明部署成功
Start install edgex-application-services.yml to your cluster
...
Deploy edgex-ui.yml success!
也可以通过以下命令添加所需组件到集群
./edgeadm addon edgex [flag]
可以通过./edgeadm addon edgex --help命令查看可以使用的 flag:
--app           Addon the edgex application-services to cluster.
--core          Addon the edgex core-services to cluster.
--device        Addon the edgex device-services to cluster.
--support       Addon the edgex supporting-services to cluster.
--sysmgmt     Addon the edgex system management to cluster
--ui            Addon the edgex ui to cluster.
例如只安装 core 服务层的相关组件,可运行
./edgeadm addon edgex --core
其他组件同上安装,替换 flag 即可。如需同时安装多个层级组件,可以同时添加多个 flag。
目前默认安装的 EdgeX Foundry v1.3 版本,如需安装其他版本的组件,可自行定制 EdgeX Foundry 组件的版本。
以上安装不包含 Security 层相关组件和配置,后期版本可能添加相关功能,也可在项目源文件中自行配置。
部署成功后,可以通过以下命令查看 Pod 和 Service 的部署情况
kubectl get -n edgex svc/pod
注意:如果出现同一层级的组件部分安装成功,部分安装失败,可直接重新执行安装命令进行更新和安装。如果已安装的组件出现异常无法运行,可以使用./edgeadm detach edgex [flag]对特定层级的组件进行卸载重装。卸载操作具体参考 下文中【 EdgeX Foundry 的卸载】。

EdgeX Foundry 的界面

访问 consul

从网页访问 core-consul 的服务的端口可以查看各组件的部署情况,其中30850是 core-consul 服务暴露的端口号。
curl http://localhost:30850/ui/dc1/services
如果显示红色叉号,说明组件安装失败,如果刷新仍然无效,可查看组件相应日志,排查失败情况,或者重新安装相应组件。

访问 UI

从网页通过访问 UI 服务的端口同样可以查看各组件是否正常部署,其中30040是 UI 服务暴露的端口号。
curl http://localhost:30040/
如果部署成功,则各项会有相应的条目生成。

EdgeX Foundry 的验证

连接设备

通过以下命令启动一个虚拟设备。
kubectl apply -f https://raw.githubusercontent.com/superedge/superedge/main/deployment/edgex/edgex-device-random.yaml
该命令会启动一个随机整数生成器的虚拟设备连接到 EdgeX Foundry,该设备会向 core-data 发送随机数,同时接收 core-command 的命令控制。

数据访问

通过以下命令从网页访问 core-data 的服务的端口查看上一步启动的随机数设备向 core 服务发送的最近10条数据,其中30080是 core-data 服务的端口号,Random-Integer-Generator01是以上文件安装的虚拟设备。

curl http://localhost:30080/api/v1/event/device/Random-Integer-Generator01/10

设备控制

查看可用命令

网页访问 core-command 服务可查看对虚拟设备进行的指令,包括 Put 指令和 Get 指令,其中 Put 用于下发命令,Get 用于获取命令,其中30082是 core-command 服务的端口号。
curl http://localhost:30082/api/v1/device/name/Random-Integer-Generator01

Put 指令

执行 Put 命令可以对虚拟设备进行控制,这里我们修改其产生随机数的范围,从网页中找到 Put 命令的 url,并执行以下命令:
curl -X PUT -d '{"Min_Int8": "0", "Max_Int8": "10"}' http://localhost:30082/api/v1/device/2a20be3f-d9e6-4032-aeba-23f602d99a63/command/646fb3c7-f8bc-4b4f-bbad-d566777582d1
这里将虚拟设备的生成数范围改为0到10,并执行 Put 命令。
此处仅为例子,具体 url 由显示的 Put命令的 url 得到,请记得将edgex-core-command:48082字段改为localhost:30082,将{}内的内容改为可用的参数,可修改的参数由之前查询命令的显示中得到。其中30082是 core-command 服务的端口号。

Get 指令

从上面的网页内容中可以得到 Get 命令的 url,使用 Get 的 url 可以获取随机数设备发来的数据。
curl http://localhost:30082/api/v1/device/2a20be3f-d9e6-4032-aeba-23f602d99a63/command/646fb3c7-f8bc-4b4f-bbad-d566777582d1
此处仅为例子,具体 url 根据显示获取,请记得将edgex-core-command:48082字段改为localhost:30082, 其中30082是 core-command 服务的端口号。
可以看到随机数设备产生的随机数已经变成了[0,10]范围。

数据导出

执行以下命令部署一个将 EdgeX Foundry 的数据导出至云端的组件。
kubectl apply -f  https://raw.githubusercontent.com/superedge/superedge/main/deployment/edgex/edgex-app-service-configurable.yaml
启动该组件,该组件可以将 core-data 中的数据导出到 HiveMQ 的公开的 MQTT Broker 上。可以通过网页访问该代理查看数据是否成功导出到云端。访问以下网址进入网页。
http://www.hivemq.com/demos/websocket-client/
点击 connect 进行连接,填写主题为 EdgeXEvents。
即可看到 message 一栏出现虚拟设备向 EdgeX Foundry 发送的数据。
但是,由于这是公有的 Broker,多方多次上传的数据都会保留并共存在相应的主题下,所以即使 message 一栏有数据显示,可能是之前导出操作遗留的数据。
要想真正验证是否导出成功,可以在 connect 后尝试创建一个新主题,该主题尚无 message 显示,再修改 mqtt.yaml 中env下的Writable_Pipeline_Functions_MQTTSend_Addressable_Topic的值为该主题,部署后查看 Broker 网页中是否有数据出现,若有,说明真正导出成功。
注意:如果上述操作中出现网页无法访问等异常,请重新查看 Pod 情况,必要时进行卸载重装。

EdgeX Foundry 的卸载

如果是执行./edgeadm addon edgex安装了所有组件或者自定义安装了所有层级组件的,可以执行以下命令将所有 EdgeX Foundry 卸载,同时卸载在主机上产生的挂载数据。如果只是安装了部分层级或者有部分组件缺失的,请根据后文中的通过添加 flag 的方式逐个层级卸载。
./edgeadm detach edgex
出现以下成功显示,说明卸载完成。
Detach edgex-application-services.yml success!
...
Detach edgex-configmap.yml success!
Detach edgex completely success!
也可执行./edgeadm detach edgex [flag]对 EdgeX Foundry 进行卸载,可以通过./edgeadm detach edgex –-help命令查看可以使用的 flag:
--app             Detach the edgex application-services from cluster.
--core            Detach the edgex core-services from cluster.
--device          Detach the edgex device-services from cluster.
--support        Detach the edgex supporting-services from cluster.
--sysmgmt       Detach the edgex system management from cluster.
--ui              Detach the ui from cluster.
--completely   Detach the configmap and volumes from cluster.
如需卸载 core 服务的相关组件,可运行。
./edgeadm detach edgex –-core
其他组件删除操作同上,替换 flag 即可,支持多个 flag 同时删除多个层级的组件。可以通过以下命令查看所有 pod 是否已删除。
kubectl -n edgex  get deploy

注意

  • 如果删除中出现错误,导致某一层级的组件部分已删除,部分未删除,则对该层级重新执行删除操作将失败,需用 addon 对该层级所有组件重装,再进行删除。

  • ./edgeadm detach edgex仅适用于所有层组件都存在的情况,如仅存部分组件,请手动进行删除。

后期计划

目前我们实现了和 EdgeX Foundry 集成的第一步。
我们的目标如下面这张图:
是彻底打通云边端,形成云边端完全的一体化。EdgeX Foundry 也不是我们设备管理方案唯一的选择,我们后续还会和更多的边缘设备平台进行集成和抽象,为更通用的多平台边缘设备无缝接入而奋斗。
如果在使用中遇到相关问题或有改进意见,可添加小助手进群和我们一起讨论,或者在 SuperEdge 社区提 Issues。

SuperEdge 相关文章:

落地案例相关资料:

参考资料

[1]

2020年全球物联网设备已高达126亿个: 【https://mp.ofweek.com/iot/a556714409057】

[2]

EdgeX Foundry: 【https://www.edgexfoundry.org/why_edgex/why-edgex】

[3]

EdgeX Foundry Github: 【https://github.com/edgexfoundry】

[4]

一键安装边缘独立 Kubernetes 集群: 【https://github.com/superedge/superedge/blob/main/docs/installation/install_edge_kubernetes_CN.md】


互动赢好礼


精读文章,回答问题赢好礼










Q1: 如何实现像操作 K8s 资源一样操作边缘设备,对边缘设备执行相应的指令操作?

Q2: SuperEdge 想和众多的 IoT 设备平台进行通用化对接,您能想到的方式是什么?


精读本文,回答以上2个问题。至9月7日上午11点前,将从留言处选出答案最优质及点赞数量最高的前5名送腾讯定制T恤一件






  往期精选推荐  

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存