Skip to main content

深入学习Azure IoT Edge - 了解架构和系统模块

分类:  Azure物联网 标签:  #Azure #IoT Edge # 发布于: 2023-06-14 20:39:29

我们之前使用了一篇文章快速的介绍了Azure IoT Edge, 我们学习了简单的概念,以及如何快速的安装和配置好一个Azure IoT Edge Runtime, 我们本章来深入的学习一下Azure IoT Edge概念和用户,之后我们再以实际的动手教程来完善这个部分,关于快速的介绍,您可以参考文档: Azure IoT Edge快速介绍

什么是Azure IoT Edge Runtime

简单来讲,就是一个堆帮助用户将一个设备变为Azure IoT Edge设备的软件,如果您使用基于Deb包管理的系统来安装,那么它主要是包括两个包(Deb安装包):

  • aziot-edge
  • aziot-identity-service

如果是查看系统服务,主要包括如下服务:

  • aziot-edged
  • aziot-identityd
  • aziot-keyd
  • aziot-certd
  • aziot-tpmd

如果需要查看Azure IoT Edge Runtime提供的工具,那么主要是有:

ghw@Ubuntu1804:~$ sudo iotedge --help
iotedge 1.2.5
The iotedge tool is used to manage the IoT Edge runtime.

USAGE:
    iotedge [OPTIONS] <SUBCOMMAND>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -H, --host <HOST>    Daemon socket to connect to [env: IOTEDGE_HOST=]  [default: unix:///var/run/iotedge/mgmt.sock]

SUBCOMMANDS:
    check             Check for common config and deployment issues
    check-list        List the checks that are run for 'iotedge check'
    config            Manage Azure IoT Edge system configuration.
    help              Prints this message or the help of the given subcommand(s)
    list              List modules
    logs              Fetch the logs of a module
    restart           Restart a module
    support-bundle    Bundles troubleshooting information
    system            Manage system services for IoT Edge.
    version           Show the version information
ghw@Ubuntu1804:~$

同时我们在第一安装完成之后,我们还可以看到Azure IoT Edge默认有两个系统模块: edgeAgent以及edgeHub模块,如下所示:

ghw@Ubuntu1804:~$ sudo iotedge list
NAME             STATUS           DESCRIPTION      CONFIG
edgeAgent        running          Up 6 minutes     mcr.microsoft.com/azureiotedge-agent:1.2
edgeHub          running          Up 6 minutes     mcr.microsoft.com/azureiotedge-hub:1.2
ghw@Ubuntu1804:~$

这些是我们最直观的角度来观察的到底什么是Azure IoT Edge Runtime, 但是从设计和架构的角度,我们不仅仅要理解Azure IoT Edge是一些工具包或者服务,或者是软件包的集合,同时这个集合还要完成如下的一些功能:

  • 在设备上安装和更新相应的模块
  • 从软件的角度服务该设备和Azure IoT相关的安全。
  • 确保设备上的所有模型总是在运行。
  • Azure IoT Hub报告设备和设备模块的状态,监控设备。
  • 管理边缘设备和下挂设备之间的通讯。
  • 管理设备上Edge模块和Edge设备之间的通讯。
  • 管理Edge设备和Azure IoT Hub之间的通讯。
  • 管理Edge设备之间的通讯。

总结一下Azure IoT Edge Runtime的主要功能其实也就是分为两大类:

  • 通讯管理
  • 模块管理

Azure IoT Edge Runtime中由两个系统模块来分别负责这两种任务:

  • edgeAgent: 这个模块主要负责完成部署、管理、监控模块。
  • edgeHub: 该模块就主要负责通讯了。

什么是IoT Edge Agent

AKA edgeAgent系统模块,它的主要作用可以简单的归纳一下为:安装和实例化模块,保持它一直运行,并监控模块的运行,向Azure IoT Hub汇报模型的状态。

什么是模块(Module)

我们之前一直在提到Azure IoT Edge Runtime的两大功能之一是管理模块(module), 那么到底什么是模块呢?

模块(module)是和Azure IoT Hub中我们提到的Device 设备概念非常类似,我们可以作一个类比,如果我们的设备是指一个物理的可以连接Azure IoT Hub的单元,那么我们的模块(module)可以看作是一个用代码表示的"虚拟"单元, 它是表示为计算机代码,同时它是需要物理的设备来支撑的,也即模块一定是运行在某个设备上的。

Azure IoT Edge Runtime通过模块(module)让用户将部分业务逻辑转移到边缘计算设备上,同时由edgeAgent模块来管理模块的生命周期,在模块里面我们可以按照自己的要求完成代码的设计,例如可以使用SDK将其他的Azure服务也集成到模块里,例如Azure FunctionAI等等。需要注意的是在Azure IoT Edge Runtime中的模块必须是容器化的,对于模块请仔细考虑如下四个基本概念:

  • 模块镜像: 指的是容器化的,包含软件定义的软件包。
  • 模块实例: 是指由系统模块edgeAgent实例化并运行的进程。
  • 模块标识: 是指存储在Azure IoT Hub模块实例相关的部分信息。
  • 孪生模块(module Twin): 和孪生设备(device twin)是一个类似的概念,指的是一份保存在Azure IoT Hubjson文档,包含模块实例的状态信息,metadata, 配置等等信息。

一个模块是一个容器化的打包应用,同时这个模块是由系统模块edgeAgent来实例化,并保证它时刻都在运行,模块开完完成后上传到固定的库中,然后再部署到边缘设备上,一个模块可以部署到多个边缘设备上,也可以在一个边缘设备部署多次。

edgeAgent实例化一个模块成功后,edgeAgent会给模块一个标识,这个标识会存储在Azure IoT Hub上,用于定位和通讯。需要注意的是模块标识依赖于设备标识,例如一个命名模块DemoForPrice, 它所在的边缘设备名字为Stock, 那么edgeAtent会为这个模块创建一个标识名为:/devices/Stock/modules/DemoForPrice, 从这个标识也可以注意到,如果要将一个模块在一个边缘设备上部署多次,那么需要给这个模块的部署不同的命名。例如:/devices/Stock/modules/DemoForPrice1, 或者 /devices/Stock/modules/DemoForPrice2 等等。

Module Twins 孪生模块

每一个由edgeAgent启动的模块实例都有对应的孪生模块module twin, 保存在Azure IoT Hub的一个json文档。在Azure IoT Hub中,模块实例和module twin通过模块标识相关联。在Azure IoT Hub方案的设计中,module twindevice twin的概念设计是一摸一样的,唯一的不同是当我们使用Azure IoT SDK来实例化时,设备使用DeviceClient, 但是模块使用ModuleClient

edgeAgent是如何运行的

我们在之前有讨论,Azure IoT Edge Runtime启动了很多服务,如果已经不记得了,可以返回到文章之前的介绍去,我们发现Azure IoT Edge Runtime启动的时候,并没有一个服务叫edgeAgent, 相反我们是以runtime的模块的形式运行edgeAgent模块,那么这个模块是由哪个服务启动的呢?Azure IoT Edge Security Manager 服务来启动, 需要注意的是在1.2版本中,这个服务主要指aziot-identity-service, 加上module runtime两部分组成,Azure IoT Edge Security Manager的主要功能是:

  • 启动Azure IoT Edge设备
  • 服务以及设备认证
  • 监控边缘设备
  • 预置设备标识,管理设备
  • 确保客户端服务代理的操作安全性。

该服务主要包含三个组件:

  • Edge Module Runtime
  • HSM
  • TPM

借用官方的一张图来说明一下关系:


另外需要注意的是edgeAgent向Azure IoT Hub返回结果的一些状态码:

  • 200
  • 400 - 部署配置文件非法
  • 417 - 该边缘设备还没有一个合法的部署配置文件,新创建的IoT Edge设备都会报这样的错误,根据我们之前的文档配置一下就好了。
  • 412 - 部署配置文件的schemaVersion值非法
  • 406 - 边缘设备不在线。
  • 500 - IoT Edge Runtime出错。

什么是IoT Edge Hub

AKA edgeHub, 也即是Azure IoT Edge Runtime中的系统模块,这个模块专门负责通讯的管理,通讯管理也包含如下几个方面:

  • 边缘设备和云之间的通讯。
  • 边缘设备本地设备和设备,设备和模块,模块和云之间的通讯。
  • 认证和授权
  • 远程配置
  • 向云发送运行时的遥测数据。

从这些功能上来看,Azure IoT Edge Hub像是Azure IoT Hub的本地翻版,它所起的作用是一个在设备或者模块和云之间的代理服务器,一个子设备或者模块可以通过连接到Edge Hub和它是直接连接到Azure IoT Hub一样。需要注意的是EdgeHub不具备Azure IoT Hub的所有功能, 它会委托一些功能给Azure IoT Hub, 例如模块的认证等服务。

和云之间的通讯

如果需要减少Azure IoT Edge设备和云之间的通讯带宽,建议在edge设备和Azure IoT Hub之间的通讯使用AMQP协议,这样可以使用AMQP协议的连接复用特性来减少边缘设备和Azure IoT Hub之间的连接数,默认情况下,EdgeHub使用AMQP协议连接Azure IoT Hub, 对于通过edgeHub连接的子设备或者模块,EdgeHub通过逻辑连接的概念运行子设备或者模块连接到edgeHub

EdgeHub能够决定是否连接到Azure IoT Hub, 如果edgeHub因为某些原因无法连接Azure IoT hub, 它会将消息或者twin更新保存本地,等候连接恢复再同步到IoT Hub

本地通讯

我们前面介绍edgeHub像是Azure IoT Hub的本地版本,这就代表edgeHub是一个本地的消息代理服务器的实现,同时它支持AMQPMQTT协议。所以它在边缘设备本地实现了:

  • device-to-module
  • module-to-module
  • device-to-device

等消息模式, 目前edgeHub支持两种方式的消息代理机制:

  • Azure IoT Hub里一样的消息路由
  • edgeHub作为一个支持MQTT协议的消息代理服务器,直接用于消息的传递。

关于这个部分,我们后面在使用edgeHub进行IoT Edge module开发的时候再来详细的介绍。

认证和授权

EdgeHub会将这个部分委托给Azure IoT Hub

远程配置

EdgeHub通过module Twin来控制自己的行为和配置,包括:

  • 路由配置
  • 授权配置
  • MQTT Bridge配置。

边缘设备遥测数据

这个部分是指IoT Edge收集匿名的关于设备运行时以及系统模块的一些信息,上报给微软, 这些信息的作用是为了更好的改善产品,如果不希望上报可以采用如下的方式关闭(二选一):

  • 设置系统模块edgeAgent的环境变量SendRuntimeQualityTelemetry值为false
  • 使用Azure Portal部署模块的时候去掉这个选项,如下图: