Kubernetes 和 Gunicorn 上的 Flask 应用程序扩展

标签 flask kubernetes gunicorn scaling eventlet

我们有一个 Flask 应用程序,通过 Gunicorn 使用 eventlet 工作线程提供服务。我们正在将应用程序部署在 kubernetes pod 中,其想法是根据工作负载扩展 pod 数量。

gunicorn 中工作线程数量的建议设置为 2 - 4 x $NUM_CPUS。请参阅docs 。我之前曾在专用物理硬件上部署过服务,这样的计算才有意义。在 4 核机器上,拥有 16 个工作线程听起来不错,我们最终将其增加到 32 个工作线程。

此计算是否仍然适用于使用异步工作线程的 kubernetes pod,特别是:

  1. 单个节点上可以有多个 Pod。
  2. 同一个服务将在多个 Pod 中运行。

我应该如何设置gunicorn worker 的数量?

  1. 将其设置为 -w 1 并让 kubernetes 通过 pod 处理扩展?
  2. 在 kubernetes 节点上将其设置为 2-4 x $NUM_CPU。在一个或多个 Pod 上?
  3. 完全是别的东西?

更新

我们决定采用第一个选项,这是我们当前的方法。将gunicorn作品的数量设置为1,并通过增加pod数量来横向扩展。否则将会有太多的移动部件,而且我们将无法充分利用 Kubernetes 的潜力。

最佳答案

为了更好地了解该问题的原作者截至 2019 年选择的最终解决方案

Set the number of gunicorn works to 1 (-w 1), and scale horizontally by increasing the number of pods (using Kubernetes HPA).

考虑到 Kubernetes 平台中工作负载相关功能的快速增长,例如,它可能在不久的将来不适用。 Kubernetes 的一些发行版除了 HPA 之外还提出了垂直 Pod 自动扩展(VPA)和多维 Pod 自动扩展(MPA),所以我建议以社区 wiki 帖子的形式继续这个话题。

关于Kubernetes 和 Gunicorn 上的 Flask 应用程序扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56748782/

相关文章:

ubuntu - 如何从另一台机器访问在我的 minikube 集群中运行的应用程序?

django nginx Gunicorn,, 启动 : Job failed to start

django - 在 docker build 中运行 "/usr/local/bin/gunicorn"说 "stat/usr/local/bin/gunicorn: no such file or directory"

python - 有没有办法在 gunicorn 中记录 python 打印语句?

sockets - Nginx和uWSGI : Proper permissions setup for 502 Bad Gateway issue

python - 同一应用程序中的几个(两个)Flask 对象

kubernetes - kubectl 从 yaml 中只部署一个组件

python - flask-oauth 永远不会在 oauth 身份验证后重定向

python - 如何在 Flask 应用程序中用 '\n' 替换字符串中的 '<br>'?

docker - Kubernetes 和 docker-compose 之间的 DNS 一致