【问题标题】:How to avoid parallel requests to a pod belonging to a K8s service?如何避免对属于 K8s 服务的 pod 的并行请求?
【发布时间】:2021-09-24 04:20:23
【问题描述】:

我有一个(内部)K8s 部署(Python、TensorFlow、Guinicorn),有大约 60 个副本和一个附加的 K8s 服务来分发传入的 HTTP 请求。这 60 个 pod 中的每一个实际上一次只能处理一个 HTTP 请求(由于 TensorFlow 的原因)。处理一个请求需要 1 到 4 秒。如果在 Pod 仍在处理一个请求时将第二个请求发送到该 pod,则第二个请求只会在 Gunicorn 积压中排队。

现在我想尽可能减少排队发生的可能性,即,只要存在这样一个未占用的 pod,就将新请求路由到其中一个未占用的 pod。

循环法不能解决问题,因为不是每个请求都需要相同的时间来回答(见上文)。

Python 应用程序本身可能会使用于 ReadinessProbe 的端点在处理正常请求时失败,但据我了解,就绪探针并不适用于动态(K8s 需要每秒轮询多次) )。

那么我怎样才能实现目标呢?

【问题讨论】:

    标签: kubernetes kubernetes-pod


    【解决方案1】:

    您不能在两者之间实现发布/订阅或消息代理吗?

    根据您的工作人员从队列中获取消息或数据的能力将数据保存到队列中,然后请求将得到处理。

    您可以使用 Redis 创建队列,并且在队列中,您可以使用 pub/sub 也可以使用该库。我之前在 Node JS 中使用过一个,但是也可以使用 python 来实现。

    在 60 个副本中,理想情况下是 worker,或者我们可以说 scriber 将运行。

    一旦您收到请求,就会有一个应用程序将其发布,而抄写员将继续努力处理这些消息。

    我们还进一步实现了一步,根据队列中的消息数自动扩展工作人员数量。

    我在 Node js 中使用的这个库:https://github.com/OptimalBits/bull

    【讨论】:

    • 谢谢。是的,我也考虑过切换到队列和工作人员的方法。但从概念上讲,这个 Python 服务与其他一些服务做了类似的事情(它们都是并行查询,以派生实体的某些特征)。所以我想避免为这个特定的实例引入单独的数据流方式,只是因为它比其他实例慢一点。
    【解决方案2】:

    ...kubectl get service shows "TYPE ClusterIP" and "EXTERNAL-IP <none>

    在这种情况下,您的 k8s 服务将路由请求 at random... 显然对您的应用不利。如果您想继续使用 kube-proxy,可以切换到 ipvs mode with sed。这是一个很好的article。否则,您可以考虑使用前面提到的某种入口控制器; ingress-nginx 带有“ewma”模式。

    【讨论】:

    • 啊,对不起。我可能选择了错误的标签。我刚刚删除了它。 kubectl get service 显示“TYPE ClusterIP”和“EXTERNAL-IP ”。
    • 没问题,更新了答案。
    猜你喜欢
    • 2014-12-22
    • 1970-01-01
    • 2020-06-24
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多