Tutorial: Creación de una jerarquía de dispositivos IoT Edge

Se aplica a:marca de verificación de IoT Edge 1.4 IoT Edge 1.4

Importante

IoT Edge 1.4 es la versión admitida. Si está en una versión anterior, consulte Actualización de IoT Edge.

Puede implementar nodos de Azure IoT Edge en redes organizadas en capas jerárquicas. Cada capa de una jerarquía es un dispositivo de puerta de enlace que controla los mensajes y las solicitudes de los dispositivos de la capa que se encuentra debajo. Esta configuración también se conoce como perímetro anidado.

Puede estructurar una jerarquía de dispositivos para que solo la capa superior tenga conectividad a la nube y las capas inferiores solo puedan comunicarse con las capas ascendentes y descendentes adyacentes. Estas capas de red constituyen la base de la mayoría de las redes industriales que siguen la norma ISA-95.

Este tutorial le guiará a través de la creación de una jerarquía de dispositivos IoT Edge, la implementación de contenedores en el entorno de ejecución de Azure IoT Edge en los dispositivos y la configuración local de estos. Realice las siguientes tareas:

  • Crear y definir las relaciones en una jerarquía de dispositivos IoT Edge.
  • Configurar el entorno de ejecución de Azure IoT Edge en los dispositivos de la jerarquía.
  • Instalar certificados coherentes en la jerarquía de dispositivos.
  • Agregar cargas de trabajo a los dispositivos de la jerarquía.
  • Use el módulo de proxy de API de IoT Edge para enrutar de forma segura el tráfico HTTP por un único puerto desde los dispositivos de nivel inferior.

Sugerencia

Este tutorial incluye una combinación de pasos manuales y automatizados para proporcionar una presentación de las características de IoT Edge anidadas.

Si prefiere una visión completamente automatizada de la configuración de una jerarquía de dispositivos IoT Edge, siga el ejemplo de Azure IoT Edge para IoT industrial con scripts. En este escenario con scripts se implementan máquinas virtuales de Azure como dispositivos preconfigurados para simular el entorno de una fábrica.

Si quiere conocer en profundidad los pasos manuales para crear y administrar una jerarquía de dispositivos IoT Edge, consulte la guía paso a paso sobre las jerarquías de puerta de enlace de dispositivos IoT Edge.

En este tutorial, se definen los siguientes niveles de red:

  • Nivel superior: Los dispositivos IoT Edge de este nivel se pueden conectar directamente a la nube.

  • Capas inferiores: los dispositivos IoT Edge en las capas situadas debajo de la superior no se pueden conectar directamente a la nube. Deben pasar por uno o más dispositivos IoT Edge intermediarios para enviar y recibir datos.

En este tutorial se usa una jerarquía de dos dispositivos para simplificar. El dispositivo de capa superior representa un dispositivo en la capa superior de la jerarquía, que se puede conectar directamente a la nube. También se hace referencia a este dispositivo como dispositivo primario. El dispositivo de capa inferior representa un dispositivo en la capa inferior de la jerarquía, que no se puede conectar directamente a la nube. Puede agregar más dispositivos para representar el entorno de producción, según sea necesario. Los dispositivos de las capas inferiores también se denominan dispositivos secundarios.

Estructura de la jerarquía del tutorial, que contiene dos dispositivos: el de nivel superior y el de nivel inferior

Nota

Un dispositivo secundario puede ser un dispositivo de bajada o un dispositivo de puerta de enlace en una topología anidada.

Requisitos previos

Para crear una jerarquía de dispositivos IoT Edge, necesita:

  • Un equipo (Windows o Linux) con conectividad a Internet.

  • Una cuenta de Azure con una suscripción válida. Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

  • Una instancia de IoT Hub de nivel estándar o gratis en Azure.

  • Un shell de Bash en Azure Cloud Shell usando la CLI de Azure con la extensión Azure IoT instalada. Este tutorial usa Azure Cloud Shell. Para ver las versiones actuales de los módulos y extensiones de la CLI de Azure, ejecute az version.

  • Dos dispositivos Linux para configurar la jerarquía. Si no tiene dispositivos disponibles, puede crear máquinas virtuales de Azure para cada dispositivo de la jerarquía con la plantilla de Azure Resource Manager de IoT Edge. IoT Edge versión 1.4 viene preinstalado con esta plantilla de Resource Manager. Si va a instalar IoT Edge en sus propios dispositivos, consulte Instalación de Azure IoT Edge para Linux o Actualización de IoT Edge.

  • Para simplificar la comunicación de red entre dispositivos, las máquinas virtuales deben estar en la misma red virtual o usar el emparejamiento de redes virtuales.

  • Asegúrese de que los siguientes puertos estén abiertos para todos los dispositivos de entrada, excepto para el dispositivo de capa inferior: 443, 5671, 8883:

    • 443: se usa entre centros perimetrales primarios y secundarios para las llamadas API REST y para extraer imágenes de contenedor de Docker.
    • 5671, 8883: se usan para AMQP y MQTT.

    Para más información, consulte Apertura de puertos en una máquina virtual con Azure Portal.

    Sugerencia

    En pasos posteriores, usará el identificador SSH y el nombre de dominio completo o la dirección IP de cada máquina virtual para la configuración, así que no debe perder de vista esta información. Puede encontrar la dirección IP y el nombre de dominio completo en Azure Portal. En el caso de la dirección IP, vaya a la lista de máquinas virtuales y anote la información del campo Dirección IP pública. Para encontrar el nombre de dominio completo, vaya a la página de información general de cada máquina virtual y busque el campo Nombre DNS. Para el identificador SSH, vaya a la página de conexión de cada máquina virtual.

Creación de la jerarquía de dispositivos IoT Edge

Los dispositivos IoT Edge componen las capas de la jerarquía. En este tutorial se crea una jerarquía de dos dispositivos IoT Edge: el dispositivo de capa superior y el dispositivo de capa inferior. Puede crear más dispositivos de bajada, según sea necesario.

Para crear y configurar la jerarquía de dispositivos IoT Edge, use el comando az iot edge devices create de la CLI de Azure. Este comando simplifica la configuración de la jerarquía gracias a la automatización y la condensación de varios pasos:

  • Creación de los dispositivos en IoT Hub
  • Establecimiento de las relaciones primario-secundario para autorizar la comunicación entre los dispositivos
  • Aplicación del manifiesto de implementación a cada dispositivo
  • Generación de una cadena de certificados para cada dispositivo a fin de establecer una comunicación segura entre ellos
  • Generación de archivos de configuración para cada dispositivo

Creación de la configuración de dispositivos

