在Kubernetes和Gunicorn上进行Flask应用扩展

时间:2019-06-25 07:21:28

标签: flask kubernetes gunicorn scaling eventlet

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

推荐的枪色工人人数设置为2 - 4 x $NUM_CPUS。参见docs。我之前已经在专用的物理硬件上部署了这些计算有意义的服务。在4核计算机上,有16个工人听起来不错,我们最终将其提高到32个工人。

此计算是否仍适用于使用异步工作程序的kubernetes容器,特别是:

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

我该如何设置枪械工人的数量?

  1. 将其设置为-w 1并让kubernetes通过pod进行缩放吗?
  2. 在kubernetes节点上将其设置为2-4 x $NUM_CPU。在一个或多个吊舱上?
  3. 还有其他事情吗?

更新

我们决定采用第一种选择,这是我们目前的方法。将Gunicorn作品的数量设置为1,并通过增加豆荚的数量来水平缩放。否则将会有太多的活动部件,而且我们将不会充分利用Kubernetes的潜力。

2 个答案:

答案 0 :(得分:0)

为了更好地了解这个问题的原始作者在 2019 年选择的最终解决方案

<块引用>

设置gunicorn作品数量为1(-w 1),水平缩放 通过增加 Pod 的数量(使用 Kubernetes HPA)。

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

答案 1 :(得分:-1)

我不是开发人员,这似乎不是一件容易的事,但出于您的考虑,请遵循bests practices for Better performance by optimizing Gunicorn config

由于CPU utilization和(How is Python scaling with Gunicorn and Kubernetes?),除了kubernetes之外,还有多种不同的机制可以扩展您的部署,例如HPA

您也可以使用Resource requests and limits of Pod and Container.

按照Gunicorn documentation

  

请勿根据您希望拥有的客户数量来调整工作人员的数量。 Gunicorn应该只需要4-12个工作进程即可每秒处理数百或数千个请求。   Gunicorn在处理请求时依靠操作系统来提供所有负载平衡。 通常,我们建议(2 x $ num_cores)+ 1 作为开始工作的工人数量。虽然不是太科学,但该公式是基于这样的假设:对于给定的内核,一个工作人员将在套接字中读取或写入,而另一个工作人员正在处理请求。

# 更新

根据您的方法,您可以选择不同的解决方案(部署,守护程序),通过根据Assigning CPU Resources to Containers and Pods

在kubernetes中实现上述所有语句。
  1. 使用带有资源(限制,请求)的部署,您可以根据硬件限制将应用大小调整为单个节点上的多个容器,但是取决于您的“应用负载”,这可能不是一个很好的解决方案。
  

CPU请求和限制与容器相关联,但是将Pod视为具有CPU请求和限制很有用。对Pod的CPU请求是对Pod中所有容器的CPU请求的总和。同样,Pod的CPU限制是Pod中所有容器的CPU限制的总和。

注意:

  

CPU资源以CPU单位度量。 Kubernetes中的一个CPU等效于:   f.e. 1个GCP核心。

  1. 如后文所述,第二种方法(将您的应用扩展到多个节点)也是不错的选择。在这种情况下,您可以使用f在GKE上使用“ 集群austoscaler ”进行Statefulset或部署之外,当您尝试创建没有足够能力在集群内部运行的新Pod时,您可以获得更可扩展的解决方案。在这种情况下,群集自动缩放器会自动添加其他资源。

另一方面,您可以考虑使用诸如Cerebral之类的其他解决方案,它使您可以创建用户定义的策略,以增加或减少群集内节点池的大小。

  

GKE的集群自动缩放器会根据您要运行的工作负载的需求自动调整集群的大小。启用自动扩展功能后,如果您创建的新Pod容量不足,GKE会自动将新节点添加到群集中。相反,如果群集中的某个节点未得到充分利用,并且其Pod可以在其他节点上运行,则GKE可以删除该节点。

请记住,这个问题非常笼统,没有一个很好的答案。您应该根据自己的需求,负载,活动,容量,成本来考虑所有优点和缺点...

希望获得帮助。