我们遇到了一个奇怪的网络问题。
我们有一个用 Node.js 编写的 Hyperledger Fabric 客户端应用程序,在 Kubernetes 中运行,它与外部 Hyperledger Fabric 网络进行通信。
我们在此通信中随机遇到超时错误。当 pod 重新启动时,一段时间内一切正常,然后开始出现超时错误,有时会自行随机修复,然后再次变坏。
这是 Azure AKS,我们使用 Rancher 在 AWS 中设置了一个快速 Kubernetes 集群,并在那里部署了应用程序,那里也发生了相同的超时错误。
我们整夜在同一个容器中运行脚本,每分钟都会使用 cURL 和一个小型 Node.js 脚本访问外部 Hyperledger 端点,但我们甚至没有收到任何错误。
我们在另一个虚拟机中将应用程序作为普通 Docker 容器运行,并且没有出现任何问题。
我们检查了容器内的网络流量,当出现此问题时,我们可以使用 netstat 看到已建立连接,但 tcpdump 显示没有流量,甚至没有尝试发送任何包。
检查 Hyperledger Fabric SDK 代码,它在幕后使用 gRPC 协议缓冲区。
那么也许有什么线索吗?
这不是 Kubernetes 的问题,而是连接断开的问题。
gRPC 保持连接打开,在一段时间不活动后,中间组件会断开连接。在 Azure AKS 情况下,这是负载均衡器,因为每个出站连接都会经过负载均衡器。有一个不可配置的 4 分钟空闲超时时间,在此之后负载均衡器会断开连接。
解决方案是配置 gRPC 以发送保持活动消息。
容器中的脚本运行没有问题,因为它们每次运行时都会打开一个新连接。
作为普通 Docker 容器运行的应用程序没有这个问题,因为我们每分钟都会访问端点,因此永远不会达到空闲超时阈值。当我们每 10 分钟到达一次端点时,超时问题也从那里开始。