在Windows Server上使用Windows容器时,Azure IoTEdge模块无法连接到IoTHub

时间:2019-02-14 08:44:09

标签: windows azure containers azure-iot-edge moby

我们将Azure IotEdge与部署在Ubuntu服务器上的 Linux容器一起使用。我们成功运行了一些模块,这些模块收集,处理数据并将数据发送到IoT中心。

现在,我们想要的是在Windows服务器上使用 windows容器部署另一个IoTEdge运行时,因为我们迫于需求。为了引导新环境,我们只是决定获取现有的工作模块之一,并在新的运行时将其部署为Windows容器。 IoTEdge运行时似乎运行良好,它向IoTHub报告运行时状态,并响应部署更改。

  • 用于构建映像的开发计算机位于Windows 10 1809内部版本17763.194
  • 运行IoTEdge的服务器计算机在同一Windows 10 1809内部版本17763.194
  • IoTEdge运行时正在使用MOBY容器引擎
  • moby_runtime网络设置为'nat'(默认)
  • 已安装NuGet软件包Microsoft.Azure.Devices.Client 1.18.1的IoTEdge模块
  • 用于Windows容器的IoTEdge模块的最终图像是根据microsoft/dotnet:2.1-runtime-nanoserver-1809
  • 构建的

我们遇到的事情很奇怪。模块客户端正在成功初始化:

AmqpTransportSettings amqpSetting = new AmqpTransportSettings(TransportType.Amqp_Tcp_Only);
ITransportSettings[] settings = { amqpSetting };

IoTHubModuleClient = await ModuleClient.CreateFromEnvironmentAsync(settings).ConfigureAwait(false);
await IoTHubModuleClient.OpenAsync().ConfigureAwait(false);

尽管如此,该模块仍无法从IoTHub获取其Twin,这导致 4分钟(!?)之后超时:

await IoTHubModuleClient.GetTwinAsync().ConfigureAwait(false);

以下是相关日志:

2019-Feb-13T13:54:53.57620Z |       INFO | Initializing module twin
2019-Feb-13T13:58:53.61382Z |      ERROR | FetchModuleTwin failed for IoT Edge module: 
System.TimeoutException: Operation timeout expired.
   at Microsoft.Azure.Devices.Client.InternalClient.<>c.<ApplyTimeoutTwin>b__64_2(Task`1 t)
   at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location where exception was thrown ---
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot)
--- End of stack trace from previous location where exception was thrown ---
   at IoTEdge.ModuleBase.FetchModuleTwin() in C:\src\IoTEdge-ModuleBase\modulebase.cs:line 30

如果我们将moby_runtime网络更改为'azure-iot-edge',则结果是相同的,但是edgeHub模块也无法连接。

如果我们将安装了NuGet软件包Microsoft.Azure.Devices.Client的IoTEdge模块从1.18.1更新到1.19.0(当前最新稳定),结果不会更好,但是错误是NullReferenceException超时。

调试同一模块时,一切正常。 在Ubuntu服务器上的Linux容器中进行部署时,一切仍然可以正常工作。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

请在github.com/azure/iotedge/issues中打开一个问题。那里的问题模板提供了有关如何包括有助于调试的日志的说明。在问题中,还请指明是否可以使用QuickStart文档中提到的简单温度传感器模块来重现该行为。