Учебник. Создание иерархии устройств IoT Edge

Область применения:IoT Edge 1.5 проверка mark IoT Edge 1.5 IoT Edge 1.4 проверка mark IoT Edge 1.4

Внимание

Поддерживаются выпуски IoT Edge 1.5 LTS и IoT Edge 1.4 LTS. IoT Edge 1.4 LTS заканчивается жизнью 12 ноября 2024 года. Если вы используете более ранний выпуск, см. статью Обновление IoT Edge.

Узлы Azure IoT Edge можно развертывать в сетях, упорядоченных в иерархических слоях. Каждый слой в иерархии — это устройство шлюза, которое обрабатывает сообщения и запросы от устройств, находящихся в слое под ним. Эта конфигурация также называется вложенным краем.

Иерархию устройств можно структурировать таким образом, чтобы только верхний слой был подключен к облаку, а нижние слои могут взаимодействовать только с соседними вышестоящий и нижними уровнями. Этот уровень сети является основой большинства промышленных сетей, которые соответствуют стандарту ISA-95.

В этом руководстве описано, как создать иерархию устройств IoT Edge, развернуть контейнеры среды выполнения IoT Edge на устройствах и настроить устройства локально. Выполните следующие задачи:

  • создавать и определять связи в иерархии устройств IoT Edge;
  • настраивать среду выполнения IoT Edge на устройствах в иерархии;
  • устанавливать согласованные сертификаты в иерархии устройств;
  • добавлять рабочие нагрузки на устройства в иерархии;
  • использовать модуль прокси-сервера API IoT Edge для безопасной маршрутизации трафика HTTP через один порт на устройствах нижнего слоя.

Совет

В этом учебнике содержится набор шагов, выполняемых вручную или автоматизированно, которые демонстрируют использование вложенных функций IoT Edge.

Если вы хотите полностью автоматизированное представление о настройке иерархии устройств IoT Edge, следуйте скрипту примера Azure IoT Edge для промышленного Интернета вещей. Этот основанный на скриптах сценарий развертывает виртуальные машины Azure в качестве предварительно настроенных устройств для имитации заводской среды.

Если вы хотите подробно ознакомиться с инструкциями по созданию иерархии устройств IoT Edge и управлению ими, ознакомьтесь с руководством по иерархиям шлюза устройств IoT Edge.

В этом учебнике определены следующие слои сети.

  • Верхний уровень: устройства IoT Edge на этом уровне могут подключаться непосредственно к облаку.

  • Более низкие уровни: устройства IoT Edge на уровнях ниже верхнего слоя не могут подключаться непосредственно к облаку. Для отправки и получения данных им нужно миновать одно или несколько промежуточных устройств IoT Edge.

Для простоты в этом учебнике используется иерархия двух устройств. Устройство верхнего уровня представляет устройство на верхнем уровне иерархии, которое может подключаться непосредственно к облаку. Это устройство называется родительским устройством. Устройство нижнего уровня представляет устройство на нижнем уровне иерархии, которое не может подключиться непосредственно к облаку. Вы можете добавить дополнительные устройства для представления рабочей среды по мере необходимости. Устройства на более низких уровнях называются дочерними устройствами.

Структура иерархии учебника, содержащая два устройства: устройство верхнего слоя и устройство нижнего слоя

Примечание.

Дочернее устройство может быть подчиненным устройством или устройством шлюза в вложенной топологии.

Необходимые компоненты

Чтобы создать иерархию устройств IoT Edge, вам потребуется:

  • Компьютер (Windows или Linux) с подключением к Интернету.

  • Учетная запись Azure с действительной подпиской. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начать работу.

  • Центр Интернета вещей ценовой категории "Бесплатный" или "Стандартный" в Azure.

  • Оболочка Bash в Azure Cloud Shell с помощью Azure CLI с установленным расширением Azure IoT. В этом учебнике используется Azure Cloud Shell. Чтобы просмотреть текущие версии расширений и модулей Azure CLI, выполните команду az version.

  • Два устройства Linux для настройки иерархии. Если у вас нет устройств, можно создать виртуальные машины Azure для каждого устройства в иерархии с помощью шаблона Azure Resource Manager IoT Edge. IoT Edge версии 1.5 предварительно установлен с помощью этого шаблона Resource Manager. Если вы устанавливаете IoT Edge на собственных устройствах, см. статью "Установка Azure IoT Edge для Linux " или "Обновление IoT Edge".

  • Чтобы упростить сетевое взаимодействие между устройствами, виртуальные машины должны находиться в одной виртуальной сети или использовать пиринг виртуальных сетей.

  • Убедитесь, что для всех устройств, кроме устройства самого низкого уровня, открыты для входящих подключений следующие порты: 443, 5671, 8883.

    • Порт 443 используется для вызовов REST API между родительским и дочерними центрами Edge и для извлечения образов из контейнеров Docker.
    • 5671, 8883: используется для AMQP и MQTT.

    Дополнительные сведения см. в статье Как открыть порты для виртуальной машины на портале Azure.

    Совет

    Вы используете дескриптор SSH и полное доменное имя или IP-адрес каждой виртуальной машины для настройки в последующих шагах, поэтому следите за этой информацией. Ip-адрес и полное доменное имя можно найти в портал Azure. Чтобы узнать IP-адрес, перейдите к списку виртуальных машин и запишите значение поля Общедоступный IP-адрес. Для полного доменного имени перейдите на страницу обзора каждой виртуальной машины и найдите поле DNS-имени. Для дескриптора SSH перейдите на страницу подключения каждой виртуальной машины.

