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

Применимо к: значок "Да" IoT Edge 1.1 значок "Да" IoT Edge 1.2

Параметр 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 Tools для Visual Studio или Visual Studio Code, то вы можете записать параметры создания в формате JSON в файл deployment.template.js. Затем, когда это расширение будет использовано для создания решения IoT Edge или создания манифеста развертывания, оно преобразует эти параметры JSON в строку в формате, который ожидает среда выполнения IoT Edge. Пример:

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

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

Результаты проверки edgeHub для Docker

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

Параметры создания контейнера позволяют реализовать многие сценарии. Вот некоторые из сценариев, чаще всего возникающих при создании решений 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: общий максимальный объем памяти (память и файл подкачки). Например, 536 870 912 байт = 512 МБ.
  • CpuPeriod: продолжительность сеанса ЦП в микросекундах. Значение по умолчанию — 100 000, поэтому значение 25 000 предоставит контейнеру не более 25 % ресурсов ЦП.

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

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

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

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

Дальнейшие действия

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