0

我有一个使用 kubespray 部署的 k8s 集群。使用的负载均衡器是metalLB。我在这个集群中部署了一个 helm chart,它在地址 10.0.8.26:50028 上有一个 REST 服务

我正在向该服务发送请求:

http://10.0.8.26:50028/data/v3/authentication

http://10.0.8.26:50028/data/v3/actions

http://10.0.8.26:50028/data/v3/versions

但是每次我调用端点时,它都会按顺序返回响应:

503 运输正在关闭

500 内部服务器

500 内部服务器

204 - 正确响应

当我调用每个端点时返回相同的顺序。一旦返回正确的响应,之后就没有错误了。但是尝试一个新的 endoint 会返回错误。

有人可以帮帮我吗?

4

1 回答 1

0

此错误与集群中服务之间的连接有关。集群在 IPVS 模式下使用 kube-proxy。由于 IPVS 超时(在他的节点中),服务之间的连接在 900 秒后终止:

$ ipvsadm -l --timeout    
Timeout (tcp tcpfin udp): 900 120 300 

这意味着 tcp 连接被另一个代理终止。我的应用程序同时使用 grpc 协议来进行某些服务之间的通信。因此,将应用程序代码中的 grpc keepalive 和 pod 的 tcp keepalive 设置为较低的值后,问题得到解决。

以下链接可能会提供更多详细信息:

https://success.docker.com/article/ipvs-connection-timeout-issue

https://github.com/moby/moby/issues/31208

https://github.com/kubernetes/kubernetes/issues/80298

于 2019-08-13T09:20:37.103 回答