Como configurar opções de criação de contentores para módulos do IoT Edge

Aplica-se a:Marca de verificação do IoT Edge 1.5 IoT Edge 1.5 Marca de verificação do IoT Edge 1.4 IoT Edge 1.4

Importante

IoT Edge 1.5 LTS e IoT Edge 1.4 LTS são versões suportadas. O IoT Edge 1.4 LTS termina a vida útil em 12 de novembro de 2024. Se tiver uma versão anterior, consulte Atualizar IoT Edge.

O parâmetro createOptions no manifesto de implantação permite configurar os contêineres de módulo em tempo de execução. Esse parâmetro expande seu controle sobre os módulos e permite tarefas como permitir ou restringir o acesso do módulo aos recursos do dispositivo host ou configurar a rede.

Os módulos do IoT Edge são implementados como contêineres compatíveis com o Docker em seu dispositivo IoT Edge. O Docker oferece muitas opções para criar contêineres, e essas opções também se aplicam aos módulos do IoT Edge. Para obter mais informações, consulte Opções de criação de contêiner do Docker.

Opções de criação de formato

O manifesto de implantação do IoT Edge aceita opções de criação formatadas como JSON. Por exemplo, considere as opções de criação que são incluídas automaticamente para cada módulo edgeHub:

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

Este exemplo de edgeHub usa o parâmetro HostConfig.PortBindings para mapear portas expostas no contêiner para uma porta no dispositivo host.

Se você usar a extensão do Azure IoT Edge para Visual Studio ou Visual Studio Code, poderá escrever as opções de criação no formato JSON no arquivo deployment.template.json . Em seguida, quando você usa a extensão para criar a solução IoT Edge ou gerar o manifesto de implantação, ela stringifica o JSON para você no formato esperado pelo tempo de execução do IoT Edge. Por exemplo:

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

Importante

A extensão Azure IoT Edge Visual Studio Code está no modo de manutenção. A ferramenta iotedgedev é a ferramenta recomendada para o desenvolvimento de módulos IoT Edge.

Uma dica para escrever opções de criação é usar o docker inspect comando. Como parte do seu processo de desenvolvimento, execute o módulo localmente usando docker run <container name>o . Depois de ter o módulo funcionando da maneira que você quer, execute docker inspect <container name>. Este comando produz os detalhes do módulo no formato JSON. Localize os parâmetros que você configurou e copie o JSON. Por exemplo:

Captura de tela dos resultados do comando docker inspect edgeHub.

Cenários comuns

As opções de criação de contêiner permitem muitos cenários, mas aqui estão alguns que aparecem com mais frequência ao criar soluções do IoT Edge:

Mapeie a porta do host para a porta do módulo

Se o módulo precisar se comunicar com um serviço fora da solução IoT Edge e não estiver usando o roteamento de mensagens para fazer isso, você precisará mapear uma porta de host para uma porta de módulo.

Gorjeta

Esse mapeamento de porta não é necessário para comunicação módulo-a-módulo no mesmo dispositivo. Se o módulo A precisar consultar uma API hospedada no módulo B, ele poderá fazê-lo sem qualquer mapeamento de porta. O módulo B precisa expor uma porta em seu dockerfile, por exemplo: EXPOSE 8080. Em seguida, o módulo A pode consultar a API usando o nome do módulo B, por exemplo: http://ModuleB:8080/api.

Primeiro, certifique-se de que uma porta dentro do módulo está exposta para ouvir as conexões. Você pode fazer isso usando uma instrução EXPOSE no dockerfile. Por exemplo, EXPOSE 8080. A instrução de exposição assume como padrão o protocolo TCP se não for especificada ou você pode especificar UDP.

Em seguida, use a configuração PortBindings no grupo HostConfig do contêiner do Docker criar opções para mapear a porta exposta no módulo para uma porta no dispositivo host. Por exemplo, se você expôs a porta 8080 dentro do módulo e deseja mapeá-la para a porta 80 do dispositivo host, as opções de criação no arquivo template.json serão parecidas com o exemplo a seguir:

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

Uma vez stringified para o manifesto de implantação, a mesma configuração seria semelhante ao exemplo a seguir:

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

Restringir a memória do módulo e o uso da CPU

Pode declarar a quantidade de recursos de anfitrião que um módulo pode utilizar. Este controlo é útil para garantir que um módulo não pode consumir demasiada memória ou utilização da CPU e impedir a execução de outros processos no dispositivo. Você pode gerenciar essas configurações com as opções de criação de contêiner do Docker no grupo HostConfig , incluindo:

  • Memória: Limite de memória em bytes. Por exemplo, 268435456 bytes = 256 MB.
  • MemorySwap: Limite total de memória (memória + swap). Por exemplo, 536870912 bytes = 512 MB.
  • NanoCpus: cota de CPU em unidades de 10-9 (1 bilionésimo) CPUs. Por exemplo, 250000000 nanocpus = 0,25 CPU.

No formato template.json, esses valores seriam parecidos com o exemplo a seguir:

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

Depois de stringizados para o manifesto de implantação final, esses valores seriam parecidos com o exemplo a seguir:

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

GPU-otimize um módulo IoT Edge

Se você estiver executando seu módulo IoT Edge em uma máquina virtual otimizada para GPU, poderá habilitar um módulo IoT Edge para se conectar à sua GPU também. Para fazer isso com um módulo existente, adicione algumas especificações ao seu createOptions:

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

Para confirmar se essas configurações foram adicionadas com êxito, use o comando Docker inspect para ver a nova configuração em uma impressão JSON.

sudo docker inspect <YOUR-MODULE-NAME>

Para saber mais sobre como seu dispositivo e máquina virtual se conectam a uma GPU, consulte Configurar, conectar e verificar um módulo IoT Edge para uma GPU.

Próximos passos

Para obter mais exemplos de opções de criação em ação, consulte os seguintes exemplos do IoT Edge: