Condividi tramite


Esercitazione: Creare una gerarchia di dispositivi IoT Edge usando IoT Edge per Linux in Windows

Si applica a: Segno di spunta IoT Edge 1.4 IoT Edge 1.4

Importante

IoT Edge 1.5 LTS e IoT Edge 1.4 sono versioni supportate. IoT Edge 1.4 LTS raggiungerà il fine vita il 12 novembre 2024. Se si usa una versione precedente, vedere Aggiornare IoT Edge.

Questa esercitazione illustra come distribuire nodi di Azure IoT Edge in reti organizzate in livelli gerarchici. Ogni livello di una gerarchia è un dispositivo gateway che gestisce messaggi e richieste provenienti da dispositivi del livello sottostante. Questa configurazione è nota anche come edge annidato.

È possibile strutturare una gerarchia di dispositivi in modo che solo il livello superiore disponga della connettività al cloud e che i livelli inferiori possano comunicare solo con i livelli a nord e a sud adiacenti. Questa suddivisione in livelli della rete è alla base della maggior parte delle reti industriali, che seguono lo standard ISA-95.

Questa esercitazione illustra come creare una gerarchia di dispositivi IoT Edge usando IoT Edge per Linux in Windows, distribuire contenitori di runtime IoT Edge nei dispositivi e configurare i dispositivi in locale. Eseguire le attività seguenti:

  • Creare e definire le relazioni in una gerarchia di dispositivi IoT Edge.
  • Configurare il runtime IoT Edge nei dispositivi della gerarchia.
  • Installare certificati coerenti nella gerarchia dei dispositivi.
  • Aggiungere carichi di lavoro ai dispositivi della gerarchia.
  • Usare un modulo proxy API IoT Edge per instradare in modo sicuro il traffico HTTP attraverso una singola porta dai dispositivi di livello inferiore.

Suggerimento

Questa esercitazione include una combinazione di passaggi manuali e automatizzati per offrire una presentazione delle funzionalità di IoT Edge annidate.

Se si vuole un'analisi completamente automatizzata della configurazione di una gerarchia di dispositivi IoT Edge, è possibile guidare uno script personalizzato in base all'esempio di IoT Edge di Azure IoT per industrial IoT. Questo scenario con script distribuisce le macchine virtuali di Azure come dispositivi preconfigurati per simulare un ambiente factory.

Per un'analisi approfondita dei passaggi manuali per creare e gestire una gerarchia di dispositivi IoT Edge, vedere la guida pratica sulle gerarchie del gateway dispositivo IoT Edge.

In questa esercitazione vengono definiti i livelli di rete seguenti:

  • Livello superiore: i dispositivi IoT Edge in questo livello possono connettersi direttamente al cloud.

  • Livelli inferiori: i dispositivi IoT Edge a livelli al di sotto del livello superiore non possono connettersi direttamente al cloud. Devono passare attraverso uno o più dispositivi IoT Edge intermediari per inviare e ricevere dati.

Questa esercitazione usa una gerarchia costituita da due dispositivi per semplicità. Il dispositivo di livello superiore rappresenta un dispositivo al livello superiore della gerarchia che può connettersi direttamente al cloud. Questo dispositivo viene definito dispositivo padre. Il dispositivo di livello inferiore rappresenta un dispositivo al livello inferiore della gerarchia che non può connettersi direttamente al cloud. È possibile aggiungere altri dispositivi per rappresentare l'ambiente di produzione in base alle esigenze. I dispositivi a livelli inferiori sono definiti dispositivi figlio.

Struttura della gerarchia dell'esercitazione, contenente due dispositivi: il dispositivo di livello superiore e il dispositivo di livello inferiore

Nota

Un dispositivo figlio può essere un dispositivo downstream o un dispositivo gateway in una topologia annidata.

Prerequisiti

Per creare una gerarchia di dispositivi IoT Edge occorre:

  • Shell Bash in Azure Cloud Shell usando l'interfaccia della riga di comando di Azure v2.3.1 con l'estensione Azure IoT v0.10.6 o successiva installata. Questa esercitazione usa Azure Cloud Shell. Per visualizzare le versioni correnti dei moduli e delle estensioni dell'interfaccia della riga di comando di Azure, eseguire az version.
  • Due dispositivi Windows che eseguono Azure IoT Edge per Linux in Windows. Entrambi i dispositivi devono essere distribuiti usando un commutatore virtuale esterno.

Suggerimento

È possibile usare un commutatore virtuale interno o predefinito se è configurato un port forwarding nel sistema operativo host Windows. Tuttavia, per semplicità di questa esercitazione, entrambi i dispositivi devono usare un commutatore virtuale esterno e essere connessi alla stessa rete esterna.

Per altre informazioni sulla rete, vedere Azure IoT Edge per Linux in rete Windows e Configurazione di rete per Azure IoT Edge per Linux in Windows.

Se è necessario configurare i dispositivi EFLOW in una rete perimetrale, vedere Come configurare Azure IoT Edge per Linux in Windows Industrial IoT & configurazione DMZ.

  • Un account Azure con una sottoscrizione valida. Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
  • Un hub IoT di livello Gratuito o Standard in Azure.
  • Assicurarsi che le porte seguenti siano aperte in ingresso per tutti i dispositivi ad eccezione del dispositivo di livello più basso: 443, 5671, 8883:
    • 443: usato tra hub perimetrali padre e figlio per le chiamate API REST e per eseguire il pull delle immagini del contenitore Docker.
    • 5671, 8883: usate per AMQP e MQTT.

Suggerimento

Per altre informazioni sul firewall delle macchine virtuali EFLOW, vedere Sicurezza di IoT Edge per Linux in Windows.

Creare la gerarchia di dispositivi IoT Edge

I dispositivi IoT Edge costituiscono i livelli della gerarchia. Questa esercitazione crea una gerarchia di due dispositivi IoT Edge: il dispositivo di livello superiore e il dispositivo di livello inferiore. È possibile creare più dispositivi downstream in base alle esigenze.

Per creare e configurare la gerarchia dei dispositivi IoT Edge, usare il comando az iot edge devices create dell'interfaccia della riga di comando di Azure. Il comando semplifica la configurazione della gerarchia automatizzando e condensando diversi passaggi:

  • Crea dispositivi nell'hub IoT
  • Imposta le relazioni padre-figlio per autorizzare la comunicazione tra i dispositivi
  • Applica il manifesto della distribuzione a ogni dispositivo
  • Genera una catena di certificati per ogni dispositivo per stabilire comunicazioni sicure tra di esse
  • Genera i file di configurazione per ogni dispositivo

Creare la configurazione di un dispositivo

Si crea un gruppo di dispositivi perimetrali annidati con un dispositivo padre con un dispositivo figlio. In questa esercitazione vengono usati manifesti di distribuzione di esempio di base. Per altri esempi di scenario, esaminare i modelli di esempio di configurazione.

  1. Prima di usare il comando az iot edge devices create, è necessario definire il manifesto della distribuzione per i dispositivi di livello superiore e inferiore. Scaricare il file di esempio deploymentTopLayer.json nel computer locale.

    Il manifesto della distribuzione del dispositivo di livello superiore definisce il modulo proxy dell’API IoT Edge e dichiara la route dal dispositivo di livello inferiore all'hub IoT.

  2. Scaricare il file di esempio deploymentLowerLayer.json nel computer locale.

    Il manifesto della distribuzione del dispositivo di livello inferiore include il modulo del sensore di temperatura simulato e dichiara la route al dispositivo di livello superiore. Nella sezione systemModules è possibile visualizzare che i moduli di runtime sono impostati per eseguire il pull da $upstream:443, invece di mcr.microsoft.com. Il dispositivo di livello inferiore invia richieste di immagine Docker al modulo Proxy API IoT Edge sulla porta 443, perché non può eseguire direttamente il pull delle immagini dal cloud. L'altro modulo distribuito nel dispositivo di livello inferiore, il modulo Sensore temperatura simulato, effettua anche la richiesta di immagine a $upstream:443.

    Per altre informazioni su come creare un manifesto della distribuzione di livello inferiore, vedere Connettere i dispositivi Azure IoT Edge per creare una gerarchia.

  3. Nella Azure Cloud Shellusare il comando dell'interfaccia della riga di comando di Azure az iot edge devices create per creare dispositivi nell'hub IoT e i bundle di configurazione per ogni dispositivo nella gerarchia. Sostituire i segnaposto seguenti con i valori appropriati:

    Segnaposto Descrizione
    <hub-name> Il nome dell'hub IoT.
    <config-bundle-output-path> Percorso della cartella in cui salvare i bundle di configurazione.
    <parent-device-name> Il nome ID dispositivo padre di livello superiore.
    <parent-deployment-manifest> File manifesto della distribuzione del dispositivo padre.
    <parent-fqdn-or-ip> Nome di dominio completo (FQDN) del dispositivo padre o indirizzo IP.
    <child-device-name> Il nome ID dispositivo figlio di livello inferiore.
    <child-deployment-manifest> File manifesto della distribuzione del dispositivo figlio.
    <child-fqdn-or-ip> Nome di dominio completo (FQDN) del dispositivo figlio o indirizzo IP.
    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>
    

    Ad esempio, il comando seguente crea una gerarchia di due dispositivi IoT Edge nell'hub IoT. Un dispositivo di livello superiore denominato parent-1 e un dispositivo di livello inferiore denominato child-1*. Il comando salva i bundle di configurazione per ogni dispositivo nella directory di output. Il comando genera anche certificati di test autofirmato e li include nel bundle di configurazione. I bundle di configurazione vengono installati in ogni dispositivo usando uno script di installazione.

    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
    

Dopo aver eseguito il comando, è possibile trovare i bundle di configurazione del dispositivo nella directory di output. Ad esempio:

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

È possibile usare certificati e chiavi personalizzati passati come argomenti al comando o creare una gerarchia di dispositivi più complessa. Per altre informazioni sulla creazione di dispositivi annidati usando il comando az, vedere az iot edge devices create. Se non si ha familiarità con il modo in cui vengono usati i certificati in uno scenario del gateway, vedere la sezione relativa al certificato della guida pratica.

In questa esercitazione si usano argomenti inline per creare i dispositivi e i bundle di configurazione. È anche possibile usare un file di configurazione in formato YAML o JSON. Per un file di configurazione di esempio, vedere l'esempio sample_devices_config.yaml.

Configurare il runtime di IoT Edge

Oltre al provisioning dei dispositivi, i passaggi di configurazione stabiliscono comunicazioni attendibili tra i dispositivi nella gerarchia usando i certificati creati in precedenza. I passaggi iniziano anche a stabilire la struttura di rete della gerarchia. Il dispositivo di livello superiore mantiene la connettività Internet, consentendo di eseguire il pull delle immagini per il runtime dal cloud, mentre i dispositivi di livello inferiore instradano attraverso il dispositivo di livello superiore per accedere a queste immagini.

Per configurare il runtime di IoT Edge, è necessario applicare i bundle di configurazione ai dispositivi. Le configurazioni differiscono tra il dispositivo di livello superiore e un dispositivo di livello inferiore, quindi tenere presente il file di configurazione del dispositivo che si sta applicando a ogni dispositivo.

Ogni dispositivo necessita del relativo bundle di configurazione corrispondente. È possibile usare un'unità USB o una copia di file sicura per spostare i bundle di configurazione in ogni dispositivo. È necessario copiare il bundle di configurazione nel sistema operativo host Windows di ogni dispositivo EFLOW e quindi copiarlo nella macchina virtuale EFLOW.

Avviso

Assicurarsi di inviare il bundle di configurazione corretto a ogni dispositivo.

Configurazione del dispositivo di livello superiore

  1. Connettersi al dispositivo host Windows di livello superiore e copiare il file parent-1.tzg nel dispositivo.

  2. Avviare una sessione di PowerShell con privilegi elevati usando Esegui come amministratore.

  3. Copiare parent-1.tzg nella macchina virtuale EFLOW.

    Copy-EflowVmFile -fromFile parent-1.tzg -toFile ~/ -pushFile
    
  4. Connettersi alla macchina virtuale EFLOW

    Connect-EflowVm
    
  5. Estrarre l'archivio bundle di configurazione. Ad esempio, usare il comando tar per estrarre il file di archivio padre-1:

    tar -xzf ./parent-1.tgz
    
  6. Impostare l'autorizzazione di esecuzione per lo script di installazione.

    chmod +x install.sh
    
  7. Eseguire lo script install.sh.

    sudo sh ./install.sh
    
  8. Applicare le autorizzazioni corrette per il certificato e riavviare il runtime di IoT Edge.

    sudo chmod -R 755 /etc/aziot/certificates/
    sudo iotedge system restart
    
  9. Verificare che tutti i servizi IoT Edge siano in esecuzione correttamente.

    sudo iotedge system status
    
  10. Aggiungere infine le regole del firewall appropriate per abilitare la connettività tra il dispositivo di livello inferiore e il dispositivo di livello superiore.

    sudo iptables -A INPUT -p tcp --dport 5671 -j ACCEPT
    sudo iptables -A INPUT -p tcp --dport 8883 -j ACCEPT
    sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
    sudo iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
    sudo iptables-save | sudo tee /etc/systemd/scripts/ip4save
    
  11. Eseguire i controlli di configurazione e connettività nei dispositivi.

    sudo iotedge check
    

Nel dispositivo di livello superiore, si prevede di visualizzare un output con diverse valutazioni passanti. Potrebbero essere visualizzati alcuni avvisi relativi ai criteri di log e, a seconda della rete, dei criteri DNS.

Per un'analisi più approfondita delle modifiche apportate al file di configurazione del dispositivo, vedere la sezione configurare IoT Edge nei dispositivi della guida pratica.

Configurazione del dispositivo di livello inferiore

  1. Connettersi al dispositivo host Windows di livello inferiore e copiare il file figlio-1.tzg nel dispositivo.

  2. Avviare una sessione di PowerShell con privilegi elevati usando Esegui come amministratore.

  3. Copiare child-1.tzg nella macchina virtuale EFLOW.

    Copy-EflowVmFile -fromFile child-1.tzg -toFile ~/ -pushFile
    
  4. Connettersi alla macchina virtuale EFLOW

    Connect-EflowVm
    
  5. Estrarre l'archivio bundle di configurazione. Ad esempio, usare il comando tar per estrarre il file di archivio figlio-1:

    tar -xzf ./child-1.tgz
    
  6. Impostare l'autorizzazione di esecuzione per lo script di installazione.

    chmod +x install.sh
    
  7. Eseguire lo script install.sh.

    sudo sh ./install.sh
    
  8. Applicare le autorizzazioni corrette per il certificato e riavviare il runtime di IoT Edge.

    sudo chmod -R 755 /etc/aziot/certificates/
    sudo iotedge system restart
    
  9. Verificare che tutti i servizi IoT Edge siano in esecuzione correttamente.

    sudo iotedge system status
    
  10. Eseguire i controlli di configurazione e connettività nei dispositivi. Per il dispositivo di livello inferiore, l'immagine di diagnostica deve essere passata manualmente nel comando:

    sudo iotedge check --diagnostics-image-name <parent_device_fqdn_or_ip>:443/azureiotedge-diagnostics:1.2
    

Se i passaggi precedenti sono stati completati correttamente, è possibile verificare che i dispositivi siano configurati correttamente. Dopo aver soddisfatto le configurazioni corrette in ogni dispositivo, è possibile procedere.

Distribuzione del modulo del dispositivo

La distribuzione del modulo per i dispositivi è stata applicata quando i dispositivi sono stati creati nell'hub IoT. Il comando az iot edge devices create ha applicato i file JSON di distribuzione per i dispositivi di livello superiore e inferiore. Al termine di queste distribuzioni, il dispositivo di livello inferiore usa il modulo Proxy API IoT Edge per eseguire il pull delle immagini necessarie.

Oltre ai moduli di runtime agente IoT Edge e hub IoT Edge, il dispositivo di livello superiore riceve il modulo del Registro di sistema Docker e il modulo Proxy dell'API IoT Edge.

Il modulo del Registro Docker punta a un Registro Azure Container esistente. In questo caso, REGISTRY_PROXY_REMOTEURL punta al Registro Contenitori Microsoft. Per impostazione predefinita, il Registro di sistema Docker è in ascolto sulla porta 5000.