Создание иерархии устройств IoT Edge

Устройства IoT Edge составляют слои вашей иерархии. В этом руководстве создается иерархия двух устройств IoT Edge: устройства верхнего уровня и устройства нижнего уровня. При необходимости можно создать более подчиненные устройства.

Чтобы создать и настроить иерархию устройств IoT Edge, используйте команду az iot edge devices create Azure CLI. Эта команда упрощает настройку иерархии, автоматив и уплотнив несколько шагов:

  • Создает устройства в Центр Интернета вещей
  • Задает отношения "родительский-дочерний" для авторизации обмена данными между устройствами
  • Применение манифеста развертывания к каждому устройству
  • Создает цепочку сертификатов для каждого устройства для установления безопасного взаимодействия между ними
  • Создает файлы конфигурации для каждого устройства

Создание конфигурации устройства

Вы создаете группу вложенных пограничных устройств с родительским устройством с одним дочерним устройством. В этом руководстве мы используем базовые примеры манифестов развертывания. Дополнительные примеры сценариев см. в шаблонах примеров конфигурации.

  1. Прежде чем использовать команду создания устройств az iot edge, необходимо определить манифест развертывания для устройств верхнего уровня и нижнего слоя. Скачайте deploymentTopLayer.json пример файла на локальный компьютер.

    Манифест развертывания устройства верхнего уровня определяет модуль прокси-сервера API IoT Edge и объявляет маршрут от устройства нижнего уровня к Центр Интернета вещей.

  2. Скачайте deploymentLowerLayer.json пример файла на локальный компьютер.

    Манифест развертывания устройства нижнего слоя включает модуль имитированного датчика температуры и объявляет маршрут к устройству верхнего уровня. В разделе systemModules можно увидеть, что модули среды выполнения настроены для извлечения из $вышестоящий:443, а не mcr.microsoft.com. Устройство нижнего слоя отправляет образ Docker запрашивает модуль прокси-сервера API IoT Edge через порт 443, так как он не может напрямую извлекать изображения из облака. Другой модуль, развернутый на устройстве нижнего уровня (модуль Simulated Temperature Sensor), также отправляет запрос на получение образа в $upstream:443.

    Дополнительные сведения о создании манифеста развертывания нижнего слоя см. в Подключение устройствах Azure IoT Edge для создания иерархии.

  3. В Azure Cloud Shell используйте команду az iot edge device create Azure CLI для создания устройств в Центр Интернета вещей и пакетах конфигурации для каждого устройства в иерархии. Замените следующие заполнители соответствующими значениями:

    Заполнитель Description
    <имя концентратора> Имя Центра Интернета вещей.
    <config-bundle-output-path> Путь к папке, в котором требуется сохранить пакеты конфигурации.
    <parent-device-name> Имя идентификатора родительского устройства верхнего уровня .
    <parent-deployment-manifest> Файл манифеста развертывания родительского устройства.
    <parent-fqdn-or-ip> Полное доменное имя родительского устройства (FQDN) или IP-адрес.
    <child-device-name> Имя дочернего устройства нижнего уровня .
    <дочерний манифест развертывания> Файл манифеста развертывания дочернего устройства.
    <child-fqdn-or-ip> Полное доменное имя дочернего устройства (FQDN) или IP-адрес.
    az iot edge devices create \
       --hub-name <hub-name> \
       --output-path <config-bundle-output-path> \
       --default-edge-agent "mcr.microsoft.com/azureiotedge-agent:1.5" \
       --device id=<parent-device-name> \
          deployment=<parent-deployment-manifest> \
          hostname=<parent-fqdn-or-ip> \
       --device id=child-1 \
          parent=parent-1 \
          deployment=<child-deployment-manifest> \
          hostname=<child-fqdn-or-ip>
    

    Например, следующая команда создает иерархию двух устройств IoT Edge в Центр Интернета вещей. Устройство верхнего слоя с именем parent-1 и устройство нижнего слоя с именем child-1*. Команда сохраняет пакеты конфигурации для каждого устройства в выходном каталоге. Команда также создает самозаверяющие тестовые сертификаты и включает их в пакет конфигурации. Пакеты конфигурации устанавливаются на каждом устройстве с помощью скрипта установки.

    az iot edge devices create \
       --hub-name my-iot-hub \
       --output-path ./output \
       --default-edge-agent "mcr.microsoft.com/azureiotedge-agent:1.5" \
       --device id=parent-1 \
          deployment=./deploymentTopLayer.json \
          hostname=10.0.0.4 \
       --device id=child-1 \
          parent=parent-1 \
          deployment=./deploymentLowerLayer.json \
          hostname=10.1.0.4
    

