Tips & Tricks при разработке модулей для IoT Edge. Урок 4.

Список находок при сборке готового IoT модуля termo sensor от Microsoft (см. часть 3 повествования) получился значительным, поэтому для удобства вынес в отдельную статью.

Далее по тексту в квадратных скобках имена, которые нужно заменить на свои:

  • [WarlibRegistry] — имя моего репозитория.
  • [warlibregistry.azurecr.io] — login server для моего репозитория.
  • [warlibregistry.azurecr.io/iot-edge-engine-simulator:0.0.1-amd64] — полный путь к образу модуля.
  • [engineSimulator] — имя моего модуля в Azure IoT Edge.

Мои замечания/лайфхаки как разруливать проблемы при разработке IoT Edge модуля ниже:

  1. На Azure portal, путь для создания своего контейнера: Create a resource > Containers > Azure Container Registry.
  2. Имя для контейнера общее для всех участников, соотвественно, нужно придумать что-то достаточно уникальное.  Например, я выбрал название WarlibRegistry, поэтому путь к серверу: warlibregistry.azurecr.io.
  3. Ключи доступа к container repository можно найти на Azure portal: All resources -> [WarlibRegistry] -> Access Keys. Если Admin users в Enable, то отобразится имя пользователя и пароли.
  4. При выполнении команды Visual Studio Code для создания нового модуля View -> Command Palette.. -> New IoT Edge Solution:
    • Запрос на выбора папки — это корневая папка на локальном диске в котором будет создан solution.
    • Solution name — в выбранной папке будет создана подпапка с заданным именем решения. Например, iot_edge_engine_simulator. Допускаются только символы нижнего подчеркивания.
    • Module name — имя модуля. Например, iot_edge_engine_simulator. Допускаются только символы нижнего подчеркивания.
    • Docker image repository — репозиторий Azure/Docker. Например, warlibregistry.azurecr.io/iot-edge-engine-simulator.
  5. Файл .env должен лежать в корневой папке вместе с deployment.template.json. Его легко создать самостоятельно, заменив значения имени пользователя и пароля на свои:
    CONTAINER_REGISTRY_USERNAME_warlibregistry=WarlibRegistry
    CONTAINER_REGISTRY_PASSWORD_warlibregistry=FrM6/W0BE
  6. При выполнении команды docker login с указанием авторизационных данных может быть получен ответ  «Warning: failed to get default registry endpoint from daemon (Error response from daemon: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.). Using system default: https://index.docker.io/v1/». Пинговать ресурс по символическому имени [warlibregistry.azurecr.io] не имеет смысла, 100% потеря пакетов, видимо запрет ICMP. Для устранения ошибки обычно помогает перезапуск Docker.
  7. После того как правой кнопкой мыши кликнули на deployment.template.json и выбрали Build and Push IoT Edge solution запускается процесс сборки модуля, упаковки в контейнер Docker и отправки его в репозиторий Azure.
  8. Посмотреть имеющиеся образы можно на Azure portal: All resources -> [WarlibRegistry] -> Repositories. Там будет ссылка с названием созданного репозитория. При клике на ней в разделе Tags — созданные образы.
  9. Для установки IoT Edge runtme на устройство нужно запустить в PowerShell под админом команду:
    . {Invoke-WebRequest -useb aka.ms/iotedge-win} | Invoke-Expression; `
    Install-SecurityDaemon -Manual -ContainerOs Linux

    будет запрошен Connection String, который можно взять на Azure Portal в All resources -> [Ваш IoT Hub] -> раздел Automatic device management -> IoT Edge -> [Ваше устройство на IoT Edge устройстве] -> Connection string (primary key).

  10. Подробная дока по устранению проблем с IoT Edge.
  11. Список модулей на IoT Edge устройстве можно посмотреть командой:
    iotedge list
  12. После обновления образа в репозитории (например, при очередной сборке в Visual Studio Code и push) его нужно обновить на IoT Edge устройстве командой:
    docker pull [warlibregistry.azurecr.io/iot-edge-engine-simulator:0.0.1-amd64]

    [warlibregistry.azurecr.io/iot-edge-engine-simulator:0.0.1-amd64] — полный путь к моему образу. Этой же командой можно проверить доступность образа в репозитории и то, что авторизация проходит.

  13. Дать доступ docker-у в репозиторий Azure можно командой:
    docker login -u [USERNME] -p [PASSWORD] [URI]
    
    Пример:
    docker login -u WarlibRegistry -p FrM6/W0BEvM2Isv warlibregistry.azurecr.io
  14. Список всех образов на IoT Edge устройстве можно посмотреть  командой:
    docker ps -a
  15. После обновления контейнера на IoT Edge устройстве нужно перестартовать контейнер командой:
    iotedge restart [engineSimulator]

    [engineSimulator] —  имя моего модуля.

  16. Для остановки и запуска сервиса IoT Edge runtime команды:
    Start-Service iotedge
    Stop-Service iotedge
  17. Для перезагрузки модулей edgeAgent и edgeHub:
    iotedge restart edgeAgent && iotedge restart edgeHub
  18. Для удаления IoT Edge runtime с ПК нужно выполнить команду:
    . {Invoke-WebRequest -useb aka.ms/iotedge-win} | Invoke-Expression; `
    Uninstall-SecurityDaemon
    
    хотя хватает и просто Uninstall-SecurityDaemon.
  19. Самый долгий и самый надежный способ обновить образ на IoT — удалить IoT Edge Runtime и затем снова его установить.
  20. Чтобы посмотреть логи работы модуля:
    iotedge logs [engineSimulator] -f

    [engineSimulator] — название вашего модуля,
    -f, —follow Follow output log — постоянный вывод поступающий информации.

  21. Параметры контейнера docker можно посмотреть командой:
    docker container inspect [engineSimulator]
  22. При добавлении к устройству IoT Edge разработанного модуля из собственного репозитория нужно ОБЯЗАТЕЛЬНО ввести авторизационную информацию в раздел «Container Registry Settings» для доступа к контейнеру. Эти данные берем из «Access keys» репозитория. Если этого не сделать, модуль не будет загружен на IoT Edge устройство, даже если в docker выполнена команда login. Выглядеть ошибка будет так:
    11.11.2018 22:52:43 warn: edgelet_docker::runtime -- Attempt to pull image failed.
    11.11.2018 22:52:43 info: edgelet_http::logging -- [mgmt] - - - [2018-11-11 19:52:43.487711600 UTC] "POST /modules?api-version=2018-06-28 HTTP/1.1" 500 Internal Server Error 141 "-" "-" pid(any)
    11.11.2018 22:52:43 warn: edgelet_utils::logging -- Get https://warlibregistry.azurecr.io/v2/iot-edge-engine-simulator/manifests/0.0.1-amd64: unauthorized: authentication required

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

  23. Для симуляции работы модуля необходимо выполнить в терминале команду для установки среды симуляции:
    iotedgehubdev.exe setup -c "HostName=SchneiderEq.azure-devices.net;DeviceId=VariablSpeedDrivesSimulator;SharedAccessKey=M7A0TSljLKSo4gIiNOlXqe64="

    Connection string берется из IoT Edge device. После выполнения команды при клике правой кнопкой мыши на .json файле deployment.template.json можно выбрать пункт Build and Push IoT Edge solution in Simulator. Будет сэмулирован запуск модуля на IoT edge устройстве.

  24. Если в исходники модуля вносились изменения, то перед  выполнением Build and Push IoT Edge solution in Simulator необходимо выполнить команду Build and Push IoT Edge Solution для сборки и передачи образа в облако. Пока не был выполнен Build and Push IoT Edge Solution при запуске в симуляторе не было никаких изменений в работе модуля, т.е. запускалась старая версия.
  25. Для просмотра логов запуска  модулей на IoT Edge устройстве нужно исрользовать команду:
    Get-WinEvent -ea SilentlyContinue `
    -FilterHashtable @{ProviderName= "iotedged";
    LogName = "application"; StartTime = [datetime]::Today} |
    select TimeCreated, Message |
    sort-object @{Expression="TimeCreated";Descending=$false} |
    format-table -autosize -wrap
  26. Для остановки и возобновления работы контейнера используется команды docker:
    docker container stop [engineSimulator]
    docker container start [engineSimulator]

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

  27. Для приостановки работы модуля его можно поставить на паузу. Например, в случае с остановкой работы модуля termoSensor командой docker container stop при запуске счетчик будет запущен сначала. В случае с pause — с момента, когда был установлен на паузу.
    docker container pause [engineSimulator]
    docker container unpause [engineSimulator]
  28. Если при запуске Build IoT Edge solution очень медленная реакция, валятся какие-то непонятные ошибки — не паникуем, рестартим docker. 🙂 Обычно помогает.
  29. Если есть какие-то проблемы с кодом, вроде проблем с компиляцией, иногда удобнее запускать *.csproj в Visual Studio 2017.
  30. Чтобы проверить, что docker видит образы в Azure Container Registry нужно выполнить команду:
    docker images [warlibregistry.azurecr.io/iot-edge-engine-simulator:0.0.1-amd64]

    Для просмотра всех образов:

    docker images [warlibregistry.azurecr.io/*]
Spread the love
Запись опубликована в рубрике IT опыт, IT рецепты с метками , . Добавьте в закладки постоянную ссылку.