Kubernetes 长请求在120秒后返回空响应,这是由网络负载均衡器引起的

Kubernetes 长请求在120秒后返回空响应,这是由网络负载均衡器引起的,kubernetes,google-kubernetes-engine,google-cloud-network-load-balancer,Kubernetes,Google Kubernetes Engine,Google Cloud Network Load Balancer,我有一个带有2个节点的GKE集群,带有LoadBalancer类型的服务。 当我在内部调用服务时,一个长请求在120秒后不会超时。 但是,如果我调用转发到内部服务的网络负载平衡器的外部IP,我会得到一个“来自服务器的空回复”响应 外部呼叫示例: curl -v "http://<public-ip>/longResponse" * Trying <public-ip>... * TCP_NODELAY set * Connected to <public-ip&

我有一个带有2个节点的GKE集群,带有LoadBalancer类型的服务。 当我在内部调用服务时,一个长请求在120秒后不会超时。 但是,如果我调用转发到内部服务的网络负载平衡器的外部IP,我会得到一个“来自服务器的空回复”响应

外部呼叫示例:

curl -v "http://<public-ip>/longResponse"
*   Trying <public-ip>...
* TCP_NODELAY set
* Connected to <public-ip> (<public-ip>) port 80 (#0)
> GET /longResponse HTTP/1.1
> Host: <public-ip>
> User-Agent: curl/7.54.0
> Accept: */*
>
* Empty reply from server
* Connection #0 to host <public-ip> left intact
curl: (52) Empty reply from server
/ # wget -O - -S <service-name>/longResponse
Connecting to location-service (10.3.255.181:80)
  HTTP/1.1 200 OK
  Access-Control-Allow-Origin: *
  Content-Type: application/json
  Content-Length: 15
  Date: Thu, 28 Feb 2019 10:31:14 GMT
  Connection: close

-                    100% |*********************************************************************************************************************************************************************************************************************|    15  0:00:00 ETA
/ # 
curl-v”http:///longResponse"
*努力。。。
*TCP_节点集
*已连接到()端口80(#0)
>GET/longResponse HTTP/1.1
>主持人:
>用户代理:curl/7.54.0
>接受:*/*
>
*来自服务器的空回复
*0到主机的连接保持不变
curl:(52)来自服务器的空回复
内部呼叫示例:

curl -v "http://<public-ip>/longResponse"
*   Trying <public-ip>...
* TCP_NODELAY set
* Connected to <public-ip> (<public-ip>) port 80 (#0)
> GET /longResponse HTTP/1.1
> Host: <public-ip>
> User-Agent: curl/7.54.0
> Accept: */*
>
* Empty reply from server
* Connection #0 to host <public-ip> left intact
curl: (52) Empty reply from server
/ # wget -O - -S <service-name>/longResponse
Connecting to location-service (10.3.255.181:80)
  HTTP/1.1 200 OK
  Access-Control-Allow-Origin: *
  Content-Type: application/json
  Content-Length: 15
  Date: Thu, 28 Feb 2019 10:31:14 GMT
  Connection: close

-                    100% |*********************************************************************************************************************************************************************************************************************|    15  0:00:00 ETA
/ # 
/#wget-O--S/longResponse
连接到位置服务(10.3.255.181:80)
HTTP/1.1200ok
访问控制允许来源:*
内容类型:application/json
内容长度:15
日期:2019年2月28日星期四10:31:14 GMT
连接:关闭
-10.100%男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生*********************************15:00:00预计到达时间
/ # 
我曾尝试在负载平衡器级别查找有关请求或套接字超时的文档,但没有遇到任何问题。有什么想法吗


谢谢。

您确定这不是客户端超时吗?网络LB除了路由数据包之外不处理数据包,所以它永远不会发送任何响应

是否尝试使用
-m
标记卷曲


还可以在客户端捕获tcpdump,以便查看网络的实际运行情况。

使用以下方法获取负载平衡器的后端名称:

gcloud compute backend-services list
然后

否则,在控制台中:
网络服务⇒ 负载平衡⇒ 后端
然后您可以单击HTTP后端并编辑设置,包括超时


更广泛地说,这可能是服务器和客户端之间的几个跃点之一,每个跃点都可能超时。你最好是在超时的情况下生活(并在超时之前完成长时间的民意调查),或者直接输入数据。。。例如,您可以将空格预加到json,因此,例如,每30秒发送一个
空格
字符,直到您有一个正确的响应正文。这将防止负载平衡超时。

显示您的kubernetes服务,也许您的服务没有endpoints@c4f4t0r显然没有提到这个服务现在已经成功运行了很长时间,只有当我有一个超过120秒的长请求时,它才会返回一个空响应,所有其他请求都可以正常工作。请尝试使用keepalive@c4f4t0rcurl默认使用60秒的keepalive,但无论如何,为了尝试相同的结果,它将保留时间减少到了15秒。同样的问题出现在这里
gcloud compute backend services list
返回0个结果。这与
gcloud compute project info description--project project\u NAME
结果相匹配,结果显示用法:0。但是,我在同一个项目中启动并运行了k8s服务。我通过GKE控制台创建了所有内容。这就是原因吗?谢谢!尝试使用-m选项,但在120秒后仍然返回空响应。我试过tcpdump,主机在120秒后发出[FIN,ACK]。因此,正如我们所怀疑的那样,链中的某些东西在120秒后计时,但这不是应用服务器的K8S服务,因为我已经检查过了……您确定当您直接访问服务IP时不会发生这种情况吗?有一些conntrack控制旋钮可能对应,但它们应该同样适用于服务IP和负载平衡器。查看节点上的
/proc/sys/net/netfilter/nf\u conntrack\u tcp\u timeout.*
,可以尝试将其中一些更改为唯一值并测量影响。一旦我们知道这些因素是否起作用,以及哪些因素起作用,我们就可以讨论一个系统性的解决方案。是的,我肯定!查看/proc很有趣:?我在TCPDUMP中看到FIN消息,因此
FIN\u wait
是可疑的。如何在GKE中进行更改?您可以手动登录到每个节点并将其设置为测试,也可以运行特权守护程序(如果希望保留结果)。为了确定,我会尝试将这120个数字设置为不同的数字。但我无法解释为什么这会影响LB而不是服务VIP,因此我仍然持怀疑态度。