Azure IoT Edge模块自动部署介绍
分类: Azure物联网 ◆ 标签: #Azure #IoT Edge # ◆ 发布于: 2023-06-14 21:19:42

我们之前讨论和学习的都是如何预置Azure IoT Edge
的设备,无论是对单个设备进行预置也好还是通过DPS
进行大量的设备预置也好,本质上都还是对Azure IoT Edge
设备本身的准备,但是对于IoT Edge
设备最大的功能是通过开发或者部署Azure IoT Edge
的模块来充分的发挥Azure IoT Edge
设备的最大作用。我们之前的文章也简单的介绍了如何快速的向单个设备进行模块部署,您可以参考这篇文章来回顾:https://www.azuredeveloper.cn/article/deploy-custom-module-to-linux-base-iot-edge, 我们本章以及后面的一章来学习如何通过自动部署来将模块部署到大量的Azure IoT Edge
设备上。
本章主要学习自动部署的概念,随后的一章是step by step的教程。
Azure IoT Edge
的自动部署通过在Iot Hub
上创建一个部署mainfest
,来触发自动部署,可以指定Iot Edge
设备来创建mainfest
, 也可以通过创建一个mainfest
, 然后指定条件来部署到多个设备上。IoT Edge
设备需要满足如下的条件才能在连接IoT Hub
之后接受自动部署:
- 有安装基础的操作系统
- 有安装基础的容器管理系统里,例如
moby
或者docker
。 - 预装了
IoT Edge runtime
部署的mainfest
文件
部署mainfest
文件是一个json
文档,这个文档内容定义了所有模块的元数据定义,以及通过条件指定了目标设备。
主要的元数据包括如下的内容:
- 模块版本
- 模块的类型
- 模块的状态(
running
,stopped
) - 重启的规则(
restart policy
) - 模块的镜像url以及镜像相关的信息。
- 模块数据的输入和输出路由定义(关于什么是路由,我们上一篇文章有讲:https://www.azuredeveloper.cn/article/how-to-understand-edge-hub-route)
如果模块的定义是在一个私有的容器库中,并且需要用户名和密码才能下载,那么这个部分的配置是要在系统模块edgeAgent
的配置中配置好。
目标设备的选定条件
Tips
这里需要注意的是,如果你定义了一个部署,但是在这个部署里没有指定目标设备的选定条件,那么这个部署不会生效。这一点非常重要。
目标设备的选定条件可以使用三个条件:
- 目标孪生设备的tags属性值(device twin), 例如
tags.location.region = 'Shanghai'
- 目标孪生设备的上报属性(
reported properties
) - 目标孪生设备的
deviceId
除了这三个条件之外,不能使用其他的条件来指定目标设备。
一些选择条件的例子:
- deviceId = 'your Device Id'
- tags.location.region = 'Shanghai'
- tags.location.region = 'Shanghai' AND tags.location.region = 'Beigjin'
- properties.reported.devicemodel = 'arm64'
另外对于设备筛选条件定义还有一些其他的特征:
- 只能使用上述说的三个值
- 需要引用值时只能使用单引号。
- 如果值中有单引号,需要使用两个单引号来逃逸。
- 允许使用数字,字母以及特殊字符:
()<>@,;:\\"/?={} \t\n\r
- 不允许使用如下字符:
/;
部署mainfest
的优先级
在mainfest
里使用正整数来表示优先级,数字越大优先级越高。需要注意的是针对于目标设备,如果同时有多个部署,只有高优先级的部署才会被部署,低优先级的部署不会被部署。如果目标设备有多个同优先级的部署被配合,那么只部署最新创建的那个部署。
部署的指标
默认情况部署只有四个指标:
- 符合部署选项的设备数
- 应用该部署的设备数
- 上报成功部署的设备数
- 上班部署失败的设备数。
除了默认的部署指标之外,还可以定义用户自定义的指标。例如用户可以查询模块edugeHub
的上报属性作为自定义指标:
SELECT deviceId FROM devices WHERE properties.reported.lastDesiredStatus.code = 200
分层部署
分层部署也是自动部署的一种,但是分层部署可以帮助用户不用创建多个独立的部署,而是可以合并多个部署并发到设备上,这里需要注意的是每个设备只能有一个标准的部署,但是可以有多个分层部署。分层部署和创建标准的自定义部署是一样的,包括mainfest
文件的定义,设备筛选条件等等,都是一样的定义,最佳实践推荐的是:创建一个标准的部署用于部署系统模块,这个标准的部署可以用于所有的设备,只要接入该IoT Hub
的设备都需要安装系统模块,然后使用分层部署来定义用户自己开发的模块,自行开发的模块可以使用设备筛选条件来部署,例如用户有视频监控的模块,有指标上报的模块,有数据分发的模块,不是所有的设备具备这些功能,例如某些设备可能就没有摄像头,那么它就可以不用安装视频监控的模块,这个时候可以利用孪生设备的tags属性来区分这些设备,只需要在这些部署里使用筛选条件进行筛选就可以了。
回滚部署
我们无法通过删除在IoT Hub
上的部署回滚已经应用的部署,如果要回滚已经应用的部署,需要创建一个新的部署,同时该部署的优先级要高于原有的部署,在这个新部署里回滚模块(或者删除,或者降低版本), 只有通过这种方式才能完成部署的回滚。
另外可以通过更新设备的tags
属性进行范围的控制,例如某些步骤的时候,只希望在少数设备上进行验证,可以通过service api来更新tags的属性,例如tags.phrase='test'
, 来对少数设备进行范围限制的验证,验证成功后,可以更改部署以及设备的tags,从而扩大到所有的设备上。