作者

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

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

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

背景

随着物联网的发展,连接云的设备种类和数量越来越多,2020年全球物联网设备已高达126亿个,并且还以每年百分之十几的速度在增长。对众多的设备进行统一管控和众多设备产生的数据进行处理是无法回避的难题。

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官网,有关 EdgeX Foundry 的更多资料可参考其官网,及EdgeX Foundry Github

  • 所有参数可自定义

    我们是以 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 集群

安装 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 相关文章:

落地案例相关资料:

【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!

手把手教你在 SuperEdge 上用 EdgeX Foundry 接入 IoT 设备的更多相关文章

  1. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(四)-使用Travis自动部署Hexo(2)

    前言 前面一篇文章介绍了Travis自动部署Hexo的常规使用教程,也是个人比较推荐的方法. 前文最后也提到了在Windows系统中可能会有一些小问题,为了在Windows系统中也可以实现使用Trav ...

  2. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(三)-使用Travis自动部署Hexo(1)

    前言 前面两篇文章介绍了在github上使用hexo搭建博客的基本环境和hexo相关参数设置等. 基于目前,博客基本上是可以完美运行了. 但是,有一点是不太好,就是源码同步问题,如果在不同的电脑上写文 ...

  3. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(二)-Hexo参数设置

    前言 前文手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置介绍了github注册.git相关设置以及hexo基本操作. 本文主要介绍一下hexo的常用参数设置. ...

  4. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置

    前言 有朋友问了我关于博客系统搭建相关的问题,由于是做开发相关的工作,我给他推荐的是使用github的gh-pages服务搭建个人博客. 推荐理由: 免费:github提供gh-pages服务是免费的 ...

  5. 手把手教你在Ubuntu上分别安装Nginx、PHP和Mysql

    手把手教你在Ubuntu上分别安装Nginx.PHP和Mysql

  6. 手把手教你MyEclipseUML建模(上)

    手把手教你MyEclipseUML建模(上) 转 https://blog.csdn.net/qq_37939251/article/details/83444359 1.用UML 1建模 MyEcl ...

  7. 手把手教你在Ubuntu上安装Apache、MySql和PHP

    1:首先安装apache:打开终端(ctrl+Alt+t), 输入命令:sudo apt-get install apache2即可安装, 安装完后,打开浏览器,在地址栏输入:localhost或者h ...

  8. 手把手教你在ubuntu上安装apache和mysql和php

    1:首先安装apache:打开终端(ctrl+Alt+t), 输入命令:sudo apt-get install apache2即可安装, 安装完后,打开浏览器,在地址栏输入:localhost或者h ...

  9. 手把手教你在openshift上搭建wordpress博客(二)

    相同公布于:http://www.longgaming.com/archives/128 推荐前往阅读 这一篇文章主要介绍一些经常使用插件的使用和配置. 下面是我个人安装的一些插件.大家能够依据须要自 ...

随机推荐

  1. lis分析之一一批处理(任务)如何连接数据库的

    public class ZFBCheckAccountTask extends TaskThread { } 这个类运行时候自动加载了数据库连接,不明白是如何提前加载的,开始用static { } ...

  2. 17Java进阶——反射、进程、Java11新特性

    1.Java反射机制 Java反射(Reflection)概念:在运行时动态获取类的信息以及动态调用对象方法的功能. 1.1反射的应用--通过全类名获取类对象及其方法 package two.refl ...

  3. PHP 后台数组数据 传输给前台JS 使用

    一. PHP: $a = array('aaa','bbb'); $a= json_encode($a); JS: var a_json = {$a};   //此处a_json数组便可使用 二. H ...

  4. php-socket通信演示

    client: error_reporting(E_ALL); set_time_limit(0); echo "<h2>TCP/IP Connection</h2> ...

  5. JavaScript-编译与闭包

    编译原理 尽管 JavaScript 经常被归类为"动态"或"解释执行"的语言,但实际上它是一门编译语言.JavaScript 引擎进行的编译步骤和传统编译语言 ...

  6. appium自动化测试(5)-一些pyhon操作

    1.套件的问题 将所有的测试用例加进去,会一个个执行,用于用例名字没有规范test开头的时候 def suite(): suite = unittest.TestSuite suite.addTest ...

  7. 30K入职腾讯,全靠这份606页的Android面试指南

    前言 光阴似箭,日月如梭,时间真的过得飞快. 加上实习,从事 Android 开发,差不多有 5 年了.在上家公司职务.薪酬感觉已经到达了天花板,没有上升的余地.而且在这家公司过于安逸了,想换个有挑战 ...

  8. JSON.stringify()的用法

    **JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串,而我们一般只是用了第一个参数,没有在意过第二个以及第三个参数的妙用** **1.最常用的方式:** ...

  9. 【ShardingSphere技术专题】「ShardingJDBC」SpringBoot之整合ShardingJDBC实现分库分表(JavaConfig方式)

    前提介绍 ShardingSphere介绍 ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC.Sharding-Proxy和Shardin ...

  10. 【XSS-labs】level 16-20

    Level 16 查看源码:发现 空格 / 和script都被转义了. 用img标签的onerror事件(在加载外部文档或图片出错后触发),空格用%0a绕过,  payload如下: <img% ...