【问题标题】:Random timeouts at Node.js + gRPC application on KubernetesKubernetes 上 Node.js + gRPC 应用程序的随机超时
【发布时间】:2018-10-29 14:52:20
【问题描述】:

我们遇到了一个奇怪的网络问题。

我们有一个用 Node.js 编写的 Hyperledger Fabric 客户端应用程序,在 Kubernetes 中运行,它与外部 Hyperledger Fabric 网络通信。

我们在此通信中随机出现超时错误。当 Pod 重新启动时,一切都会好一阵子,然后超时错误开始出现,有时会自行随机修复,然后再次变坏。

这是 Azure EKS,我们使用 Rancher 在 AWS 中设置了一个快速的 Kubernetes 集群并在那里部署了应用程序,同样的超时错误也发生在那里。

我们整夜在同一个容器中运行脚本,每分钟都会使用 cURL 和一个小的 Node.js 脚本访问外部 Hyperledger 端点,我们甚至没有收到任何错误。

我们将应用程序作为普通 Docker 容器在另一个 VM 中运行,没有问题。

我们检查了容器内的网络流量,当这个问题发生时,我们可以看到与 netstat 建立了连接,但 tcpdump 显示没有流量,甚至没有尝试发送包。

检查 Hyperledger Fabric SDK 代码,它在后台使用 gRPC 协议缓冲区。

所以有什么线索吗?

【问题讨论】:

  • 这是在您的 AKS 群集上运行的唯一应用吗?还是您有更多应用?
  • 应用的其他部分也运行在同一个集群的不同 pod 中,比如 UI 等。

标签: node.js kubernetes hyperledger-fabric grpc


【解决方案1】:

这原来不是 Kubernetes,而是连接断开的问题。

gRPC 保持连接打开,并且在一段时间不活动后,中间组件会断开连接。在 Azure AKS 案例中,这是负载均衡器,因为每个出站连接都通过负载均衡器。负载均衡器会在 4 分钟后断开连接,这是不可配置的空闲超时时间。

修复是配置 gRPC 以发送保持活动消息。

容器中的脚本可以正常运行,因为它们每次运行都会打开一个新连接。

作为普通 Docker 容器运行的应用程序没有这个问题,因为我们每分钟都在访问端点,因此从未达到空闲超时阈值。当我们每 10 分钟到达端点时,超时问题也从那里开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 2022-01-02
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 2018-08-17
    • 2016-07-13
    • 2023-01-25
    相关资源
    最近更新 更多