После выполнения команды можно найти пакеты конфигурации устройства в выходном каталоге. Например:

PS C:\nested-edge\output> dir

   Directory: C:\nested-edge\output

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           4/10/2023  4:12 PM           7192 child-1.tgz
-a---           4/10/2023  4:12 PM           6851 parent-1.tgz

Вы можете использовать собственные сертификаты и ключи, переданные в качестве аргументов в команду, или создать более сложную иерархию устройств. Дополнительные сведения о создании вложенных устройств с помощью команды az см. в статье az iot edge devices create. Если вы не знакомы с тем, как сертификаты используются в сценарии шлюза, ознакомьтесь с разделом сертификатов руководства.

В этом руководстве вы используете встроенные аргументы для создания устройств и пакетов конфигурации. Вы также можете использовать файл конфигурации в формате YAML или JSON. Пример файла конфигурации см. в примере sample_devices_config.yaml.

Настройка среды выполнения IoT Edge

Помимо подготовки устройств, шаги настройки позволяет установить доверенный обмен данными между устройствами в иерархии с использованием ранее созданных сертификатов. Эти шаги также начнут формировать сетевую структуру иерархии. Устройство верхнего уровня поддерживает подключение к Интернету, позволяя ему извлекать образы для своей среды выполнения из облака, а устройства нижнего слоя направляются через устройство верхнего слоя для доступа к этим изображениям.

Чтобы настроить среду выполнения IoT Edge, необходимо применить пакеты конфигурации к устройствам. Конфигурации отличаются между устройством верхнего уровня и устройством нижнего уровня, поэтому учитывайте файл конфигурации устройства, который вы применяете к каждому устройству.

  1. Скопируйте архивный файл пакета конфигурации на соответствующее устройство. Вы можете использовать USB-диск, службу, например Azure Key Vault, или функцию, например безопасную копию файлов. Выберите один из этих методов, которые лучше всего соответствуют вашему сценарию.

    Например, чтобы отправить пакет конфигурации parent-1 в домашний каталог на виртуальной машине parent-1, можно использовать следующую команду:

    scp ./output/parent-1.tgz admin@parent-1-vm.westus.cloudapp.azure.com:~
    
  2. На каждом устройстве извлеките архив пакета конфигурации. Например, используйте команду tar для извлечения архивного файла parent-1 :

    tar -xzf ./parent-1.tgz
    
  3. Задайте разрешение на выполнение скрипта установки.

    chmod +x install.sh
    
  4. На каждом устройстве примените пакет конфигурации к устройству с помощью корневого разрешения:

    sudo ./install.sh
    

    Установка пакетов конфигурации обновляет файлы config.toml на устройстве и автоматически перезапускает все службы IoT Edge.

    Если вы хотите более подробно узнать, какие изменения вносятся в файл конфигурации устройства, см. Подключение устройства Azure IoT Edge совместно для создания иерархии.

Чтобы проверить правильность настройки устройств, запустите конфигурацию и проверка подключения на устройствах.

sudo iotedge check
admin@child-1-vm:~$ sudo iotedge check

