Condividi tramite


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

Si applica a:IoT Edge 1.5 segno di spunta IoT Edge 1.5

Importante

IoT Edge 1.5 LTS è la versione supportata. IoT Edge 1.4 LTS è di fine vita a partire dal 12 novembre 2024. Se si usa una versione precedente, vedere Aggiornare IoT Edge.

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

I moduli IoT Edge vengono eseguiti 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, 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 viene 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 per Visual Studio Code è in modalità di manutenzione. Lo strumento iotedgedev è lo strumento consigliato per lo sviluppo di moduli IoT Edge.

Usare il docker inspect comando per scrivere le opzioni di creazione. Eseguire il modulo in locale usando docker run <container name> come parte del processo di sviluppo. 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 dei risultati del comando

Scenari comuni

Le opzioni di creazione del contenitore supportano vari scenari. Ecco i più comuni per la creazione 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

Il 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.

Assicurarsi prima di tutto che una porta all'interno del modulo sia esposta all'ascolto delle connessioni. A tale scopo, è possibile usare un'istruzione EXPOSE 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"
        }
      ]
    }
  }
}

Quando viene trasformata in stringa per il manifesto di distribuzione, la configurazione appare come segue:

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

Limitare l'utilizzo della CPU e della memoria del modulo

Dichiarare la quantità di risorse host che un modulo può usare. Questo controllo garantisce che un modulo non consuma troppa memoria o CPU, impedendo 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"]]}]}}

Verificare queste impostazioni usando il comando 'docker inspect' per visualizzare la nuova impostazione in un output 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 questi esempi di IoT Edge: