Поделиться через


Решения распространенных проблем с Azure IoT Edge

Область применения: Значок IoT Edge 1.1

Внимание

Дата окончания поддержки IoT Edge 1.1 была 13 декабря 2022 г. Чтобы получить сведения о поддержке определенного продукта, службы, технологии или API, перейдите на страницу Политика жизненного цикла поддержки Майкрософт. Дополнительные сведения об обновлении до последней версии IoT Edge см. в разделе "Обновление IoT Edge".

Используйте эту статью для выявления и устранения распространенных проблем при использовании решений IoT Edge. Если вам нужна информация о том, как найти журналы и ошибки на устройстве IoT Edge, см. статью "Устранение неполадок устройства IoT Edge".

Подготовка и развертывание

Модуль IoT Edge успешно развертывается, но затем исчезает с устройства

Симптомы

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

Причина

Если для устройства задано автоматическое развертывание, оно получает приоритет над ручной настройкой модулей для этого устройства. Функции наборов модулей в портал Azure или создании развертывания для отдельных функций устройств в Visual Studio Code вступает в силу в течение некоторого момента. При этом можно видеть, что заданные модули запускаются на устройстве. Затем приоритет автоматического развертывания запускается и перезаписывает требуемые свойства устройства.

Решение

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

Дополнительные сведения см. в статье Общие сведения об автоматических развертываниях IoT Edge для отдельных устройств или в большом масштабе.

Не удается получить журналы среды выполнения IoT Edge в Windows

Симптомы

При использовании команды Get-WinEvent в Windows возвращается исключение EventLogException.

Причина

Используя запись реестра, команда PowerShell Get-WinEvent ищет журналы по определенному имени поставщика (ProviderName).

Решение

Задайте запись реестра управляющей программы IoT Edge. Создайте файл iotedge.reg с указанным ниже содержимым и импортируйте его в реестр Windows. Для этого дважды щелкните этот файл или используйте команду reg import iotedge.reg.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\iotedged]
"CustomSource"=dword:00000001
"EventMessageFile"="C:\\ProgramData\\iotedge\\iotedged.exe"
"TypesSupported"=dword:00000007

Ошибка клиента DPS

Симптомы

IoT Edge не удается начать с сообщения об ошибке failed to provision with IoT Hub, and no valid device backup was found dps client error.

Причина

Регистрация группы используется для подготовки устройства IoT Edge к Центр Интернета вещей. Устройство IoT Edge перемещается в другой центр. Регистрация удаляется в DPS. Новая регистрация создается в DPS для нового концентратора. Устройство не перепроиздается.

Решение

  1. Проверьте правильность учетных данных DPS.
  2. Применение конфигурации с помощью sudo iotedge apply config.
  3. Если устройство не выдается повторно, перезапустите устройство с помощью sudo iotedge system restart.
  4. Если устройство не перепроиздается, принудительное повторная подготовка используется sudo iotedge system reprovision.

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

При использовании внешней подготовки управляющая программа также уведомит внешнюю конечную точку подготовки о событии повторной подготовки перед завершением работы. Дополнительные сведения см. в разделе Основные понятия повторной подготовки устройств в Центре Интернета вещей.

Среда выполнения IoT Edge

Агент IoT Edge останавливается через минуту

Симптомы

Модуль edgeAgent запускается и успешно выполняется около минуты, а затем останавливается. Согласно записям в журналах, что агент IoT Edge пытается установить подключение к Центру Интернета вещей по протоколу AMQP, а затем по тому же протоколу AMQP поверх WebSocket. Когда это осуществить не удается, агент IoT Edge завершает свою работу.

Примеры журналов edgeAgent:

2017-11-28 18:46:19 [INF] - Starting module management agent.
2017-11-28 18:46:19 [INF] - Version - 1.0.7516610 (03c94f85d0833a861a43c669842f0817924911d5)
2017-11-28 18:46:19 [INF] - Edge agent attempting to connect to IoT Hub via AMQP...
2017-11-28 18:46:49 [INF] - Edge agent attempting to connect to IoT Hub via AMQP over WebSocket...

Причина

Доступу агента IoT Edge в сеть препятствует конфигурация сети узла. Сначала агент пытается подключиться через AMQP (порт 5671). Если это не удается, он пытается подключиться через WebSocket (порт 443).

Среда выполнения IoT Edge настраивает сеть для всех модулей, с которыми нужно взаимодействовать. В Linux этой сетью является мостовая сеть. В Windows используется NAT. Эта проблема чаще всего встречается на устройствах с Windows, использующих контейнеры Windows с сетью NAT.

Решение

Убедитесь, что есть маршрут к Интернету для IP-адресов, назначенных этой сети моста или сети NAT. Иногда конфигурация VPN на узле переопределяет сеть IoT Edge.