Configuration checks (aziot-identity-service)
---------------------------------------------
√ keyd configuration is well-formed - OK
√ certd configuration is well-formed - OK
√ tpmd configuration is well-formed - OK
√ identityd configuration is well-formed - OK
√ daemon configurations up-to-date with config.toml - OK
√ identityd config toml file specifies a valid hostname - OK
√ host time is close to reference time - OK
√ preloaded certificates are valid - OK
√ keyd is running - OK
√ certd is running - OK
√ identityd is running - OK
√ read all preloaded certificates from the Certificates Service - OK
√ read all preloaded key pairs from the Keys Service - OK
√ check all EST server URLs utilize HTTPS - OK
√ ensure all preloaded certificates match preloaded private keys with the same ID - OK

Connectivity checks (aziot-identity-service)
--------------------------------------------
√ host can connect to and perform TLS handshake with iothub AMQP port - OK
√ host can connect to and perform TLS handshake with iothub HTTPS / WebSockets port - OK
√ host can connect to and perform TLS handshake with iothub MQTT port - OK

Configuration checks
--------------------
√ aziot-edged configuration is well-formed - OK
√ configuration up-to-date with config.toml - OK
√ container engine is installed and functional - OK
√ configuration has correct parent_hostname - OK
√ configuration has correct URIs for daemon mgmt endpoint - OK
√ container time is close to host time - OK
‼ DNS server - Warning
    Container engine is not configured with DNS server setting, which may impact connectivity to IoT Hub.
    Please see https://aka.ms/iotedge-prod-checklist-dns for best practices.
    You can ignore this warning if you are setting DNS server per module in the Edge deployment.
‼ production readiness: logs policy - Warning
    Container engine is not configured to rotate module logs which may cause it run out of disk space.
    Please see https://aka.ms/iotedge-prod-checklist-logs for best practices.
    You can ignore this warning if you are setting log policy per module in the Edge deployment.
‼ production readiness: Edge Agent's storage directory is persisted on the host filesystem - Warning
    The edgeAgent module is not configured to persist its /tmp/edgeAgent directory on the host filesystem.
    Data might be lost if the module is deleted or updated.
    Please see https://aka.ms/iotedge-storage-host for best practices.
‼ production readiness: Edge Hub's storage directory is persisted on the host filesystem - Warning
    The edgeHub module is not configured to persist its /tmp/edgeHub directory on the host filesystem.
    Data might be lost if the module is deleted or updated.
    Please see https://aka.ms/iotedge-storage-host for best practices.
√ Agent image is valid and can be pulled from upstream - OK
√ proxy settings are consistent in aziot-edged, aziot-identityd, moby daemon and config.toml - OK

Connectivity checks
-------------------
√ container on the default network can connect to upstream AMQP port - OK
√ container on the default network can connect to upstream HTTPS / WebSockets port - OK
√ container on the IoT Edge module network can connect to upstream AMQP port - OK
√ container on the IoT Edge module network can connect to upstream HTTPS / WebSockets port - OK
30 check(s) succeeded.
4 check(s) raised warnings. Re-run with --verbose for more details.
2 check(s) were skipped due to errors from other checks. Re-run with --verbose for more details.

На устройстве верхнего уровня выходные данные будут содержать сведения о нескольких пройденных проверках. Возможно, вы увидите некоторые предупреждения о политиках журналов и политиках DNS (в зависимости от характеристик сети).

Развертывание модуля устройства

Развертывание модуля для ваших устройств было применено при создании устройств в Центр Интернета вещей. Команда az iot edge devices create применяет json-файлы развертывания для устройств верхнего и нижнего слоя. После завершения развертывания устройство нижнего уровня использует модуль прокси-сервера API IoT Edge для извлечения необходимых образов.

Кроме модулей агента IoT Edge и Центра IoT Edge для среды выполнения, устройство верхнего уровня получает модули реестра Docker и прокси-сервера API для IoT Edge.

Модуль реестра Docker указывает на существующий Реестр контейнеров Azure. В этом случае REGISTRY_PROXY_REMOTEURL указывает на Microsoft Container Registry. По умолчанию реестр Docker прослушивает порт 5000.

Модуль прокси-сервера API для IoT Edge направляет HTTP-запросы к другим модулям, позволяя устройствам нижнего уровня получать образы контейнеров или отправлять большие двоичные объекты в хранилище. В нашем случае он использует порт 443 и настроен так, чтобы отправлять запросы на вытягивание образов контейнеров Docker в модуль реестра Docker через порт 5000. Кроме того, все запросы на отправку в хранилище BLOB-объектов перенаправляются в модуль AzureBlobStorageonIoTEdge через порт 11002. Дополнительные сведения о модуле прокси-сервера API для IoT Edge и о его настройке см. в соответствующем руководстве.

Если вы хотите узнать, как создать подобное развертывание с помощью портала Azure или Azure Cloud Shell, см. раздел руководства по устройству верхнего уровня.

