Рубрики
Uncategorized

Домашний IoT — простые DevOps

Приложение создается, и наши данные могут быть обработаны, все, что осталось, — это развернуть все, и … Tagged fsharp, IoT, DevOps, Azure.

Домашний имит (9 части серии)

Приложение создается, и наши данные могут быть обработаны, все, что осталось, — это развернуть все, и угадайте, какова будет тема этого поста!

Когда дело доходит до CI/CD (непрерывная интеграция/непрерывное развертывание) для проектов IoT, это может показаться немного пугающим, у вас есть этот крошечный компьютер, на который вы пытаетесь получить вещи, это не только «облако», которое Вы нацеливаете. И эти устройства не похожи на обычные компьютеры, у них есть странные чипсеты, такие как ARM32!

Развертывание на малиновый пи

Нам нужно понять, как доставить нашу загрузку на Raspberry Pi. Как я упоминал в посте на Как работает загрузчик Я делаю локальную разработку, используя Docker, и в идеале я хочу запустить Docker на PI. Запуск Docker на PI прост, вы просто установите его из диспетчера пакетов Linux, как и в любом другом программном обеспечении, единственное отличие состоит в том, что ваше базовое изображение должно быть изображением ARM32, и К счастью, Microsoft отправляет это для нас (Для справки я использую mcr.microsoft.com/dotnet/core/runtime:2.2.5 stretch-slim-arm32v7 в качестве базового изображения).

Получение контейнеров на PI

У меня есть мой Dockerfile , Я могу сделать изображение Но как мне получить это на PI, а затем запустить контейнер?

DevOps ! 🎉

Моя первоначальная идея состояла в том, чтобы развернуть агент Azure Pipeline на Raspberry Pi, а затем добавить его в мой агент в бассейне в трубопроводах Azure. Я знаю, что это возможно, я видел Дамиан Брэди Сделайте это, но оказывается, что он использовал пользовательский скомпилированный агент И это на самом деле не поддерживается. Так что это не совсем идеально, я не хочу решения, которое я должен постоянно гарантировать, что я просто хочу что -то, что работает.

И это то, что привело меня к Azure Iot Edge Анкет

Представление края IoT

IoT Edge является частью Azure IOT Suite И он предназначен для развертывания многократных модулей на устройствах IoT, также известных как «Edge Devices».

То, как работает IoT Edge, — это запуск агента на устройстве, которое общается с IoT Hub. В концентраторе IoT вы создаете развертывание против устройства, в котором вы указываете модули, которые представляют собой изображения Docker, которые вы хотите запустить на устройстве. IoT Edge проверяет развертывание, когда он находит один, он его тянет, захватывает изображения Docker и запускает контейнеры. Здесь Это действительно хорошая отправная точка для понимания архитектуры IoT Edge и того, как она вписывается в решение. Я не собираюсь освещать все это подробно, вместо этого я собираюсь сосредоточиться на деталях, которые вам нужно понять, когда это придет, используя Edge IoT для развертывания.

Подготовка решения для DevOps

Если вы похожи на меня и начали создавать проект, прежде чем узнать обо всех вещах, которые вам понадобятся, вам может потребоваться модернизировать Edge IoT. У Docs IoT Edge есть хорошее Руководство по началу работы Что я бы посоветовал вам читать, если вы только начинаете, но, поскольку я не знал о краях IoT, пока я уже не построил его, давайте посмотрим на то, что нужно сделать, чтобы IoT Edge-iif проект.

Docker Images

Действительно приятная вещь о том, как работает Edge IoT, заключается в том, что он использует Docker в качестве механизма доставки для приложений, которые вы хотите запустить на устройстве, единственное условие заключается в том, что изображение использует базу ARM32 (или ARM64, если это то, что работает ваше устройство ) Таким образом, это означает, что нам нужно создать дополнительный Dockerfile, который сможет работать на нашем Raspberry Pi.

FROM mcr.microsoft.com/dotnet/core/runtime:2.2.5-stretch-slim-arm32v7

WORKDIR /app
COPY ./bin/Release/netcoreapp2.2/publish ./

ENTRYPOINT ["dotnet", "Sunshine.Downloader.dll"]

Источник на GitHub

О, это не так отличается от того, как мы делаем локальный Dev, на самом деле это действительно простой Dockerfile, все, что он делает, это копирует артефакты сборки (мы не используем многоэтапные Dockerfiles, как я обсуждал в местном посте Dev Dev Post )

Кребные модули IoT

Прежде чем мы поговорим о том, как сделать развертывание с IoT Edge, я хочу поговорить о МОДУЛЫ КРЕСЬ IoT Анкет Модуль — это приложение, которое работает на вашем устройстве и определяется в файле JSON. Устройство может иметь несколько модулей, развернутых на нем, но модуль является единственным приложением.

{
    "$schema-version": "0.0.1",
    "description": "",
    "image": {
        "repository": "${CONTAINER_REGISTRY_SERVER}/sunshine-downloader",
        "tag": {
            "version": "${BUILD_BUILDID}",
            "platforms": {
                "amd64": "./Dockerfile.amd64",
                "amd64.debug": "./Dockerfile.amd64.debug",
                "arm32v7": "./Dockerfile.arm32v7"
            }
        },
        "buildOptions": [],
        "contextPath": "./"
    },
    "language": "csharp"
}