Cree un grupo de dispositivos perimetrales anidados que contenga un dispositivo primario con un dispositivo secundario. En este tutorial, se usan manifiestos de implementación de ejemplo básicos. Para otros ejemplos de escenarios, revise las plantillas de ejemplo de configuración.

  1. Antes de usar el comando az iot edge devices create, debe definir el manifiesto de implementación para los dispositivos de capa superior e inferior. Descargue el archivo de ejemplo deploymentTopLayer.json en el equipo local.

    El manifiesto de implementación de dispositivos de capa superior define el módulo de proxy de API de IoT Edge y declara la ruta del dispositivo de capa inferior a IoT Hub.

  2. Descargue el archivo de ejemplo deploymentLowerLayer.json en el equipo local.

    El manifiesto de implementación de dispositivos de capa inferior incluye el módulo de sensor de temperatura simulado y declara la ruta al dispositivo de capa superior. Puede ver en la sección systemModules que los módulos en tiempo de ejecución están establecidos para extraer de $upstream:443, en lugar de mcr.microsoft.com. El dispositivo de capa inferior envía solicitudes de imagen Docker al módulo IoT Edge API Proxy (Proxy de API de IoT Edge) en el puerto 443, ya que no puede extraer directamente las imágenes de la nube. El otro módulo implementado en el dispositivo de capa inferior, el módulo Simulated Temperature Sensor (Sensor de temperatura simulado), también realiza su solicitud de imágenes a $upstream:443.

    Para obtener más información sobre cómo crear un manifiesto de implementación de capa inferior, consulte Conexión de dispositivos de Azure IoT Edge para crear una jerarquía.

  3. En Azure Cloud Shell, use el comando az iot edge devices create de la CLI de Azure para crear dispositivos en IoT Hub y agrupaciones de configuración para cada dispositivo de la jerarquía. Reemplace los siguientes marcadores de posición por los valores adecuados:

    Marcador de posición Descripción
    <hub-name> El nombre de IoT Hub.
    <config-bundle-output-path> La ruta de acceso de la carpeta donde desea guardar las agrupaciones de configuración.
    <parent-device-name> Nombre del identificador de dispositivo primario de capa superior.
    <parent-deployment-manifest> El archivo de manifiesto de implementación del dispositivo primario.
    <parent-fqdn-or-ip> Nombre de dominio completo (FQDN) o dirección IP del dispositivo primario.
    <child-device-name> El nombre del identificador de dispositivo secundario de capa inferior.
    <child-deployment-manifest> El archivo de manifiesto de implementación del dispositivo secundario.
    <child-fqdn-or-ip> Nombre de dominio completo (FQDN) o dirección IP del dispositivo secundario.
    az iot edge devices create \
       --hub-name <hub-name> \
       --output-path <config-bundle-output-path> \
       --default-edge-agent "mcr.microsoft.com/azureiotedge-agent:1.4" \
       --device id=<parent-device-name> \
          deployment=<parent-deployment-manifest> \
          hostname=<parent-fqdn-or-ip> \
       --device id=child-1 \
          parent=parent-1 \
          deployment=<child-deployment-manifest> \
          hostname=<child-fqdn-or-ip>
    

    Por ejemplo, el siguiente comando crea una jerarquía de dos dispositivos IoT Edge en IoT Hub. Un dispositivo de capa superior denominado parent-1 y un dispositivo de capa inferior denominado child-1*. El comando guarda las agrupaciones de configuración de cada dispositivo en el directorio de salida. El comando también genera certificados de prueba autofirmados y los incluye en la agrupación de configuración. Las agrupaciones de configuración se instalan en cada dispositivo mediante un script de instalación.

    az iot edge devices create \
       --hub-name my-iot-hub \
       --output-path ./output \
       --default-edge-agent "mcr.microsoft.com/azureiotedge-agent:1.4" \
       --device id=parent-1 \
          deployment=./deploymentTopLayer.json \
          hostname=10.0.0.4 \
       --device id=child-1 \
          parent=parent-1 \
          deployment=./deploymentLowerLayer.json \
          hostname=10.1.0.4
    

Después de ejecutar el comando, puede encontrar las agrupaciones de configuración del dispositivo en el directorio de salida. Por ejemplo:

PS C:\nested-edge\output> dir

   Directory: C:\nested-edge\output

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           4/10/2023  4:12 PM           7192 child-1.tgz
-a---           4/10/2023  4:12 PM           6851 parent-1.tgz

Puede usar sus propios certificados y claves pasados como argumentos al comando o crear una jerarquía de dispositivos más compleja. Para obtener más información sobre cómo crear dispositivos anidados mediante el comando az, consulte az iot edge devices create. Si no está familiarizado con el modo en que se usan los certificados en un escenario de puerta de enlace, consulte la sección sobre los certificados en la guía paso a paso.

En este tutorial, usará argumentos insertados para crear los dispositivos y las agrupaciones de configuración. También puede usar un archivo de configuración en formato YAML o JSON. Para obtener un archivo de configuración de ejemplo, consulte el ejemplo sample_devices_config.yaml.

Configuración del runtime de IoT Edge

Además del aprovisionamiento de los dispositivos, los pasos de configuración establecen una comunicación de confianza entre los dispositivos de la jerarquía mediante los certificados que ha creado antes. Los pasos también comienzan a establecer la estructura de red de la jerarquía. El dispositivo de capa superior mantiene la conectividad a Internet, lo que le permitirá extraer imágenes de su entorno de ejecución de la nube, mientras que los dispositivos de capa inferior se enrutan mediante el de capa superior para acceder a estas imágenes.

Para configurar el entorno de ejecución de IoT Edge, debe aplicar las agrupaciones de configuración al dispositivo. Las configuraciones varían entre el dispositivo de capa superior y un dispositivo de capa inferior, por lo que debe tener en cuenta el archivo de configuración del dispositivo que aplique a cada uno.

  1. Copie cada archivo de almacenamiento de agrupación de configuración en su dispositivo correspondiente. Puede usar una unidad USB, un servicio como Azure Key Vault o una función como Secure file copy. Elija el método que mejor se adapte a su escenario.

    Por ejemplo, para enviar la agrupación de configuración de parent-1 al directorio principal de la máquina virtual parent-1, podría usar un comando como el ejemplo siguiente:

    scp ./output/parent-1.tgz admin@parent-1-vm.westus.cloudapp.azure.com:~
    
  2. En cada dispositivo, extraiga el archivo de agrupación de configuración. Por ejemplo, use el comando tar para extraer el archivo de almacenamiento parent-1:

    tar -xzf ./parent-1.tgz
    
  3. Establezca el permiso de ejecución para el script de instalación.

    chmod +x install.sh
    
  4. En cada dispositivo, aplique la agrupación de configuración al dispositivo con el permiso raíz:

    sudo ./install.sh
    

    Al instalar las agrupaciones de configuración, se actualizan los archivos config.toml en el dispositivo y se reinician todos los servicios IoT Edge de manera automática

    Si quiere ver más de cerca las modificaciones que se realizan en el archivo de configuración del dispositivo, consulte Conexión conjunta de dispositivos de Azure IoT Edge para crear una jerarquía.

Para comprobar que los dispositivos estén configurados correctamente, ejecute las comprobaciones de configuración y conectividad en los dispositivos.

sudo iotedge check
admin@child-1-vm:~$ sudo iotedge check

Configuration checks (aziot-identity-service)
---------------------------------------------
√ keyd configuration is well-formed - OK
√ certd configuration is well-formed - OK
√ tpmd configuration is well-formed - OK
√ identityd configuration is well-formed - OK
√ daemon configurations up-to-date with config.toml - OK
√ identityd config toml file specifies a valid hostname - OK
√ host time is close to reference time - OK
√ preloaded certificates are valid - OK
√ keyd is running - OK
√ certd is running - OK
√ identityd is running - OK
√ read all preloaded certificates from the Certificates Service - OK
√ read all preloaded key pairs from the Keys Service - OK
√ check all EST server URLs utilize HTTPS - OK
√ ensure all preloaded certificates match preloaded private keys with the same ID - OK

Connectivity checks (aziot-identity-service)
--------------------------------------------
√ host can connect to and perform TLS handshake with iothub AMQP port - OK
√ host can connect to and perform TLS handshake with iothub HTTPS / WebSockets port - OK
√ host can connect to and perform TLS handshake with iothub MQTT port - OK

Configuration checks
--------------------
√ aziot-edged configuration is well-formed - OK
√ configuration up-to-date with config.toml - OK
√ container engine is installed and functional - OK
√ configuration has correct parent_hostname - OK
√ configuration has correct URIs for daemon mgmt endpoint - OK
√ container time is close to host time - OK
‼ DNS server - Warning
    Container engine is not configured with DNS server setting, which may impact connectivity to IoT Hub.
    Please see https://aka.ms/iotedge-prod-checklist-dns for best practices.
    You can ignore this warning if you are setting DNS server per module in the Edge deployment.
‼ production readiness: logs policy - Warning
    Container engine is not configured to rotate module logs which may cause it run out of disk space.
    Please see https://aka.ms/iotedge-prod-checklist-logs for best practices.
    You can ignore this warning if you are setting log policy per module in the Edge deployment.
‼ production readiness: Edge Agent's storage directory is persisted on the host filesystem - Warning
    The edgeAgent module is not configured to persist its /tmp/edgeAgent directory on the host filesystem.
    Data might be lost if the module is deleted or updated.
    Please see https://aka.ms/iotedge-storage-host for best practices.
‼ production readiness: Edge Hub's storage directory is persisted on the host filesystem - Warning
    The edgeHub module is not configured to persist its /tmp/edgeHub directory on the host filesystem.
    Data might be lost if the module is deleted or updated.
    Please see https://aka.ms/iotedge-storage-host for best practices.
√ Agent image is valid and can be pulled from upstream - OK
√ proxy settings are consistent in aziot-edged, aziot-identityd, moby daemon and config.toml - OK

Connectivity checks
-------------------
√ container on the default network can connect to upstream AMQP port - OK
√ container on the default network can connect to upstream HTTPS / WebSockets port - OK
√ container on the IoT Edge module network can connect to upstream AMQP port - OK
√ container on the IoT Edge module network can connect to upstream HTTPS / WebSockets port - OK
30 check(s) succeeded.
4 check(s) raised warnings. Re-run with --verbose for more details.
2 check(s) were skipped due to errors from other checks. Re-run with --verbose for more details.

En el dispositivo de capa superior, podrá ver una salida con varias evaluaciones superadas. Es posible que vea algunas advertencias sobre registros, directivas y, en función de la red, directivas de DNS.

Implementación del módulo de dispositivo

La implementación del módulo para los dispositivos se aplicó cuando los dispositivos se crearon en IoT Hub. El comando az iot edge devices create aplicó los archivos JSON de implementación para los dispositivos de capa superior e inferior. Después de finalizar esas implementaciones, el dispositivo de capa inferior usa el módulo Proxy de API de IoT Edge para extraer las imágenes necesarias.

Además de los módulos IoT Edge Agent (Agente de IoT Edge) y IoT Edge Hub (Concentrador de IoT Edge), el dispositivo de capa superior recibe el módulo Docker Registry y el módulo IoT Edge API Proxy (Proxy de API de IoT Edge).

El módulo Docker Registry apunta a una instancia existente de Azure Container Registry. En este caso, REGISTRY_PROXY_REMOTEURL apunta a Microsoft Container Registry. De forma predeterminada, el registro de Docker escucha en el puerto 5000.

El módulo IoT Edge API Proxy (Proxy de API de IoT Edge) enruta las solicitudes HTTP a otros módulos, lo que permite que los dispositivos de capa inferior extraigan imágenes del contenedor o inserten blobs en el almacenamiento. En este tutorial, se comunica en el puerto 443 y está configurado para enviar la ruta de solicitudes de extracción de imágenes de contenedor de Docker al módulo Docker Registry en el puerto 5000. Además, cualquier solicitud de carga de Blob Storage se enruta al módulo AzureBlobStorageonIoTEdge en el puerto 11002. Para más información sobre el módulo IoT Edge API Proxy (Proxy de API de IoT Edge) y cómo configurarlo, consulte la guía paso a paso del módulo.

Si quiere ver cómo crear una implementación como esta mediante Azure Portal o Azure Cloud Shell, consulte la sección sobre los dispositivos de nivel superior en la guía paso a paso.

Puede ver el estado de los módulos mediante el comando:

az iot hub module-twin show --device-id <edge-device-id> --module-id '$edgeAgent' --hub-name <iot-hub-name> --query "properties.reported.[systemModules, modules]"

Este comando genera todas las propiedades notificadas de edgeAgent. Algunas de estas son útiles para supervisar el estado del dispositivo: runtime status, runtime start time, runtime last exit time, runtime restart count.

También puede ver el estado de los módulos en Azure Portal. Vaya a la sección Dispositivos de su centro de IoT para ver los dispositivos y módulos.