Состояние модулей можно проверить с помощью такой команды:

az iot hub module-twin show --device-id <edge-device-id> --module-id '$edgeAgent' --hub-name <iot-hub-name> --query "properties.reported.[systemModules, modules]"

Эта команда выводит все сообщаемые свойства edgeAgent. Вот некоторые из них, которые полезны для мониторинга состояния устройства: runtime status (состояние среды выполнения), runtime start time (время запуска среды выполнения), runtime last exit time (время последнего выхода среды выполнения), runtime restart count (число перезапусков среды выполнения).

Вы также можете проверить состояние модулей на портале Azure. Перейдите в раздел "Устройства" Центр Интернета вещей, чтобы просмотреть устройства и модули.

просмотр сформированных данных.

Модуль смоделированного датчика температуры, который вы развернули, генерирует выборку данных о состоянии окружающей среды. Он отправляет сообщения, которые содержат данные о температуре и влажности окружающей среды, температуре и давлении оборудования, а также метки времени.

Это также можно делать с помощью Azure Cloud Shell:

az iot hub monitor-events -n <iot-hub-name> -d <lower-layer-device-name>

Например:

az iot hub monitor-events -n my-iot-hub -d child-1
{
    "event": {
        "origin": "child-1",
        "module": "simulatedTemperatureSensor",
        "interface": "",
        "component": "",
        "payload": "{\"machine\":{\"temperature\":104.29281270901808,\"pressure\":10.48905461241978},\"ambient\":{\"temperature\":21.086561171611102,\"humidity\":24},\"timeCreated\":\"2023-04-17T21:50:30.1082487Z\"}"
    }
}

Устранение неполадок

Выполните команду iotedge check, чтобы проверить конфигурацию и устранить неполадки.

Вы можете выполняться iotedge check в вложенной иерархии, даже если подчиненные компьютеры не имеют прямого доступа к Интернету.

При запуске команды iotedge check на нижнем уровне иерархии программа пытается извлечь образ из родительского объекта через порт 443.

Значение azureiotedge-diagnostics извлекается из реестра контейнеров, связанного с модулем реестра. В этом руководстве задано значение по умолчанию https://mcr.microsoft.com:

Имя. Значение
REGISTRY_PROXY_REMOTEURL https://mcr.microsoft.com

Если вы используете частный реестр контейнеров, убедитесь, что все образы (IoTEdgeAPIProxy, edgeAgent, edgeHub, Simulated Temperature Sensor и diagnostics) находятся в реестре контейнеров.

Если нижнее устройство имеет другую архитектуру процессора от родительского устройства, вам потребуется соответствующий образ архитектуры. Вы можете использовать подключенный реестр или указать правильный образ для модулей edgeAgent и edgeHub в файле config.toml нижестоящего устройства. Например, если родительское устройство работает на архитектуре ARM32v7 и нижестоящем устройстве выполняется на архитектуре AMD64, необходимо указать соответствующий тег версии и образа архитектуры в файле config.toml нижестоящего устройства.

[agent.config]
image = "$upstream:443/azureiotedge-agent:1.5.0-linux-amd64"

"systemModules": {
   "edgeAgent": {
      "settings": {
            "image": "$upstream:443/azureiotedge-agent:1.5.0-linux-amd64"
      },
   },
   "edgeHub": {
      "settings": {
            "image": "$upstream:443/azureiotedge-hub:1.5.0-linux-amd64",
      }
   }
}

Очистка ресурсов

Чтобы избежать расходов, можно удалить локальные конфигурации и ресурсы Azure, созданные при работе с этой статьей.

Удаление ресурсов:

  1. Войдите в портал Azure и выберитеГруппы ресурсов.

  2. Выберите группу ресурсов, содержащую тестовые ресурсы IoT Edge.

  3. Просмотрите список ресурсов, содержащихся в группе ресурсов. Если вы хотите удалить их все, щелкните Удалить группу ресурсов. Если вы хотите удалить только некоторые из них, можно выбрать каждый ресурс, чтобы удалить их по отдельности.

Следующие шаги

При работе с этим учебником вы настроили два устройства IoT Edge в качестве шлюзов и настроили одно из них для выполнения роли родительского устройства для другого. Затем вы извлекли образ контейнера на нижнее устройство через шлюз с помощью модуля прокси-сервера API IoT Edge. Если вам хотите узнать больше, изучите инструкции по использованию модуля прокси-сервера.

Дополнительные сведения об использовании шлюзов для создания иерархических слоев устройств IoT Edge см. в следующей статье.