Azure IoT Edge的部署
分类: Azure物联网 ◆ 标签: #Azure #IoT Edge # ◆ 发布于: 2023-06-15 9:18:40

在Aure IoT
的产品和解决方案中,部署(Deployment
)是一个专有的名词,它是专用于IoT Edge
的名词,只有IoT Edge
有部署(Deployment
)的概念,同时需要注意的是一个IoT Edge
设备只有在应用了一个部署之后才能正常的运作,如果仅仅是将一个IoT Edge
设备通过配置链接到IoT Hub
, 而没有应用一个部署,设备还是会报错。
一个部署在实际应用中体现为一个部署清单(deployment mainfest
), 微软使用Json
文档来描述部署清单的详细内容,这些内容主要包括:
IoT Edge Agent
的孪生模块定义(module twin
:可以理解为逻辑模块, 保存在Azure IoT Hub
服务端), 包括如下的内容:- 应用于
IoT Edge
设备的模块定义, 包括系统模块EdgeAgent
和EdgeHub
。 - 定义用于保存模块的镜像库的地址, 以及可选的认证信息。
- 配置模块的创建和管理规则(
EdgeAgent
模块主要的作用是管理设备上的模块,EdgeHub
模块主要用于管理模块、子设备、IoT Hub
之间的通讯。)
- 应用于
IoT Edge EdgeHub
孪生模块定义,主要定义预期属性(desired property
), 定义模块、子设备,IoT Hub
之间的消息如何传递的。- 其他模块的预期属性的定义。
注意
在部署清单里(deployment mainfest
)里所有的定义都是必须定义在预期属性里desired property
。
部署清单的主要格式如下:
{ "modulesContent": { "$edgeAgent": { // 必须包含的元素 "properties.desired": { // IoT Edge Agent的预期属性定义 // 包括所有模块的镜像的地址以及可选的认证 } }, "$edgeHub": { // 必须包含的元素 "properties.desired": { // IoT Edge Hub的预期属性 //包括消息路由的定义 } }, "module1": { // 可选的模块定义 "properties.desired": { // 模块的预期定义 } }, "module2": { // 可选模块的定义 "properties.desired": { // 模块的预期定义 } } } }
每个部署清单里必须包含EdgeAgent
模块和EdgeHub
模块的配置,除了这两个模块之外,每一个IoT Edge
设备上最多部署50个其他的模块。
注意
部署还区分是标准的自动部署和分层部署,分层部署是不能包含系统模块的定义,详细说明请参考后面的内容。
自动部署和分层部署
除了部署清单之外,要使得部署真正生效,我们需要通过工具向Azure IoT Hub
的服务发出请求完成部署,IoT Edge
和IoT Hub
定义了两个部署类型:
- 自动部署(
Automatic Deployment
) - 分层部署(
layered Deployment
)
我们在之前讨论过每个一个IoT Edge
设备只能应用一个部署,这里的部署指的的是自动部署(Automatic Deployment
), 也就是说每个设备上只能有一个自动部署生效,如果在一个设备上应用了一个部署,重新再应用一个新版本的部署,那么之后的部署会覆盖之前的设置和定义。不过除了自动部署之外,IoT Edge
提出另外一个概念,分层部署(layered deployment
), 一个设备上可以部署多个分层部署,如果多个不同的分层部署同时定义了相同的模块,但是定义了不同的配置,部署使用优先级来决定应用哪个分层部署的配置,优先级高的配置覆盖优先级低的配置。
注意
系统模块edgeAgent
和edgeHub
两个模块不能应用于分层部署,两个系统模块只能使用在标准的自动部署里。
除了我们上面介绍的部署清单,自动部署、及分层部署之外,部署还有如下的要点:
- 部署的目标设备该如何选择
- 部署的优先级
- 部署的状态监控
注意
部署的动作和信息的保存仍然是在IoT Hub
中。
部署的目标选择
每一个部署都需要选择哪些设备会应用该部署,IoT Hub
使用设备下述三个要素来选择目标设备:
- 设备的
tags
值 - 孪生设备的上报属性(
Device Twin reported Property
) - 设备的ID
关于孪生设备的tags
的介绍,可以参考文章:https://www.azuredeveloper.cn/article/unerstand-what-is-device-twins-and-module-twins
例如我们可以使用如下的查询语句来定位本次部署需要应用到哪些设备:
"targetCondition": "tags.location='shanghai'",
或者:
"targetCondition": "tags.enviorment='dev'",
部署的优先级
我们前面介绍了每个设备只能应用一个标准的自动部署,如果有多个标准自动部署通过目标选择条件都选中了同一个设备,那么优先级高的部署被应用,优先级低的被忽略。这个规则适用于标准的自动部署,分层部署是优先级高的部署覆盖优先级低的部署。
部署优先级定义是一个正整数,数值越大,优先级越高。
例如:
"priority": 10,
部署的状态监控
系统默认在每一个部署中有如下默认指标用于监控部署的基本情况:
Targeted
: 表明这次的部署有多少个设备被选定Applied
: 表明此次部署有多少目标设备应用这次部署。Reporting Success
: 此次部署有多少个设备部署成功了。Reporting Failure
: 此次部署有多少个设备部署失败了。
用户还可以自定义需要监控的指标,关于如何自定义监控指标,我们之后的文章再来学习这个部分。
部署Demo
为了充分说明如何使用部署,我们借助一个案例来给大家进行演示。
案例背景
用户目前有两个环境,一个是开发环境(dev
), 一个是测试环境(qa
), 目前开发部门还在开发一个新的模块ModuleDev
, 需要持续对这个模块进行开发,但是已经提交了两个模块给QA
部门进行测试,分别是Module1
和Module2
, 开发部门和测试部门想使用任何一台安装好IoT Edge runtime
的环境连上IoT Hub
后能够自动帮助他们安装自己所需要的环境,无需云管理员更多的介入。
云管理员的最佳方案
为了使用自动化部署,云管理员需要遵行如下的最佳步骤:
使用工具(
Azure Portal
, 或者Azure cli
或者使用SDK
自行开发的工具)创建多个IoT Edge
设备,并在设备里添加tags
:"tags": { "department": "dev" },
如果是
qa
的设备,那么这个值就是qa
使用工具(
Azure Portal
或者自行开发的工具)向IoT Hub
添加一个标准的自动部署和两个分层部署:
标准的自动部署用于向qa
和dev
的设备部署系统模块edgeAgent
和edgeHub
,使用条件tags.department = 'dev' or tags.department = 'qa'
分层部署模块,分别向dev
的设备安装模块ModuleDev
和qa
设备安装模块module1
和module2
。
使用Azure Portal
演示
我们使用Azure Portal
进行演示这个过程。
首先登录到
Azure Portal
, 找到您的IoT Hub
资源,在左侧的菜单找到IoT Edge
,进入IoT Edge
设备的管理,然后选择:
创建开发部门使用的设备:
在设备ID里输入DevTestDevice1
, 然后保存就可以了,其他都是默认值,需要注意,默认值是选择通过SAS key
来链接IoT Hub
返回设备的列表,选中刚刚创建的设备,我们需要给这个设备添加一些
tags
,用于部署:
点击菜单Device Twin
之后,然后在编辑框里添加如下的内容:
如图所示我们添加的内容是:
如图所示我们添加的内容是:"tags": { "department":"dev" }
4.使用同样的步骤给qa
部门添加设备,并且调整设备的tags.department='qa'
, 如上述步骤所示。
5. 我们先创建一个标准的自动部署,这个部署同时应用于dev
和qa
部门的机器:
如上图所示我们选择IoT Edge Deployment
, 然后选择Add Deployment
表示添加一个标准的自动部署。
输入标准自动部署的名称dev_and_qa_basic_deployment
, 可以考虑添加一些标签,方便之后对部署进行管理,例如我们这里添加了department
, 值是dev,qa
, 表示同时应用于dev
和qa
, 以及版本号。
我们这次的部署,主要是为了给设备添加系统模块edgeAgent
和edgeHub
, 因此,这里选择Runtime Settings
。
如上图所示设置系统模块edgeAgent
如上图所示设置edge Hub
模块。
设置好两个模块之后,点击Apply
应用,返回,并下一步。
为了使得默认的消息可以被转发到IoT Hub
, 我们在配置系统模块的时候,设置一个主要的消息路由:
注意这里的名称设置为MainRoot
, 但是值设置为FROM /message/* INTO $upstream
, 关于消息的路由,我们后面的文章继续展开讲。
进入下一个界面之后,是选择监控指标,我们这里使用默认的监控指标,因此直接下一步,关于如何自定义指标,我们之后的文章也再展开讲。
配置指标之后,我们对部署的目标设备进行选择:
我们这里设置优先级为1
, 值越高,优先级越高。然后设定条件为tags.department =
devor tags.department = 'qa'
, 表示这个自动部署会自动应用到开发部门和测试部门所有的设备上。
至此我们只需要下一步create
就可以了,通过这个步骤就将自动部署创建起来了。
6. 创建一个分层部署,该分成部署应用于开发团队的设备:
回到IoT Edge Deployment
列表的界面,点击菜单Add Layered Deployment
, 出现的名称和版本界面可以做如下的填充:
然后在模块的配置页面:
考虑到开发和测试极大可能都是使用自己公司的docker
库,因此可以通过1, 2, 3, 4来设置公司自己的开发库的认证机制。
在设置应用到哪些设备的页面上,注意优先级要比之前的自动部署优先级高,同时条件仅仅是tags.department = 'dev'
, 只包括开发部门:
可以如上图设置自己的开发模块.
注意
上述的url, 地址名称均是为了演示,如果用户要根据自己的实际情况进行调整。
设定好了之后,就可以下一步保存了。
7. 创建另外一个分层部署,用于测试部门的设备部署:
使用和步骤6一致的步骤,区别在于模块的安装时要选择适合qa
部门的模块,以及应用设备条件选择时,选择tags.department = 'qa'
:
8. 返回列表观察部署的基本情况:
从上图中观察三个部署的目标和应用的结果,如果有实体的设备链接,就会返回应用成功和失败的指标。
注意
所有的部署一旦创建成功之后,会一直生效,如果有新设备连入IoT Hub
, 会被自动应用到新设备上。
关于IoT Edge
的部署,我们先学习到这里,后继文章会更进一步展开学习。