Модуль агента IoT Edge сообщает о "пустом файле конфигурации", и на устройстве не запускаются модули

Симптомы

Устройству не удается запустить модули, определенные в параметрах развертывания. Выполняется только edgeAgent, но постоянно сообщает "пустой файл конфигурации...".

Причина

По умолчанию IoT Edge запускает модули в собственной изолированной сети контейнеров. Возможно, у устройства возникли проблемы с разрешением DNS-имен в этой частной сети.

Решение

Вариант 1. Настройка DNS-сервера в параметрах подсистемы контейнеров

Укажите DNS-сервер для своей среды в параметрах подсистемы контейнеров — они будут применяться ко всем запущенным в ней модулям контейнеров. Создайте файл с именем daemon.json, а затем укажите DNS-сервер для использования. Например:

{
    "dns": ["1.1.1.1"]
}

Этот DNS-сервер имеет общедоступную службу DNS. Однако некоторые сети, такие как корпоративные сети, имеют собственные DNS-серверы и не разрешают доступ к общедоступным DNS-серверам. Таким образом, если пограничное устройство не может получить доступ к общедоступному DNS-серверу, замените его доступным DNS-адресом.

Поместите файл daemon.json в расположение, соответствующее используемой платформе:

Платформа Расположение
Linux /etc/docker
Хост-компьютер Windows с контейнерами Windows C:\ProgramData\iotedge-moby\config

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

Перезапустите подсистему контейнера, чтобы обновления вступили в силу.

Платформа Команда
Linux sudo systemctl restart docker
Windows (административная оболочка PowerShell) Restart-Service iotedge-moby -Force

Вариант 2. Настройка DNS-сервера для каждого модуля в параметрах развертывания IoT Edge

Вы можете задать DNS-сервер в параметре createOptions каждого модуля при развертывании IoT Edge. Например:

"createOptions": {
  "HostConfig": {
    "Dns": [
      "x.x.x.x"
    ]
  }
}

Предупреждение

Если вы используете этот метод и укажете неправильный DNS-адрес, edgeAgent теряет подключение к Центр Интернета вещей и не может получать новые развертывания для устранения проблемы. Чтобы устранить эту проблему, можно переустановить среду выполнения IoT Edge. Перед установкой нового экземпляра IoT Edge обязательно удалите все контейнеры edgeAgent из предыдущей установки.

То же самое необходимо сделать для модулей edgeAgent и edgeHub.

Агент IoT Edge не может получить доступ к образу модуля (403)

Симптомы

Не удается запустить контейнер, и журналы edgeAgent сообщают об ошибке 403.

Причина

Модуль агента IoT Edge не имеет разрешений на доступ к образу модуля.

Решение

Убедитесь, что учетные данные реестра контейнеров исправляют манифест развертывания устройства.

Не удается запустить центр IoT Edge

Симптомы

Не удается запустить модуль edgeHub. В журналах может появиться сообщение об ошибке, подобное одному из следующих:

