使用 DPS 时,为什么 IoT Edge 在重新启动时重新创建容器?

When using DPS, why does IoT Edge recreate containers at reboot?

在没有 DPS 的情况下使用 IoT Edge 时,我可以在重启和服务重启后仍然存在的模块中保留状态和记录数据。

将 IoT Edge 与 DPS(例如对称密钥)一起使用时,每次 OS 重新启动或服务重新启动时,IoT Edge 都会删除(丢失日志和状态数据)模块并重新创建它们。这使得模块和业务应用程序的故障排除和管理成为一项挑战。

重现步骤:

  1. 安装 Windows IoT 1809(虽然我不认为这是 OS 具体的)
  2. 使用 SAS 令牌(而非 DPS)安装 IoT Edge (https://docs.microsoft.com/en-us/azure/iot-edge/how-to-install-iot-edge-windows)
  3. 在 Azure 门户中,添加一个简单的模块(我使用:docker.io/ksaye/mqttdemo:0.0.2-windows-amd64,但任何都可以)
  4. 模块部署到边缘时,运行(进入容器):docker -H npipe:////./pipe/iotedge_moby_engine exec -i -t %yourmodulename% cmd
  5. 在模块容器内,运行:echo hello > test.txt
  6. 在模块容器内,运行:键入 test.txt 以查看您的内容
  7. 键入 exit 退出模块容器,然后重新启动系统
  8. 设备启动后,再次运行(进入容器):docker -H npipe:////./pipe/iotedge_moby_engine exec - i -t %yourmodulename% cmd
  9. 再次在模块容器 运行 中:键入 test.txt 以查看您的内容已在重启后保留

(现在可以看到不良行为)

  1. 停止 iotedge 服务 运行: net stop iotedge
  2. 更改 c:\programdata\iotedge\config.yaml 以使用带对称密钥的 DPS
  3. 重新运行步骤4 - 9,但是这次步骤9会失败,因为文件不会存在

是否有可以更改此行为的设置或配置对象?部署 SQL Edge 或 MySQL 时,我无法在每次重新启动设备时都删除容器。

这是设计使然,第 11 步被视为“重新配置”事件,所有模块实例都作为流程的一部分被删除。你可以在边缘守护进程中看到这个日志。

这是一个问题/错误,请参阅:https://github.com/Azure/iotedge/issues/3283