Источник на GitHub

Вот JSON для моего модуля Sunshine Downloader. Там есть немного метаданных ( Описание , Язык ), с важной частью, в которой они являются Изображение Анкет Здесь мы определяем, как мы собираемся создать наше изображение и какой реестр контейнеров его будет опубликовано.

Во -первых, реестр. Это может быть опубликовано в частном реестре, таком как ваш собственный Azure Container Registry (Это то, что я использую) или в общественном реестре, таком как Docker Hub (хотя я бы этого не посоветовал). Вам необходимо убедиться, что к реестру можно получить доступ к устройству, к которому вы развертываете, поэтому они должны быть в той же локальной сети, VPN или оно должно быть адресом в Интернете.

Далее вы определяете тег Для изображения и Dockerfile S, которые будут использованы для их создания. Я генерирую 3 изображения, два изображения AMD64 (одно, которое содержит символы отладки) и мое изображение ARM32. Как правило, это хорошая практика, чтобы назвать теги относительно архитектуры, которую они представляют, но это не обязательно. Нам понадобятся имена в ближайшее время, поэтому убедитесь, что они не слишком неясны.

Наконец, мы можем дать некоторые аргументы в пользу Docker Build Команда, которая в конечном итоге будет выполнена здесь, в Buildoptions Анкет

Что -то, что вы, возможно, заметили в JSON выше, это то, что у меня есть несколько $ {...} вещи . Это ссылки на переменные среды, которые будут доступны при создании развертывания. Container_registry_server должен быть URL -адрес реестра, который вы используете И я прохожу Build_buildid из Azure Pipeline Alture Переменные , но это может быть все, что вы хотите пометить версию.

Одна вещь, которую я нашел, это было важно для модулей, это то, что вам нужно назвать файл module.json и сидеть вместе с Dockerfile S, которые вы используете. Из -за этого я закончил тем, что поместил все файлы в одной и той же папке, что и исходный код для загрузчика.

Развертывания с краем IoT

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

{
    "$schema-template": "1.0.0",
    "modulesContent": {
        "$edgeAgent": {
            "properties.desired": {
                "schemaVersion": "1.0",
                "runtime": {
                    "type": "docker",
                    "settings": {
                        "minDockerVersion": "v1.25",
                        "loggingOptions": "",
                        "registryCredentials": {
                            "YourACR": {
                                "username": "${CONTAINER_REGISTRY_USERNAME}",
                                "password": "${CONTAINER_REGISTRY_PASSWORD}",
                                "address": "${CONTAINER_REGISTRY_SERVER}"
                            }
                        }
                    }
                },
                "systemModules": {
                    "edgeAgent": {
                        "type": "docker",
                        "settings": {
                            "image": "mcr.microsoft.com/azureiotedge-agent:1.0.7",
                            "createOptions": ""
                        }
                    },
                    "edgeHub": {
                        "type": "docker",
                        "status": "running",
                        "restartPolicy": "always",
                        "settings": {
                            "image": "mcr.microsoft.com/azureiotedge-hub:1.0.7",
                            "createOptions": {
                                "HostConfig": {
                                    "PortBindings": {
                                        "5671/tcp": [{ "HostPort": "5671" }],
                                        "8883/tcp ": [{ "HostPort": "8883" }],
                                        "443/tcp": [{ "HostPort": "443" }]
                                    }
                                }
                            }
                        }
                    }
                },
                "modules": {
                    "SunshineDownloader": {
                        "version": "1.0",
                        "type": "docker",
                        "status": "running",
                        "restartPolicy": "always",
                        "settings": {
                            "image": "${MODULES.Sunshine.Downloader}",
                            "createOptions": {}
                        }
                    }
                }
            }
        },
        "$edgeHub": {
            "properties.desired": {
                "schemaVersion": "1.0",
                "routes": {
                    "route": "FROM /* INTO $upstream"
                },
                "storeAndForwardConfiguration": {
                    "timeToLiveSecs": 7200
                }
            }
        }
    }
}

Источник на GitHub

Этот файл немного большой Так что пришло время разбить его и узнать, что нам нужно знать об этом.

Он начинается с определения некоторой информации о агенте, который работает на нашем устройстве в $ EdgeAgent узел. Вы заметите, что есть учетные данные для вашего реестра контейнеров (ACR или другого), таких как module.json Файл, они поступают из переменных среды, которые вы бы установили перед созданием развертывания из шаблона.

Далее мы определяем SystemModules что сообщает развернутому агенту Edge о агенте Edge, чтобы запустить, на самом деле это означает, что мы можем настроить агент и обновить его, просто создав развертывание. Агент представляет собой изображение Docker ( здесь найдено ), как и концентратор Edge ( найдено здесь ). Я использую релиз 1.0.7 Это было конюшней в то время, когда я строю солнечный свет, но может быть более новая версия, которую вы можете взять. Обе эти произведения важны, поскольку агент — это контейнер, который разговаривает с концентратором IoT, статусами сообщает и т. Д. Принимая во внимание, что концентратор — это мост между вашим применением и концентратором IoT.

