Guide pratique pour configurer les options de création de conteneur pour les modules IoT Edge

S’applique à :IoT Edge 1.4 checkmark IoT Edge 1.4

Important

IoT Edge 1.4 est la version prise en charge. Si vous utilisez une version antérieure, consultez l’article Mettre à jour IoT Edge.

Le paramètre createOptions du manifeste de déploiement vous permet de configurer les conteneurs de module au moment de l’exécution. Ce paramètre étend votre contrôle sur les modules et permet d’effectuer des tâches telles que l’autorisation ou la restriction de l’accès du module aux ressources de l’appareil hôte, ou la configuration du réseau.

Les modules IoT Edge sont implémentés en tant que conteneurs compatibles avec Docker sur votre appareil IoT Edge. Docker offre de nombreuses options pour créer des conteneurs, et ces options s’appliquent également aux modules IoT Edge. Pour plus d’informations, consultez les options de création de conteneur Docker.

Format des options de création

Le manifeste de déploiement IoT Edge accepte les options de création au format JSON. Par exemple, prenez les options de création qui sont automatiquement incluses pour chaque module edgeHub :

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

Cet exemple edgeHub utilise le paramètre HostConfig.PortBindings pour mapper les ports exposés sur le conteneur à un port sur l’appareil hôte.

Si vous utilisez l’extension Azure IoT Edge pour Visual Studio ou Visual Studio Code, vous pouvez écrire les options de création au format JSON dans le fichier deployment.template.json. Ensuite, quand vous utiliserez l’extension pour générer la solution IoT Edge ou le manifeste de déploiement, elle stringifiera le JSON pour vous dans le format attendu par le runtime IoT Edge. Par exemple :

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

Important

L’extension Azure IoT Edge Visual Studio Code est en mode maintenance. L’outil iotedgedev est l’outil conseillé pour développer des modules IoT Edge.

L’une des astuces pour écrire des options de création consiste à utiliser la commande docker inspect. Dans le cadre de votre processus de développement, exécutez le module localement à l’aide de docker run <container name>. Une fois que le module fonctionne comme vous le souhaitez, exécutez docker inspect <container name>. Cette commande génère les détails du module au format JSON. Recherchez les paramètres que vous avez configurés et copiez le JSON. Par exemple :

Screenshot of the results of the command docker inspect edgeHub.

Scénarios courants

Les options de création de conteneur autorisent de nombreux scénarios ; en voici quelques-uns parmi les plus courants lors de la création de solutions IoT Edge :

Mapper un port hôte à un port de module

Si votre module doit communiquer avec un service en dehors de la solution IoT Edge et qu’il n’utilise pas pour cela le routage des messages, vous devez mapper un port hôte à un port de module.

Conseil

Ce mappage de ports n’est pas nécessaire pour la communication entre modules sur le même appareil. Si le module A doit interroger une API hébergée sur le module B, il peut le faire sans aucun mappage de ports. Le module B doit exposer un port dans son fichier dockerfile, par exemple : EXPOSE 8080. Ensuite, le module A peut interroger l’API à l’aide du nom du module B, par exemple : http://ModuleB:8080/api.

Tout d’abord, assurez-vous qu’un port à l’intérieur du module est exposé pour écouter les connexions. Vous pouvez pour cela utiliser une instruction EXPOSE dans le fichier dockerfile. Par exemple : EXPOSE 8080. L’instruction EXPOSE utilise par défaut le protocole TCP s’il n’est pas spécifié, ou vous pouvez spécifier UDP.

Ensuite, utilisez le paramètre PortBindings dans le groupe HostConfig des options de création de conteneur Docker pour mapper le port exposé dans le module à un port sur l’appareil hôte. Par exemple, si vous avez exposé le port 8080 dans le module et que vous souhaitez le mapper au port 80 de l’appareil hôte, les options de création dans le fichier template.json se présenteront comme dans l’exemple suivant :

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

Une fois stringifiée pour le manifeste de déploiement, la même configuration ressemblerait à l’exemple suivant :

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

Restreindre l’utilisation de la mémoire et du processeur du module

Vous pouvez déclarer la quantité de ressources hôte qu’un module peut utiliser. Ce contrôle est utile pour s’assurer qu’un module ne peut pas consommer trop de mémoire ou de ressources de processeur, et pour empêcher d’autres processus de s’exécuter sur l’appareil. Vous pouvez gérer ces paramètres avec les options de création de conteneur Docker dans le groupe HostConfig, notamment :

  • Mémoire : limite de mémoire en octets. Par exemple, 268435456 octets = 256 Mo.
  • MemorySwap : limite totale de mémoire (mémoire + échange). Par exemple, 536870912 octets = 512 Mo.
  • NanoCpus : quota de processeurs en unités de 10 -9 (1 milliardième) processeurs. Par exemple, 250000000 nanocpus = 0,25 PROCESSEUR.

Dans le fichier template.json, ces valeurs ressembleraient à l’exemple suivant :

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

Une fois stringifiées pour le manifeste de déploiement final, ces valeurs se présenteraient comme dans l’exemple suivant :

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

Optimiser en GPU un module IoT Edge

Si vous exécutez votre module IoT Edge sur une machine virtuelle optimisée en GPU, vous pouvez également activer un module IoT Edge pour vous connecter à votre GPU. Pour ce faire avec un module existant, ajoutez certaines spécifications à votre createOptions :

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

Pour vérifier que ces paramètres ont été correctement ajoutés, utilisez la commande Docker inspect pour afficher le nouveau paramètre dans une impression JSON.

sudo docker inspect <YOUR-MODULE-NAME>

Pour en savoir plus sur la façon dont votre appareil et votre machine virtuelle se connectent à un GPU, consultez Configurer, connecter et vérifier un module IoT Edge pour un GPU.

Étapes suivantes

Pour obtenir plus d’exemples d’options de création en action, consultez les exemples IoT Edge suivants :