Il modulo proxy dell'API IoT Edge instrada le richieste HTTP ad altri moduli, consentendo ai dispositivi di livello inferiore di eseguire il pull delle immagini del contenitore o il push dei BLOB nell'archiviazione. In questa esercitazione comunica sulla porta 443 ed è configurato per inviare la route delle richieste pull delle immagini del contenitore Docker al modulo del Registro di sistema Docker sulla porta 5000. Inoltre, tutte le richieste di caricamento dell'archiviazione BLOB instradano al modulo AzureBlobStorageonIoTEdge sulla porta 11002. Per altre informazioni sul modulo Proxy dell'API IoT Edge e su come configurarlo, vedere la guida pratica del modulo.

Per informazioni su come creare una distribuzione come questa tramite il portale di Azure o Azure Cloud Shell, vedere la sezione relativa ai dispositivi di livello superiore della guida pratica.

È possibile visualizzare lo stato dei moduli usando il 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]"

Questo comando restituisce tutte le proprietà segnalate da edgeAgent. Eccone alcuni utili per il monitoraggio dello stato del dispositivo: stato di runtime, ora di inizio del runtime, ora dell'ultima uscita del runtime, conteggio dei riavvii di runtime.

È anche possibile visualizzare lo stato dei moduli nel portale di Azure. Passare alla sezione Dispositivi dell'hub IoT per visualizzare i dispositivi e i moduli.

Visualizzare i dati generati

Il modulo Simulated Temperature Sensor ei chi è stato eseguito il push genera dati dell'ambiente di esempio. Invia messaggi che includono la temperatura e l'umidità dell'ambiente, la temperatura e la pressione dell'apparecchiatura e un timestamp.

È anche possibile visualizzarli tramite Azure Cloud Shell:

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

Ad esempio:

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\"}"
    }
}

Risoluzione dei problemi

Eseguire il comando iotedge check per verificare la configurazione e risolvere gli errori.

È possibile eseguire iotedge check in una gerarchia annidata, anche se i dispositivi downstream non hanno accesso diretto a Internet.

Quando si esegue iotedge check dal livello inferiore, il programma tenta di eseguire il pull dell'immagine dall'elemento padre attraverso la porta 443.

sudo iotedge check --diagnostics-image-name $upstream:443/azureiotedge-diagnostics:1.2

Il valore azureiotedge-diagnostics viene estratto dal registro contenitori collegato al modulo del registro. In questa esercitazione è impostato per impostazione predefinita su https://mcr.microsoft.com:

Nome Valore
REGISTRY_PROXY_REMOTEURL https://mcr.microsoft.com

Se si usa un registro contenitori privato, assicurarsi che tutte le immagini (IoTEdgeAPIProxy, edgeAgent, edgeHub, Sensore temperatura simulato e diagnostica) siano presenti nel registro contenitori.

Se un dispositivo downstream ha un'architettura del processore diversa dal dispositivo padre, è necessaria l'immagine dell'architettura appropriata. È possibile usare un registro connesso oppure specificare l'immagine corretta per i moduli edgeAgent e edgeHub nel file config.toml del dispositivo downstream. Ad esempio, se il dispositivo padre è in esecuzione in un'architettura ARM32v7 e il dispositivo downstream è in esecuzione in un'architettura AMD64, è necessario specificare il tag di immagine della versione e dell'architettura corrispondente nel file del dispositivo downstream config.toml.

[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",
      }
   }
}

Pulire le risorse

È possibile eliminare le configurazioni locali e le risorse di Azure create in questo articolo per evitare addebiti.

Per eliminare le risorse:

  1. Accedere al portale di Azure e selezionare Gruppi di risorse.

  2. Selezionare il nome del gruppo di risorse contenente le risorse di test di IoT Edge.

  3. Esaminare l'elenco delle risorse contenute nel gruppo di risorse. Per eliminarle tutte, è possibile selezionare Elimina gruppo di risorse. Se se ne vogliono eliminare solo alcune, è possibile selezionare ogni risorsa per eliminarle singolarmente.

Passaggi successivi

In questa esercitazione sono stati configurati due dispositivi IoT Edge come gateway, di cui uno è stato impostato come dispositivo padre dell'altro. È stato quindi illustrato il pull di un'immagine del contenitore nel dispositivo figlio tramite un gateway usando il modulo Proxy DELL'API IoT Edge. Per altre informazioni, vedere la guida pratica sull'uso del modulo proxy.

Per altre informazioni sull'uso dei gateway per creare livelli gerarchici di dispositivi IoT Edge, vedere l'articolo seguente.