В пределах модули Узел Вы определяете модули, которые вы хотите установить в свое устройство. Это объект JSON, где вы можете определить столько, сколько вы хотите, и имя, которое вы даете, — это имя, которое появится, если вы сделаете Docker PS На вашем устройстве (я использовал Sunshiedownloader ) Таким образом, это должно соответствовать соглашениям о именовании контейнеров Docker. Две важные части определения модуля, которые вам нужно установить, — это переменная изображения и любая CreateOptions что ваш контейнер понадобится.

Для Изображение Собственность у меня есть $ {Modules.sunshine. Скачатель} , но что это представляет и как это работает? Эта переменная составлена за две части, первая, Модули это Modules_path Что ищет инструмент IoT Edge. По умолчанию он будет искать папку под названием модули Относительно каталога, в котором находится шаблон ( Ссылка на источник ), но может быть переопределен с помощью .env файл. На самом деле Это то, что я делаю Поскольку мой исходный код находится в SRC папка. Остальная часть переменной является папкой в Modules_path что ваш модуль находится, ведущий к module.json .

Последний узел в нашем JSON — $ EdgeHub которые являются некоторыми инструкциями для модуля концентратора IoT, который позволяет нам контролировать информацию о нем. Я использую это, чтобы гарантировать, что сообщения от мой Модульная земля в IoT Hub, используя маршрут Анкет Определение маршрута От/* в $ upstream В основном говорит: «Каждое сообщение с устройства переходит в первичную конечную точку IoT Hub». Это может быть использовано для настройки предварительной проработки сообщений, но вместо этого я направляю сообщения в центре IoT.

Запуск развертывания

Наш шаблон развертывания создан, наш модуль определяется, и наши изображения готовы к созданию, все, что осталось, — это то, что нужно развернуть!

Чтобы сделать развертывание, мы будем использовать IoT Edge Dev Tool , приложение Python с открытым исходным кодом для работы с Edge IoT.

Создание изображения

Потому что мой развертывание.template.json Файл живет в .build Папка (мне нравится держать свои файлы для разных задач из корня репозитория) Мы перемещаемся туда. Теперь мы можем запустить IOTEDGEDEV BUILD И это создаст для нас изображение. По умолчанию он будет использовать AMD64 Архитектура и «толчок» в ваш местный реестр Docker, но мы хотим развернуть наш PI, поэтому нам нужно отредактировать .env и установить Iothub_connection_string и Device_connection_string Записи в соответствующие произведения из Azure (примечание: я не Проверьте их на управление источником!) И вам нужно пройти -Платформа аргумент с ARM32V7 Чтобы создать это изображение модуля.

После завершения сборки вы найдете новый файл развертывания с именем развертывание. <платформа> .json (Итак, развертывание.arm32v7.json ) Это то, что мы будем использовать для развертывания на устройство.

Публикация изображения

С нашим изображением, мы можем подтолкнуть его к нашему реестру контейнеров, опять же, чтобы поддержать, что вам необходимо установить Container_registry_username В Container_registry_password и Container_registry_server переменные среды для ACR (или любой другой реестр контейнеров, которые вы хотите подготовить) Приор Чтобы сделать сборку, поскольку они добавляются в развертывание. <платформа> .json файл. Затем выполните IOTEDGEDEV Push Прикажите, чтобы выдвинуть ваше изображение в реестр. Эта команда захочет сделать сборку, так что пройдите --нет-сборка Если вы хотите пропустить создание изображения.

Развертывание изображения

Чтобы мы могли развернуть изображение, мы не будем использовать IOTEDGEDEV Инструмент, вместо этого мы будем использовать Azure CLI и, в частности, IoT расширения , поэтому возьмите Azure CLI (я использую его распределение Docker), войдите в свою учетную запись и устанавливаю расширение IoT.

Мы собираемся использовать Развертывание Edge Create Команда для создания развертывания в концентраторе IoT для нашего устройства IoT Edge с помощью шаблона развертывания, который мы указали выше.

$> az iot edge deployment create --deployment-id deployment-01 --hub-name  --content  --target-condition deviceId='' --priority 0

Предполагая, что все прошло успешно, вы теперь увидите развертывание, перечисленное в Azure против вашего устройства IoT Edge, и вскоре устройство вытянет изображение и запустит контейнер с него!

Вывод

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

Мы начинаем с определения нашего модуля, который является вещь Что мы запустим на устройстве IoT в качестве контейнера Docker, затем мы создаем развертывание.template.json Файл, который представляет собой общий шаблон, который описывает, как развертываться на платформе, и, наконец, мы можем использовать Azure CLI для создания развертывания для нашего устройства.

В следующий раз мы уйдем от выполнения команд сами и контролируем все это через Azure Tipvines.

Домашний имит (9 части серии)

Оригинал: «https://dev.to/azure/home-grown-iot-simple-devops-11n9»