Come configurare le opzioni di creazione di un contenitore per moduli IoT Edge

Si applica a:IoT Edge 1.4 checkmark IoT Edge 1.4

Importante

IoT Edge 1.4 è la versione supportata. Se si usa una versione precedente, vedere Aggiornare IoT Edge.

Il parametro createOptions nel manifesto della distribuzione consente di configurare i contenitori di moduli in fase di esecuzione. Questo parametro espande il controllo sui moduli e consente attività come consentire o limitare l'accesso del modulo alle risorse del dispositivo host o alla configurazione della rete.

I moduli IoT Edge vengono implementati come contenitori compatibili con Docker nel dispositivo IoT Edge. Docker offre molte opzioni per la creazione di contenitori e queste opzioni si applicano anche ai moduli IoT Edge. Per altre informazioni, vedere Opzioni di creazione del contenitore Docker.

Formattare le opzioni di creazione

Il manifesto della distribuzione IoT Edge accetta opzioni di creazione formattate come JSON. Ad esempio, prendere le opzioni di creazione incluse automaticamente per ogni modulo edgeHub:

"createOptions": {
  "HostConfig": {
    "PortBindings": {
      "5671/tcp": [
        {
          "HostPort": "5671"
        }
      ],
      "8883/tcp": [
        {
          "HostPort": "8883"
        }
      ],
      "443/tcp": [
        {
          "HostPort": "443"
        }
      ]
    }
  }
}

Questo esempio di edgeHub usa il parametro HostConfig.PortBindings per eseguire il mapping delle porte esposte nel contenitore a una porta nel dispositivo host.

Se si usa l'estensione Azure IoT Edge per Visual Studio o Visual Studio Code, è possibile scrivere le opzioni di creazione in formato JSON nel file deployment.template.json . Quindi, quando si usa l'estensione per compilare la soluzione IoT Edge o generare il manifesto della distribuzione, il file JSON verrà stringato nel formato previsto dal runtime di IoT Edge. Ad esempio:

"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"

Importante

L'estensione Azure IoT Edge di Visual Studio Code è in modalità di manutenzione. Lo strumento iotedgedev è lo strumento consigliato per lo sviluppo di moduli IoT Edge.

Un suggerimento per la scrittura delle opzioni di creazione consiste nell'usare il docker inspect comando . Come parte del processo di sviluppo, eseguire il modulo in locale usando docker run <container name>. Dopo aver creato il modulo nel modo desiderato, eseguire docker inspect <container name>. Questo comando restituisce i dettagli del modulo in formato JSON. Trovare i parametri configurati e copiare il codice JSON. Ad esempio:

Screenshot of the results of the command docker inspect edgeHub.

Scenari comuni

Le opzioni di creazione di contenitori consentono molti scenari, ma ecco alcuni scenari che si presentano più spesso durante la compilazione di soluzioni IoT Edge:

Eseguire il mapping della porta host alla porta del modulo

Se il modulo deve comunicare con un servizio all'esterno della soluzione IoT Edge e non usa il routing dei messaggi per farlo, è necessario eseguire il mapping di una porta host a una porta del modulo.

Suggerimento

Questo mapping delle porte non è necessario per la comunicazione da modulo a modulo nello stesso dispositivo. Se il modulo A deve eseguire query su un'API ospitata nel modulo B, questa operazione può essere eseguita senza mapping delle porte. Il modulo B deve esporre una porta nel relativo dockerfile, ad esempio : EXPOSE 8080. Il modulo A può quindi eseguire una query sull'API usando il nome del modulo B, ad esempio: http://ModuleB:8080/api.

Prima di tutto, assicurarsi che una porta all'interno del modulo sia esposta per l'ascolto delle connessioni. A tale scopo, è possibile usare un'istruzione EXPO edizione Standard nel dockerfile. Ad esempio, EXPOSE 8080. L'istruzione espone per impostazione predefinita il protocollo TCP se non specificato oppure è possibile specificare UDP.

Usare quindi l'impostazione PortBindings nel gruppo HostConfig del contenitore Docker per creare opzioni per eseguire il mapping della porta esposta nel modulo a una porta nel dispositivo host. Ad esempio, se è stata esposta la porta 8080 all'interno del modulo e si vuole eseguire il mapping alla porta 80 del dispositivo host, le opzioni di creazione nel file template.json sono simili all'esempio seguente:

"createOptions": {
  "HostConfig": {
    "PortBindings": {
      "8080/tcp": [
        {
          "HostPort": "80"
        }
      ]
    }
  }
}

Dopo aver eseguito la stringa per il manifesto della distribuzione, la stessa configurazione sarà simile all'esempio seguente:

"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"8080/tcp\":[{\"HostPort\":\"80\"}]}}}"

Limitare l'utilizzo della CPU e della memoria del modulo

È possibile dichiarare la quantità di risorse host che un modulo può usare. Questo controllo è utile per garantire che un modulo non possa usare troppa memoria o CPU e impedire l'esecuzione di altri processi nel dispositivo. È possibile gestire queste impostazioni con le opzioni di creazione del contenitore Docker nel gruppo HostConfig , tra cui:

  • Memoria: limite di memoria in byte. Ad esempio, 268435456 byte = 256 MB.
  • MemorySwap: limite di memoria totale (memoria e scambio). Ad esempio, 536870912 byte = 512 MB.
  • NanoCpus: quota della CPU in unità di 10-9 (1 miliardesimo) CPU. Ad esempio, 2500000000 nanocpus = 0,25 CPU.

Nel formato template.json, questi valori sono simili all'esempio seguente:

"createOptions": {
  "HostConfig": {
    "Memory": 268435456,
    "MemorySwap": 536870912,
    "NanoCpus": 250000000
  }
}

Dopo aver eseguito la stringa per il manifesto della distribuzione finale, questi valori sono simili all'esempio seguente:

"createOptions":"{\"HostConfig\":{\"Memory\":268435456,\"MemorySwap\":536870912,\"CpuPeriod\":25000}}"

Ottimizzare la GPU per un modulo IoT Edge

Se si esegue il modulo IoT Edge in una macchina virtuale ottimizzata per GPU, è possibile abilitare anche un modulo IoT Edge per connettersi alla GPU. Per eseguire questa operazione con un modulo esistente, aggiungere alcune specifiche a createOptions:

{"HostConfig": {"DeviceRequests": [{"Count": -1,"Capabilities": [["gpu"]]}]}}

Per verificare che queste impostazioni siano state aggiunte correttamente, usare il comando Docker inspect per visualizzare la nuova impostazione in una stampa JSON.

sudo docker inspect <YOUR-MODULE-NAME>

Per altre informazioni su come il dispositivo e la macchina virtuale si connettono a una GPU, vedere Configurare, connettere e verificare un modulo IoT Edge per una GPU.

Passaggi successivi

Per altri esempi di opzioni di creazione in azione, vedere gli esempi di IoT Edge seguenti: