Как настроить параметры создания контейнера для модулей IoT Edge

Область применения:IoT Edge 1.4 checkmark IoT Edge 1.4

Важно!

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

Параметр createOptions в манифесте развертывания позволяет настраивать контейнеры модуля во время выполнения. Этот параметр расширяет возможности управления модулями и позволяет выполнять такие задачи, как разрешение или запрещение доступа модуля к ресурсам устройства узла, а также настройка сети.

Модули IoT Edge реализуются на устройстве IoT Edge как контейнеры, совместимые с Docker. Docker предлагает множество параметров создания контейнеров, и эти параметры применимы к модулям IoT Edge. Чтобы узнать больше, ознакомьтесь с параметрами создания контейнеров Docker.

Форматирование параметров создания

Манифест развертывания IoT Edge принимает параметры создания в формате JSON. Например, рассмотрим параметры создания, автоматически включаемые для каждого модуля edgeHub.

"createOptions": {
  "HostConfig": {
    "PortBindings": {
      "5671/tcp": [
        {
          "HostPort": "5671"
        }
      ],
      "8883/tcp": [
        {
          "HostPort": "8883"
        }
      ],
      "443/tcp": [
        {
          "HostPort": "443"
        }
      ]
    }
  }
}

В этом примере edgeHub используется параметр HostConfig.PortBindings, позволяющий сопоставить предоставленные порты в контейнере с портом на устройстве узла.

Если вы используете расширение Azure IoT Edge для Visual Studio или Visual Studio Code, можно написать параметры создания в формате JSON в файле deployment.template.json . Затем, когда это расширение будет использовано для создания решения IoT Edge или создания манифеста развертывания, оно преобразует эти параметры JSON в строку в формате, который ожидает среда выполнения IoT Edge. Например:

"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"

Внимание

Расширение Visual Studio Code Azure IoT Edge находится в режиме обслуживания. Средство iotedgedev — это рекомендуемое средство для разработки модулей IoT Edge.

Одним из советов по написанию параметров создания является использование команды docker inspect. В процессе разработки выполняйте модуль локально с помощью команды docker run <container name>. После того как модуль выполнит всю предназначенную ему работу, выполните команду docker inspect <container name>. Эта команда выводит данные модуля в формате JSON. Найдите настроенные вами параметры и скопируйте соответствующий код JSON. Например:

Screenshot of the results of the command docker inspect edgeHub.

Распространенные сценарии

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

Сопоставление порта узла с портом модуля

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

Совет

Это сопоставление портов не требуется для обмена данными между модулями на одном устройстве. Если модулю А требуется запросить API, размещенный в модуле Б, то он может сделать это без сопоставления портов. Модуль Б должен предоставлять порт в своем файле dockerfile, например: EXPOSE 8080. Затем модуль А может запросить API, используя имя модуля Б, например: http://ModuleB:8080/api.

Сначала убедитесь, что порт в модуле открыт для ожидания подключений. Это можно сделать с помощью инструкции EXPOSE в файле dockerfile. Например, EXPOSE 8080. Если значение не указано, по умолчанию инструкция EXPOSE задает протокол TCP. Можно также указать протокол UDP.

Затем используйте параметр PortBindings в группе HostConfigпараметров создания контейнера Docker, чтобы подключить предоставленный порт в модуле к порту на устройстве узла. Например, если вы предоставляли порт 8080 в модуле и хотите сопоставить его с портом 80 на устройстве узла, то параметры создания в файле template.js будут выглядеть, как в следующем примере:

"createOptions": {
  "HostConfig": {
    "PortBindings": {
      "8080/tcp": [
        {
          "HostPort": "80"
        }
      ]
    }
  }
}

После преобразования в строку для манифеста развертывания эта конфигурация будет выглядеть, как в следующем примере:

"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"8080/tcp\":[{\"HostPort\":\"80\"}]}}}"

Ограничение использования памяти и ЦП модулем

Можно объявить, какую часть ресурсов узла может использовать модуль. Это ограничение удобно и необходимо для того, чтобы один модуль не использовал слишком много ресурсов памяти или ЦП и не блокировал выполнение других процессов на устройстве. Вы можете управлять этими параметрами с помощью параметров создания контейнера Docker в группе HostConfig, включая следующие:

  • Memory: максимальный объем используемой памяти в байтах. Например, 268 435 456 байт = 256 МБ.
  • MemorySwap: общий максимальный объем памяти (память и файл подкачки). Например, 536870912 байт = 512 МБ.
  • NanoCpus: квота ЦП в единицах 10-9 (1 миллиард) ЦП. Например, 25000000 nanocpus = 0,25 ЦП.

В файле template.js эти значения будут выглядеть, как в следующем примере:

"createOptions": {
  "HostConfig": {
    "Memory": 268435456,
    "MemorySwap": 536870912,
    "NanoCpus": 250000000
  }
}

После преобразования в строку для окончательного манифеста развертывания эти значения будут выглядеть, как в следующем примере:

"createOptions":"{\"HostConfig\":{\"Memory\":268435456,\"MemorySwap\":536870912,\"CpuPeriod\":25000}}"

Оптимизация gpu модуля IoT Edge

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

{"HostConfig": {"DeviceRequests": [{"Count": -1,"Capabilities": [["gpu"]]}]}}

Чтобы убедиться, что эти параметры были успешно добавлены, используйте команду проверки Docker, чтобы увидеть новый параметр в печати JSON.

sudo docker inspect <YOUR-MODULE-NAME>

Дополнительные сведения о подключении устройства и виртуальной машины к GPU см. в статье Настройка, подключение и проверка модуля IoT Edge для GPU.

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

Дополнительные примеры практического применения параметров создания IoT Edge: