如何让 Azure IoT 边缘模块执行 http 请求?
How to allow Azure IoT edge modules to execute http requests?
运行ning curl -m 20 https://www.google.com
有效,但是当 运行 来自边缘模块容器时超时:
docker exec myModule sh -c 'curl -m 20 https://www.google.com'
curl: (28) Operation timed out after 20000 milliseconds with 0 out of 0 bytes received
我们在多个 VM 上拥有相同的边缘环境 运行,它按预期工作。它return一个结果。我假设防火墙规则或其他设置阻止了请求?所以我比较了两个 VM 之间 sudo iptables -L -v
的结果,这些是相似的。
对于导致此行为的原因有什么建议吗?或者我错过了什么?
我们发现了问题。请求超时的设备有两个网络:以太网和 GSM 调制解调器。 Docker 被桥接到没有互联网连接的以太网网络。它必须是 GSM 调制解调器。我们通过 运行 和 azure-iot-edge network as "host" network 解决了这个问题。所以它使用与主机相同的配置。
"createOptions": {
"NetworkingConfig": {
"EndpointsConfig": {
"host": {}
}
},
"HostConfig": {
"NetworkMode": "host"
}
}
运行 作为主机网络解决了大多数机器上的问题。在其他一些机器上,我们遇到了另一个异常,即:
System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (00000005, 0xFFFDFFFF): Name or service not known
这与 /etc/hosts
和 /etc/hostname
之间的不匹配有关,请参阅此 issue 来修复它。
运行ning curl -m 20 https://www.google.com
有效,但是当 运行 来自边缘模块容器时超时:
docker exec myModule sh -c 'curl -m 20 https://www.google.com'
curl: (28) Operation timed out after 20000 milliseconds with 0 out of 0 bytes received
我们在多个 VM 上拥有相同的边缘环境 运行,它按预期工作。它return一个结果。我假设防火墙规则或其他设置阻止了请求?所以我比较了两个 VM 之间 sudo iptables -L -v
的结果,这些是相似的。
对于导致此行为的原因有什么建议吗?或者我错过了什么?
我们发现了问题。请求超时的设备有两个网络:以太网和 GSM 调制解调器。 Docker 被桥接到没有互联网连接的以太网网络。它必须是 GSM 调制解调器。我们通过 运行 和 azure-iot-edge network as "host" network 解决了这个问题。所以它使用与主机相同的配置。
"createOptions": {
"NetworkingConfig": {
"EndpointsConfig": {
"host": {}
}
},
"HostConfig": {
"NetworkMode": "host"
}
}
运行 作为主机网络解决了大多数机器上的问题。在其他一些机器上,我们遇到了另一个异常,即:
System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (00000005, 0xFFFDFFFF): Name or service not known
这与 /etc/hosts
和 /etc/hostname
之间的不匹配有关,请参阅此 issue 来修复它。