Как настроить параметры создания контейнера для модулей IoT Edge
Область применения: IoT Edge 1.5 IoT Edge 1.4
Внимание
Поддерживаются выпуски IoT Edge 1.5 LTS и IoT Edge 1.4 LTS. IoT Edge 1.4 LTS заканчивается жизнью 12 ноября 2024 года. Если вы используете более ранний выпуск, см. статью Обновление 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. Например:
Распространенные сценарии
Параметры создания контейнера позволяют реализовать многие сценарии. Вот некоторые из сценариев, чаще всего возникающих при создании решений IoT Edge:
- предоставление модулям доступа к хранилищу узла;
- сопоставление порта узла с портом модуля;
- ограничение использования памяти и ЦП модулем.
- Оптимизация gpu модуля 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: