如何避免对属于 K8s 服务的 pod 的并行请求?
How to avoid parallel requests to a pod belonging to a K8s service?
我有一个(内部)K8s 部署(Python、TensorFlow、Guinicorn),有大约 60 个副本和一个附加的 K8s 服务来分发传入的 HTTP 请求。这 60 个 pods 中的每一个实际上一次只能处理一个 HTTP 请求(因为 TensorFlow 的原因)。处理请求需要 1 到 4 秒。如果第二个请求在 pod 仍在处理时被发送到它,则第二个请求只是在 Gunicorn 积压中排队。
现在我想尽可能地减少排队发生的可能性,即将新请求路由到一个未占用的 pods,只要这样一个未占用的请求存在。
循环法不会解决问题,因为并非每个请求都需要相同的时间来回答(见上文)。
Python 应用程序本身可能会使用于 ReadinessProbe 的端点在处理正常请求时失败,但据我所知,就绪探针并不意味着动态的东西(K8s 需要每秒多次轮询它们)。
那我怎样才能达到目标呢?
你不能在两者之间实现 pub/sub 或消息代理吗?
根据工作人员从队列中获取消息或数据的能力将数据保存到队列中,请求将得到处理。
您可以使用 Redis 创建队列,在队列中,您可以使用 pub/sub 也可以使用该库。我之前在 Node JS 中使用过一个但是也可以使用 python 来实现相同的功能。
在 60 个副本中理想的工作人员或者我们可以说抄写员将是 运行。
一旦您收到请求,一个应用程序就会发布它,抄写员将继续工作以处理这些消息。
我们还实现了更进一步,根据队列中的消息数自动缩放工作线程数。
我在 Node js 中使用的这个库:https://github.com/OptimalBits/bull
...kubectl get service shows "TYPE ClusterIP" and "EXTERNAL-IP <none>
您的 k8s 服务将使用“ewma”模式路由请求at random in this case... obviously not good to your app. If you would like to stick with kube-proxy, you can switch to ipvs mode with sed. Here's a good article about it. Otherwise, you can consider using some sort of ingress controller like the one mentioned earlier on; ingress-nginx。
我有一个(内部)K8s 部署(Python、TensorFlow、Guinicorn),有大约 60 个副本和一个附加的 K8s 服务来分发传入的 HTTP 请求。这 60 个 pods 中的每一个实际上一次只能处理一个 HTTP 请求(因为 TensorFlow 的原因)。处理请求需要 1 到 4 秒。如果第二个请求在 pod 仍在处理时被发送到它,则第二个请求只是在 Gunicorn 积压中排队。
现在我想尽可能地减少排队发生的可能性,即将新请求路由到一个未占用的 pods,只要这样一个未占用的请求存在。
循环法不会解决问题,因为并非每个请求都需要相同的时间来回答(见上文)。
Python 应用程序本身可能会使用于 ReadinessProbe 的端点在处理正常请求时失败,但据我所知,就绪探针并不意味着动态的东西(K8s 需要每秒多次轮询它们)。
那我怎样才能达到目标呢?
你不能在两者之间实现 pub/sub 或消息代理吗?
根据工作人员从队列中获取消息或数据的能力将数据保存到队列中,请求将得到处理。
您可以使用 Redis 创建队列,在队列中,您可以使用 pub/sub 也可以使用该库。我之前在 Node JS 中使用过一个但是也可以使用 python 来实现相同的功能。
在 60 个副本中理想的工作人员或者我们可以说抄写员将是 运行。
一旦您收到请求,一个应用程序就会发布它,抄写员将继续工作以处理这些消息。
我们还实现了更进一步,根据队列中的消息数自动缩放工作线程数。
我在 Node js 中使用的这个库:https://github.com/OptimalBits/bull
...kubectl get service shows "TYPE ClusterIP" and "EXTERNAL-IP <none>
您的 k8s 服务将使用“ewma”模式路由请求at random in this case... obviously not good to your app. If you would like to stick with kube-proxy, you can switch to ipvs mode with sed. Here's a good article about it. Otherwise, you can consider using some sort of ingress controller like the one mentioned earlier on; ingress-nginx。