Soluciones a problemas comunes de Azure IoT Edge
Se aplica a: IoT Edge 1.1
Importante
IoT Edge 1.1: la fecha de finalización del soporte técnico fue el 13 de diciembre de 2022. Consulte la página del ciclo de vida de productos de Microsoft para obtener información sobre cómo se admite este producto, servicio, tecnología o API. Para más información sobre cómo actualizar a la versión más reciente de IoT Edge, consulte Actualización de IoT Edge.
Use este artículo para identificar y resolver problemas comunes al usar soluciones de IoT Edge. Si necesita información sobre cómo buscar registros y errores en el dispositivo IoT Edge, consulte Solución de problemas del dispositivo IoT Edge.
Aprovisionamiento e implementación
El módulo de IoT Edge módulo se implementa correctamente y, a continuación, desaparece del dispositivo
Síntomas
Después de configurar los módulos para un dispositivo IoT Edge, los módulos se implementan correctamente, pero después de unos minutos desaparecen del dispositivo y de los detalles del dispositivo en Azure Portal. También pueden aparecer en el dispositivo otros módulos distintos a los definidos.
Causa
Si una implementación automática tiene como destino un dispositivo, tendrá prioridad sobre la configuración manual de los módulos para un único dispositivo. La funcionalidad Establecer módulos de Azure Portal o Crear una implementación para un dispositivo individual de Visual Studio Code se aplicarán momentáneamente. Inicialmente, verá en el dispositivo los módulos que ha definido. A continuación, se aplicará la prioridad de la implementación automática, que sobrescribe las propiedades deseadas del dispositivo.
Solución
Use solo un tipo de mecanismo de implementación por dispositivo, ya sea una implementación automática o implementaciones de dispositivo individuales. Si tiene varias implementaciones automáticas que tienen como destino un dispositivo, puede cambiar la prioridad o las descripciones de destino para asegurarse de que se aplique la correcta a un dispositivo determinado. También puede actualizar el dispositivo gemelo para que ya no coincida con la descripción de destino de la implementación automática.
Para más información, consulte el artículo Descripción de las implementaciones automáticas de IoT Edge en un único dispositivo o a escala.
No se obtienen los registros del entorno de ejecución de IoT Edge en Windows
Síntomas
Aparece EventLogException al usar Get-WinEvent
en Windows.
Causa
El comando de PowerShell Get-WinEvent
se basa en que esté presente una entrada del Registro para encontrar los registros por un elemento ProviderName
concreto.
Solución
Establezca una entrada del registro para el demonio de IoT Edge. Cree un archivo iotedge.reg con el siguiente contenido e impórtelo en el Registro de Windows haciendo doble clic en él o mediante el comando 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
Error de cliente de DPS
Síntomas
IoT Edge no se puede iniciar; se muestra el mensaje de error failed to provision with IoT Hub, and no valid device backup was found dps client error.
Causa
Se usa una inscripción de grupo para aprovisionar un dispositivo IoT Edge en IoT Hub. El dispositivo IoT Edge se mueve a un centro de conectividad diferente. El registro se elimina en DPS. Se crea un nuevo registro en DPS para el nuevo centro. El dispositivo no se vuelve a aprovisionar.
Solución
- Compruebe que las credenciales de DPS son correctas.
- Aplique la configuración con
sudo iotedge apply config
. - Si el dispositivo no se vuelve a aprovisionar, reinicie el dispositivo mediante
sudo iotedge system restart
. - Si el dispositivo no se vuelve a aprovisionar, fuerce el reaprovisionamiento mediante
sudo iotedge system reprovision
.
Para volver a aprovisionarlo automáticamente, establezca dynamic_reprovisioning: true
en el archivo de configuración del dispositivo. Al establecer esta marca en true, se opta por la característica de reaprovisionamiento dinámico. IoT Edge detecta situaciones en las que parece que el dispositivo se ha vuelto a aprovisionar en la nube mediante la supervisión de determinados errores en su propia conexión de IoT Hub. IoT Edge responde cerrándose él mismo y todos los módulos de Edge. La próxima vez que se inicie el demonio, intentará volver a aprovisionar este dispositivo con Azure para recibir la nueva información de aprovisionamiento de IoT Hub.
Al usar el aprovisionamiento externo, el demonio también notificará al punto de conexión de aprovisionamiento externo el evento de reaprovisionamiento antes de cerrarse. Para más información, consulte Conceptos sobre el reaprovisionamiento de dispositivos de IoT Hub.
Entorno de tiempo de ejecución de IoT Edge
El agente de IoT Edge se detiene después de un minuto
Síntomas
El módulo edgeAgent se inicia y se ejecuta correctamente durante un minuto aproximadamente y luego se detiene. Los registros indican que el agente de IoT Edge intenta conectarse a IoT Hub a través de AMQP y después intenta conectarse mediante AMQP a través de WebSocket. Cuando se produce un error, se cierra el agente de IoT Edge.
Registros de ejemplo de 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...
Causa
Una configuración de redes en la red del host evita que el agente de IoT Edge alcance la red. El agente intentará conectarse en primer lugar a través de AMQP (puerto 5671). Si se produce un error en la conexión, lo intentará mediante los protocolos WebSocket (puerto 443).
El entorno de ejecución de IoT Edge configura una red para cada uno de los módulos en los que se comunica. En Linux, esta red es una red de puente. En Windows, se usa NAT. Este problema es más frecuente en los dispositivos de Windows que usan contenedores de Windows que usan la red NAT.
Solución
Asegúrese de que hay una ruta a Internet para las direcciones IP asignadas a esta red de puente o NAT. A veces, una configuración de VPN en el host invalida la red de IoT Edge.
El módulo Agente de Edge notifica "archivo de configuración vacío" y no se inicia ningún módulo en el dispositivo
Síntomas
El dispositivo tiene problemas para iniciar los módulos definidos en la implementación. Solo se está ejecutando edgeAgent, pero notifica "archivo de configuración vacío..." continuamente.
Causa
De forma predeterminada, IoT Edge inicia módulos en su propia red de contenedores aislada. El dispositivo pueda tener problemas con la resolución de nombres DNS dentro de esta red privada.
Solución
Opción 1: establecer el servidor DNS en la configuración del motor de contenedor
Especifique el servidor DNS del entorno en la configuración del motor de contenedor que se va a aplicar a todos los módulos de contenedor iniciados por el motor. Cree un archivo denominado daemon.json
y especifique el servidor DNS que se va a usar. Por ejemplo:
{
"dns": ["1.1.1.1"]
}
Este servidor DNS se establece en un servicio DNS accesible públicamente. Sin embargo, algunas redes, como las redes corporativas, tienen instalados sus propios servidores DNS y no permitirán el acceso a los servidores DNS públicos. Por lo tanto, si el dispositivo perimetral no puede acceder a un servidor DNS público, reemplácelo por una dirección de servidor DNS accesible.
Coloque daemon.json
en la ubicación correcta para la plataforma:
Plataforma | Location |
---|---|
Linux | /etc/docker |
Host de Windows con contenedores de Windows | C:\ProgramData\iotedge-moby\config |
Si la ubicación ya contiene el archivo daemon.json
, agréguele la clave dns y guarde el archivo.
Reinicie el motor de contenedor para que las actualizaciones se apliquen.
Plataforma | Get-Help |
---|---|
Linux | sudo systemctl restart docker |
Windows (Administrador de PowerShell) | Restart-Service iotedge-moby -Force |
Opción 2: establecer el servidor DNS en la implementación de IoT Edge por módulo
Puede establecer el servidor DNS para el elemento createOptions de cada módulo en la implementación de IoT Edge. Por ejemplo:
"createOptions": {
"HostConfig": {
"Dns": [
"x.x.x.x"
]
}
}
Advertencia
Si usa este método y especifica la dirección DNS incorrecta, edgeAgent pierde la conexión con IoT Hub y no puede recibir nuevas implementaciones para corregir el problema. Para resolver este problema, puede volver a instalar el entorno de ejecución de Azure IoT Edge. Antes de instalar una nueva instancia de IoT Edge, asegúrese de quitar los contenedores de edgeAgent de la instalación anterior.
Asegúrese de establecer esta configuración también para los módulos edgeAgent y edgeHub.
El agente de IoT Edge no puede acceder a la imagen de un módulo (403)
Síntomas
No se puede ejecutar un contenedor y los registros de edgeAgent informan de un error 403.
Causa
El módulo del agente de IoT Edge no tiene permisos para acceder a la imagen de un módulo.
Solución
Asegúrese de que las credenciales del registro de contenedor sean correctas en el manifiesto de implementación del dispositivo.
No se puede iniciar el centro de IoT Edge
Síntomas
El módulo edgeHub no se inicia. Puede ver un mensaje similar a uno de los siguientes errores en los registros:
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)
Causa
Algún otro proceso en la máquina host ha enlazado un puerto al que el módulo edgeHub está intentando enlazarse. El centro de IoT Edge asigna los puertos 443, 5671 y 8883 para su uso en escenarios de puerta de enlace. El módulo no se inicia si otro proceso ya ha enlazado uno de esos puertos.
Solución
Puede resolver este problema de dos maneras:
Si el dispositivo IoT Edge funciona como un dispositivo de puerta de enlace, debe buscar y detener el proceso que está usando el puerto 443, 5671 o 8883. Un error en el puerto 443 normalmente significa que el otro proceso es un servidor web.
Si no necesita usar el dispositivo IoT Edge como puerta de enlace, puede quitar los enlaces de puertos de las opciones de creación del módulo edgeHub. Puede cambiar las opciones de creación en Azure Portal o directamente en el archivo deployment.json.
En Azure Portal:
Vaya a su centro de IoT y seleccione Dispositivos en el menú Administración de dispositivos.
Seleccione el dispositivo IoT Edge que desee actualizar.
Seleccione Set modules (Establecer módulos).
Seleccione Configuración del entorno de ejecución.
En la configuración del módulo Edge Hub, elimine todo el contenido del cuadro de texto Opciones de creación.
Guarde los cambios y cree la implementación.
En el archivo deployment.json:
Abra el archivo deployment.json que aplicó al dispositivo IoT Edge.
Busque la configuración de
edgeHub
en la sección de propiedades deseadas de 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" }
Quite la línea
createOptions
y la coma al final de la líneaimage
anterior:"edgeHub": { "settings": { "image": "mcr.microsoft.com/azureiotedge-hub:1.1" }, "type": "docker", "status": "running", "restartPolicy": "always" }
Guarde el archivo y vuelva a aplicarlo al dispositivo IoT Edge.
El módulo de IoT Edge no puede enviar un mensaje a edgeHub y se produce el error 404
Síntomas
Un módulo de IoT Edge personalizado no puede enviar un mensaje al centro de IoT Edge y se produce el error 404 Module not found
. El entorno de ejecución de IoT Edge imprime el mensaje siguiente en los registros:
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 )
Causa
Por motivos de seguridad, el entorno de ejecución de IoT Edge aplica la identificación de proceso para todos los módulos que se conectan a edgeHub. Comprueba que todos los mensajes enviados por un módulo proceden del identificador de proceso principal del módulo. Si un módulo envía un mensaje desde un identificador de proceso diferente del que se estableció inicialmente, se rechazará el mensaje y se generará el mensaje de error 404.
Solución
A partir de la versión 1.0.7, todos los procesos de módulo tienen autorización para conectarse. Para más información, consulte el registro de cambios de la versión v1.1.0.7.
Si no es posible actualizar a la versión 1.0.7, realice los pasos siguientes. Asegúrese de que el módulo de IoT Edge personalizado siempre usa el mismo identificador de proceso para enviar los mensajes a edgeHub. Por ejemplo, asegúrese de usar ENTRYPOINT
en lugar del comando CMD
en el archivo de Docker. El comando CMD
genera un identificador de proceso para el módulo y otro identificador de proceso para el comando bash que ejecuta el programa principal, pero ENTRYPOINT
produce un único identificador de proceso.
Problemas de estabilidad en dispositivos más pequeños
Síntomas
Es posible que experimente problemas de estabilidad en dispositivos con recursos limitados como Raspberry Pi, especialmente cuando se utiliza como puerta de enlace. Los síntomas incluyen excepciones de memoria insuficiente en el módulo del centro de IoT Edge, los dispositivos de nivel inferior no pueden conectarse o el dispositivo deja de enviar mensajes de telemetría después de unas horas.
Causa
El centro de IoT Edge, que forma parte del runtime de IoT Edge, está optimizado para el rendimiento de manera predeterminada e intenta asignar grandes fragmentos de memoria. Esta optimización no es ideal para dispositivos con perímetro limitado y puede causar problemas de estabilidad.
Solución
En el centro de IoT Edge, establezca una variable de entorno OptimizeForPerformance en false. Hay dos maneras de establecer variables de entorno:
En Azure Portal:
En el IoT Hub, seleccione el dispositivo de IoT Edge y, en la página Detalles del dispositivo, seleccione Establecer módulos>Configuración de tiempo de ejecución. Cree una variable de entorno para el módulo del centro de IoT Edge denominada OptimizeForPerformance establecida en false.
En el manifiesto de implementación:
"edgeHub": {
"type": "docker",
"settings": {
"image": "mcr.microsoft.com/azureiotedge-hub:1.1",
"createOptions": <snipped>
},
"env": {
"OptimizeForPerformance": {
"value": "false"
}
},
El demonio de seguridad no se pudo iniciar correctamente
Síntomas
El demonio de seguridad no se inicia y no se crean los contenedores de módulos. El edgeAgent
, edgeHub
y otros módulos personalizados no se inician por el servicio IoT Edge. En registros aziot-edged
, ve este error:
- El demonio no se pudo iniciar correctamente: no se pudo iniciar el servicio de administración
- causado por: un error en la ruta de acceso /var/run/iotedge/mgmt.sock
- causado por: permiso denegado (error 13 del SO)
Causa
Para todas las distribuciones de Linux excepto CentOS 7, la configuración predeterminada de IoT Edge es usar la activación de sockets systemd
. Se produce un error de permiso si cambia el archivo de configuración para que no use la activación de sockets, pero deja las direcciones URL como /var/run/iotedge/*.sock
, ya que el usuario iotedge
no puede escribir a /var/run/iotedge
, lo que significa que no puede desbloquear y montar los propios sockets.
Solución
No es necesario deshabilitar la activación de sockets en una distribución en la que se admite la activación de sockets. Sin embargo, si prefiere no usar la activación de sockets, coloque los sockets en /var/lib/iotedge/
.
- Ejecute
systemctl disable iotedge.socket iotedge.mgmt.socket
para deshabilitar las unidades de socket para que systemd no las inicie innecesariamente. - Cambio de la configuración de iotedge para usar
/var/lib/iotedge/*.sock
en las seccionesconnect
ylisten
- Si ya tiene módulos, tienen los montajes
/var/run/iotedge/*.sock
antiguos, así que los debedocker rm -f
.
No se pudo iniciar el módulo debido a un error de coincidencia del sistema operativo
Síntoma
El módulo edgeHub no se inicia en IoT Edge versión 1.1.
Causa
El módulo de Windows usa una versión de Windows que no es compatible con la versión de Windows del host. La versión 1809 de Windows, compilación 17763 para IoT Edge se necesita como capa base para la imagen del módulo, pero hay una versión diferente en uso.
Solución
Compruebe la versión de los distintos sistemas operativos Windows en Solución de errores de coincidencia de imágenes de host y contenedor. Si los sistemas operativos son diferentes, actualícelos a la versión 1809 de Windows, compilación 17763 para IoT Edge y vuelva a compilar la imagen de Docker usada para ese módulo.
Redes
Error de nombre de host no válido del demonio de seguridad de IoT Edge
Síntomas
Al intentar consultar los registros del administrador de seguridad de IoT Edge se produce un error y se muestra el siguiente mensaje:
Error parsing user input data: invalid hostname. Hostname cannot be empty or greater than 64 characters
Causa
El tiempo de ejecución de IoT Edge solo puede admitir los nombres de host que tienen menos de 64 caracteres. Las máquinas físicas no suelen tener nombres de host largos, pero el problema es más común en una máquina virtual. Los nombres de host generados automáticamente para las máquinas virtuales Windows hospedadas en Azure, en particular, suelen ser largos.
Solución
Cuando vea este error, puede resolverlo configurando el nombre DNS de la máquina virtual y, a continuación, estableciendo el nombre DNS como nombre de host en el comando de configuración.
En Azure Portal, navegue a la hoja de introducción de la máquina virtual.
Seleccione configurar en el nombre DNS. Si la máquina virtual ya tiene configurado un nombre DNS, no es necesario configurar uno nuevo.
Proporcione un valor para Etiqueta de nombre DNS y seleccione Guardar.
Copie el nuevo nombre DNS, que debe tener el formato <etiquetanombreDNS>.< ubicaciónvm>.cloudapp.azure.com.
Dentro de la máquina virtual, use el comando siguiente para configurar el tiempo de ejecución de IoT Edge con el nombre DNS:
En Linux:
sudo nano /etc/iotedge/config.yaml
En Windows:
notepad C:\ProgramData\iotedge\config.yaml
El módulo IoT Edge notifica errores de conectividad
Síntomas
Los módulos IoT Edge que se conectan directamente a los servicios en la nube, incluidos los módulos en tiempo de ejecución, dejan de funcionar según lo previsto y devuelven errores de conexión o red.
Causa
Los contenedores se basan en el reenvío de paquetes IP para conectarse a Internet para que puedan comunicarse con los servicios en la nube. El reenvío de paquetes IP está habilitado de forma predeterminada en Docker, pero, si se deshabilita, los módulos que se conectan a los servicios en la nube no funcionarán según lo previsto. Para más información, vea Información sobre la comunicación de contenedores en la documentación de Docker.
Solución
Siga estos pasos para habilitar el reenvío de paquetes IP.
En Windows:
Abra la aplicación Ejecutar.
Escriba
regedit
en el cuadro de texto y seleccione Aceptar.En la ventana Editor del Registro, vaya a HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters.
Busque el parámetro IPEnableRouter.
Si el parámetro existe, establezca el valor del parámetro en 1.
Si el parámetro no existe, agréguelo como nuevo parámetro con la siguiente configuración:
Configuración Value Nombre IPEnableRouter Tipo REG_DWORD Valor 1
Cierre la ventana del Editor del Registro.
Reinicie el sistema para aplicar los cambios.
En Linux:
Abra el archivo sysctl.conf.
sudo nano /etc/sysctl.conf
Agregue la siguiente línea al archivo.
net.ipv4.ip_forward=1
Guarde y cierre el archivo.
Reinicie el servicio de red y el servicio de Docker para aplicar los cambios.
Pasos siguientes
¿Cree que encontró un error en la plataforma de IoT Edge? Envíe un problema para que podamos seguir mejorando.
Si tiene más preguntas, cree una solicitud de soporte técnico para obtener ayuda.