Visualización de datos generados

El módulo Simulated Temperature Sensor que insertó genera datos de entorno de ejemplo. Envía mensajes con la temperatura y la humedad ambiental, la temperatura y la presión de la máquina, y una marca de tiempo.

También puede ver estos mensajes mediante Azure Cloud Shell:

az iot hub monitor-events -n <iot-hub-name> -d <lower-layer-device-name>

Por ejemplo:

az iot hub monitor-events -n my-iot-hub -d child-1
{
    "event": {
        "origin": "child-1",
        "module": "simulatedTemperatureSensor",
        "interface": "",
        "component": "",
        "payload": "{\"machine\":{\"temperature\":104.29281270901808,\"pressure\":10.48905461241978},\"ambient\":{\"temperature\":21.086561171611102,\"humidity\":24},\"timeCreated\":\"2023-04-17T21:50:30.1082487Z\"}"
    }
}

Solución de problemas

Ejecute el comando iotedge check para comprobar la configuración y solucionar errores.

Puede ejecutar iotedge check en una jerarquía anidada, incluso si los dispositivos de bajada no tienen acceso directo a Internet.

Cuando se ejecuta iotedge check desde la capa inferior, el programa intenta extraer la imagen del dispositivo primario mediante el puerto 443.

El valor de azureiotedge-diagnostics se extrae del registro de contenedor vinculado al módulo del registro. En este tutorial se ha establecido de forma predeterminada en https://mcr.microsoft.com:

Nombre Value
REGISTRY_PROXY_REMOTEURL https://mcr.microsoft.com

Si utiliza un registro de contenedor privado, asegúrese de que todas las imágenes (IoTEdgeAPIProxy, edgeAgent, edgeHub, Simulated Temperature Sensor y diagnostics) aparezcan en él.

Si un dispositivo de bajada tuviera una arquitectura de procesador diferente del dispositivo primario, necesitará la imagen de arquitectura adecuada. Puede usar un registro conectado o bien especificar la imagen correcta para los módulos edgeAgent y edgeHub en el archivo config.toml del dispositivo de bajada. Por ejemplo, si el dispositivo primario se ejecuta en una arquitectura ARM32v7 y el dispositivo de bajada se ejecuta en una arquitectura AMD64, debe especificar la versión coincidente y la etiqueta de imagen de arquitectura en el archivo config.toml del dispositivo de bajada.

[agent.config]
image = "$upstream:443/azureiotedge-agent:1.4.10-linux-amd64"

"systemModules": {
   "edgeAgent": {
      "settings": {
            "image": "$upstream:443/azureiotedge-agent:1.4.10-linux-amd64"
      },
   },
   "edgeHub": {
      "settings": {
            "image": "$upstream:443/azureiotedge-hub:1.4.10-linux-amd64",
      }
   }
}

Limpieza de recursos

Para evitar gastos, puede eliminar las configuraciones locales y los recursos de Azure que creó en este artículo.

Para eliminar los recursos:

  1. Inicie sesión en Azure Portal y después seleccione Grupos de recursos.

  2. Seleccione el nombre del grupo de recursos que contiene los recursos de prueba de IoT Edge.

  3. Revise la lista de los recursos contenidos en el grupo de recursos. Si desea eliminar todos ellos, puede seleccionar Eliminar grupo de recursos. Si desea eliminar solo algunos de ellos, puede seleccionar cada recurso para eliminarlos individualmente.

Pasos siguientes

En este tutorial, configuró dos dispositivos IoT Edge como puertas de enlace y estableció uno como el dispositivo primario del otro. Después, ha extraído una imagen de contenedor al dispositivo de bajada por medio de una puerta de enlace con el módulo de proxy de la API de IoT Edge. Si quiere más información, consulte la guía paso a paso sobre el uso del módulo de proxy.

Para obtener más información sobre el uso de puertas de enlace para crear capas jerárquicas de dispositivos IoT Edge, consulte el siguiente artículo.