One or more errors occurred.
(Docker API responded with status code=InternalServerError, response=
{\"message\":\"driver failed programming external connectivity on endpoint edgeHub (6a82e5e994bab5187939049684fb64efe07606d2bb8a4cc5655b2a9bad5f8c80):
Error starting userland proxy: Bind for 0.0.0.0:443 failed: port is already allocated\"}\n)

Or

info: edgelet_docker::runtime -- Starting module edgeHub...
warn: edgelet_utils::logging -- Could not start module edgeHub
warn: edgelet_utils::logging --     caused by: failed to create endpoint edgeHub on network nat: hnsCall failed in Win32:  
        The process cannot access the file because it is being used by another process. (0x20)

Причина

Порт, привязку которого пытается выполнить модуль edgeHub, уже привязан к другому процессу на хост-компьютере. Центр IoT Edge сопоставляет порты 443, 5671 и 8883 для использования с шлюзами в различных сценариях. Если один из этих портов уже привязан к какому-то другому процессу, модуль не запускается.

Решение

Вы можете устранить эту проблему двумя способами.

Если устройство IoT Edge работает как шлюз, необходимо найти и остановить процесс, использующий порт 443, 5671 или 8883. Номера порта 443 в сообщении об ошибке обычно означает, что другой процесс является веб-сервером.

Если не требуется использовать устройство IoT Edge в качестве шлюза, можно удалить привязки портов из параметров создания модуля edgeHub. Изменить эти параметры можно на портале Azure или непосредственно в файле deployment.json.

На портале Azure выполните следующие действия:

  1. Перейдите в центр Интернета вещей и выберите "Устройства" в меню управления устройствами .

  2. Выберите устройство IoT Edge, которое требуется обновить.

  3. Щелкните Set Modules (Настроить модули).

  4. Выберите Параметры среды выполнения.

  5. В параметрах модуля Edge Hub удалите все данные из текстового поля Параметры создания.

  6. Сохраните изменения и создайте развертывание.

В файле deployment.json:

  1. Откройте файл deployment.json, который вы применили к этому устройству IoT Edge.

  2. Найдите параметры модуля edgeHub в разделе требуемых свойств модуля edgeAgent:

    "edgeHub": {
        "settings": {
            "image": "mcr.microsoft.com/azureiotedge-hub:1.1",
            "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
        },
        "type": "docker",
        "status": "running",
        "restartPolicy": "always"
    }
    
  3. Удалите строку createOptions и добавьте запятую в конец предшествующей строки image:

    "edgeHub": {
        "settings": {
            "image": "mcr.microsoft.com/azureiotedge-hub:1.1"
        },
        "type": "docker",
        "status": "running",
        "restartPolicy": "always"
    }
    
  4. Сохраните файл и повторно примените его к устройству IoT Edge.

Модулю IoT Edge не удается отправить сообщение в адрес edgeHub, и возникает ошибка 404

Симптомы

Настраиваемому модулю IoT Edge не удается отправить сообщение в адрес edgeHub, в результате чего возникает ошибка 404 Module not found. Среда выполнения IoT Edge выводит следующее сообщение в журналы:

Error: Time:Thu Jun  4 19:44:58 2018 File:/usr/sdk/src/c/provisioning_client/adapters/hsm_client_http_edge.c Func:on_edge_hsm_http_recv Line:364 executing HTTP request fails, status=404, response_buffer={"message":"Module not found"}u, 04 )

Причина

Среда выполнения IoT Edge применяет идентификацию процесса для всех модулей, подключающихся к edgeHub по соображениям безопасности. Таким образом проверяется, что все сообщения, которые отправляются модулем, поступают с идентификатора основного процесса модуля. Если сообщение отправляется модулем с идентификатора процесса, отличного от первоначально установленного, такие сообщения будут отклоняться управляющей программой с ошибкой 404.

Решение

Начиная с версии 1.0.7, подключение разрешено для всех процессов модуля. Дополнительные сведения см. в журнале изменений для версии 1.0.7.

Если обновление до версии 1.0.7 невозможно, выполните следующие действия. Убедитесь, что для отправки сообщений в edgeHub пользовательский модуль IoT Edge всегда использует один и тот же идентификатор процесса. Например, используйте в файле DOCKER команду ENTRYPOINT вместо CMD. Команда CMD создает один идентификатор процесса для модуля и еще один для команды оболочки bash, в которой выполняется основная программа, а команда ENTRYPOINT — всего один идентификатор процесса.

Нестабильная работа небольших устройств

Симптомы

Вы можете столкнуться с нестабильной работой некоторых устройств с ограниченными ресурсами, таких как Raspberry Pi, особенно если они используются в качестве шлюза. Для такой ситуации характерны исключения с сообщением о нехватке памяти в модуле центра IoT Edge, сбои подключения подчиненных устройств и прекращение потока телеметрии через несколько часов работы устройства.

Причина

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

Решение

Для переменной среды OptimizeForPerformance центра IoT Edge задайте значение false. Переменные среды можно задавать двумя способами.

На портале Azure выполните следующие действия:

В центре Интернета вещей выберите свое устройство IoT Edge и на странице сведений об устройстве выберите Настроить модули > Параметры времени выполнения. Создайте для модуля центра IoT Edge переменную среды с именем OptimizeForPerformance и задайте для нее значение false.

Задание значения false для имени OptimizeForPerformance

Через манифест развертывания.

"edgeHub": {
  "type": "docker",
  "settings": {
    "image": "mcr.microsoft.com/azureiotedge-hub:1.1",
    "createOptions": <snipped>
  },
  "env": {
    "OptimizeForPerformance": {
      "value": "false"
    }
  },

Управляющая программа безопасности не могла успешно запуститься

Симптомы

Управляющая программа безопасности не запускается, а контейнеры модулей не создаются. edgeHub Пользовательские edgeAgentмодули не запускались службой IoT Edge. В aziot-edged журналах отображается эта ошибка:

  • Управляющая программа не удалось запустить успешно: не удалось запустить службу управления.
  • причина: ошибка для пути /var/run/iotedge/mgmt.sock
  • вызвано: разрешение запрещено (ошибка ос 13)

Причина

Для всех дистрибутивов Linux, кроме CentOS 7, конфигурация IoT Edge по умолчанию предназначена для использования systemd активации сокета. Ошибка разрешения возникает, если вы измените файл конфигурации, чтобы не использовать активацию сокетов, но оставьте URL-адреса /var/run/iotedge/*.sockкак, так как пользователь не может записывать данные в /var/run/iotedge значение, что iotedge не может разблокировать и подключить сокеты.

Решение

Вам не нужно отключить активацию сокета в дистрибутиве, где поддерживается активация сокета. Однако если вы предпочитаете не использовать активацию сокетов вообще, поместите сокеты в /var/lib/iotedge/.

  1. Запустите systemctl disable iotedge.socket iotedge.mgmt.socket , чтобы отключить единицы сокета, чтобы система не запускала их без необходимости.
  2. Изменение конфигурации iotedge для использования /var/lib/iotedge/*.sock в обоих connect listen разделах
  3. Если у вас уже есть модули, они имеют старые /var/run/iotedge/*.sock подключения, поэтому docker rm -f они.

Не удалось запустить модуль из-за несоответствия ОС

Симптом

Модуль EdgeHub не запускается в IoT Edge версии 1.1.

Причина

Модуль Windows использует версию Windows, несовместимую с версией Windows на узле. Сборка 17763 для Windows IoT Edge версии 1809 необходима в качестве базового слоя для образа модуля, но другая версия используется.

Решение

Проверьте версию различных операционных систем Windows в несоответствиях образа узла и контейнера. Если операционные системы отличаются, обновите их до IoT Edge Windows версии 1809 сборки 17763 и перестройте образ Docker, используемый для этого модуля.

Сеть

Сбой управляющей программы безопасности IoT Edge с недопустимым именем узла

Симптомы

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

Error parsing user input data: invalid hostname. Hostname cannot be empty or greater than 64 characters

Причина

Среда выполнения IoT Edge поддерживает только имена узлов, которые короче 64 символов. Физические компьютеры обычно не имеют длинных имен узлов. Эта ошибка более типична для виртуальных машин. Автоматически создаваемые имена узлов для виртуальных машин Windows, размещенных в Azure, часто бывают длинными.

Решение

Эту ошибку можно устранить, настроив DNS-имя виртуальной машины, а затем задав DNS-имя в качестве имени узла в команде установки.

  1. На портале Azure перейдите к странице обзора виртуальной машины.

  2. Выберите Настроить под DNS-именем. Если для виртуальной машины уже настроено DNS-имя, настраивать новое не нужно.

    Настройка DNS-имени виртуальной машины

  3. Укажите значение в поле Метка DNS-имени и выберите Сохранить.

  4. Скопируйте новое DNS-имя, которое должно быть в формате <DNSnamelabel>.<vmlocation>.cloudapp.azure.com.

  5. В виртуальной машине используйте следующую команду для настройки среды выполнения IoT Edge с DNS-именем:

    • В Linux:

      sudo nano /etc/iotedge/config.yaml
      
    • В Windows:

      notepad C:\ProgramData\iotedge\config.yaml
      

Модуль IoT Edge сообщает об ошибках подключения

Симптомы

Модули IoT Edge, которые подключаются непосредственно к облачным службам, включая модули среды выполнения, перестают работать должным образом и возвращают ошибки при подключении или сбоях сети.

Причина

Контейнеры полагаются на пересылку IP-пакетов для подключения к Интернету, чтобы они могли взаимодействовать с облачными службами. Переадресация IP-пакетов включена по умолчанию в Docker, но если она отключена, все модули, подключающиеся к облачным службам, не будут работать должным образом. Дополнительные сведения см. в разделе "Общие сведения о взаимодействии с контейнерами" в документации по Docker.

Решение

Чтобы включить перенаправление IP-пакетов, выполните следующие действия.

В Windows:

  1. Откройте приложение Run.

  2. Введите regedit текстовое поле и нажмите кнопку "ОК".

  3. В окне редактора реестра перейдите к HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters.

  4. Найдите параметр IPEnableRouter.

    1. Если параметр существует, задайте для параметра значение 1.

    2. Если параметр не существует, добавьте его в качестве нового параметра со следующими параметрами:

      Параметр Значение
      Имя. IPEnableRouter
      Тип REG_DWORD
      Значение 1
  5. Закройте окно редактора реестра.

  6. Перезапустите систему, чтобы применить изменения.

В Linux:

  1. Откройте файл sysctl.conf.

    sudo nano /etc/sysctl.conf
    
  2. Добавьте следующую строку в файл.

    net.ipv4.ip_forward=1
    
  3. Сохранить и закрыть файл.

  4. Перезапустите сетевую службу и службу Docker, чтобы применить изменения.

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

Считаете, что обнаружили ошибку в платформе IoT Edge? Отправьте запрос, чтобы мы как можно скорее устранили неисправность.

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