windows - 在 Windows 服务器上使用 Windows 容器时,Azure IoTEdge 模块无法连接到 IoTHub
问题描述
我们将 Azure IotEdge 与部署在 Ubuntu 服务器上的 Linux 容器一起使用。我们成功运行了一些模块,用于收集、处理数据并将其发送到 IoT 中心。
现在,我们想要的是在 windows 服务器上部署另一个带有 windows 容器的IoTEdge 运行时,因为我们被需求所迫。出于引导新环境的目的,我们刚刚决定获取我们现有的工作模块之一,并将其部署为新运行时的 Windows 容器。IoTEdge 运行时似乎运行良好,它向 IoTHub 报告运行时状态,它响应部署更改。
- 构建图像的开发机器位于 Windows 10 1809 build 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 模块也无法连接。
如果我们将 IoTEdge 模块安装的 NuGet 包 Microsoft.Azure.Devices.Client 从 1.18.1 更新到 1.19.0(目前最新稳定),结果并没有更好,但是错误是NullReferenceException
,而不是超时。
调试同一模块时,一切正常。在 Ubuntu 服务器上的 Linux 容器中部署时,一切正常。
任何帮助将不胜感激!
解决方案
请在 github.com/azure/iotedge/issues 打开一个问题。那里的问题模板有关于如何包含有助于调试的日志的说明。在该问题中,还指出您是否可以使用快速入门文档中提到的简单温度传感器模块重现该行为。
推荐阅读
- amazon-s3 - 如何使用骆驼异常处理检查 AWS s3 存储桶中的文件可用性(例如:pdf 文件)
- pandas - 合并 2 个具有优先级的数据帧(如果特定列匹配,则 A 优先于 B)
- c# - 使用 .Date 时,EF 核心查询无法翻译
- machine-learning - 为什么 XOR 问题更适用于双极表示?
- reactjs - react-dom 17.0.0更新错误TypeError:init不是函数
- python - 如何分块加载yaml文件?
- reactjs - React 钩子无法从状态中获取价值
- typescript - 带有 Typescript 和样式化组件的 RN FlatList
- laravel - 带有模型属性绑定的 Livewire 简单下拉和保存按钮
- sql - T-SQL 中递归 CTE 的性能缓慢