Skip to main content

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设备的模块定义, 包括系统模块EdgeAgentEdgeHub
    • 定义用于保存模块的镜像库的地址, 以及可选的认证信息。
    • 配置模块的创建和管理规则(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 EdgeIoT Hub定义了两个部署类型:

  • 自动部署(Automatic Deployment)
  • 分层部署(layered Deployment)

我们在之前讨论过每个一个IoT Edge设备只能应用一个部署,这里的部署指的的是自动部署(Automatic Deployment), 也就是说每个设备上只能有一个自动部署生效,如果在一个设备上应用了一个部署,重新再应用一个新版本的部署,那么之后的部署会覆盖之前的设置和定义。不过除了自动部署之外,IoT Edge提出另外一个概念,分层部署(layered deployment), 一个设备上可以部署多个分层部署,如果多个不同的分层部署同时定义了相同的模块,但是定义了不同的配置,部署使用优先级来决定应用哪个分层部署的配置,优先级高的配置覆盖优先级低的配置。

注意
系统模块edgeAgentedgeHub两个模块不能应用于分层部署,两个系统模块只能使用在标准的自动部署里。

除了我们上面介绍的部署清单,自动部署、及分层部署之外,部署还有如下的要点:

  • 部署的目标设备该如何选择
  • 部署的优先级
  • 部署的状态监控

注意
部署的动作和信息的保存仍然是在IoT Hub中。

部署的目标选择

每一个部署都需要选择哪些设备会应用该部署,IoT Hub使用设备下述三个要素来选择目标设备:

  1. 设备的tags
  2. 孪生设备的上报属性(Device Twin reported Property)
  3. 设备的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部门进行测试,分别是Module1Module2, 开发部门和测试部门想使用任何一台安装好IoT Edge runtime的环境连上IoT Hub后能够自动帮助他们安装自己所需要的环境,无需云管理员更多的介入。

云管理员的最佳方案

为了使用自动化部署,云管理员需要遵行如下的最佳步骤:

  1. 使用工具(Azure Portal, 或者Azure cli或者使用SDK自行开发的工具)创建多个IoT Edge设备,并在设备里添加tags:

     "tags": {
         "department": "dev"
     },
    

    如果是qa的设备,那么这个值就是qa

  2. 使用工具(Azure Portal或者自行开发的工具)向IoT Hub添加一个标准的自动部署和两个分层部署:
    标准的自动部署用于向qadev的设备部署系统模块edgeAgentedgeHub,使用条件tags.department = 'dev' or tags.department = 'qa'
    分层部署模块,分别向dev的设备安装模块ModuleDevqa设备安装模块module1module2

使用Azure Portal演示

我们使用Azure Portal进行演示这个过程。

  1. 首先登录到Azure Portal, 找到您的IoT Hub资源,在左侧的菜单找到IoT Edge,进入IoT Edge设备的管理,然后选择:



  2. 创建开发部门使用的设备:



    在设备ID里输入DevTestDevice1, 然后保存就可以了,其他都是默认值,需要注意,默认值是选择通过SAS key来链接IoT Hub

  3. 返回设备的列表,选中刚刚创建的设备,我们需要给这个设备添加一些tags,用于部署:

    点击菜单Device Twin之后,然后在编辑框里添加如下的内容:
    如图所示我们添加的内容是:
    如图所示我们添加的内容是:

        "tags": {
            "department":"dev"
        }

4.使用同样的步骤给qa部门添加设备,并且调整设备的tags.department='qa', 如上述步骤所示。

5. 我们先创建一个标准的自动部署,这个部署同时应用于devqa部门的机器:


如上图所示我们选择IoT Edge Deployment, 然后选择Add Deployment 表示添加一个标准的自动部署。


输入标准自动部署的名称dev_and_qa_basic_deployment, 可以考虑添加一些标签,方便之后对部署进行管理,例如我们这里添加了department, 值是dev,qa, 表示同时应用于devqa, 以及版本号。


我们这次的部署,主要是为了给设备添加系统模块edgeAgentedgeHub, 因此,这里选择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的部署,我们先学习到这里,后继文章会更进一步展开学习。