Kubernetes处理突然的处理能力请求(例如使用5个进程的Python脚本)

Kubernetes处理突然的处理能力请求(例如使用5个进程的Python脚本),kubernetes,Kubernetes,我脑海中有一个小场景,通过以下设置运行: 在Kubernetes中运行的Django Web服务器具有自动缩放资源的能力(Google Kubernetes引擎),我将资源值设置为具有8个处理单元(8个内核)和16 GB Ram的请求节点 因为它是一个web服务器,所以我的前端可以调用一个Python脚本,该脚本使用5个进程执行,下面是我所担心的: 我知道,如果我在我的Web服务器(与Django代码位于同一个容器中)上运行两次此脚本,我将使用(保持简单)10个进程/CPU来执行此代码

我脑海中有一个小场景,通过以下设置运行:

  • 在Kubernetes中运行的Django Web服务器具有自动缩放资源的能力(Google Kubernetes引擎),我将资源值设置为具有8个处理单元(8个内核)和16 GB Ram的请求节点
因为它是一个web服务器,所以我的前端可以调用一个Python脚本,该脚本使用5个进程执行,下面是我所担心的:

  • 我知道,如果我在我的Web服务器(与Django代码位于同一个容器中)上运行两次此脚本,我将使用(保持简单)10个进程/CPU来执行此代码
那么会发生什么呢

  • 第一个Python脚本是否会在Pod 1上运行,第二个Python脚本(因为我们使用了8个处理单元中的5个)是否会触发Pod 2和另一个节点,然后在新副本上运行,并完全访问5个新进程
  • 或者,第一个Python脚本会在副本1上运行,然后第二个Python脚本会被限制为3个处理单元,因为Kubernetes可能是根据副本中的CPU使用情况进行分配的,而不是我调用脚本的进程数量

如果您的系统有一个Django应用程序,该应用程序启动带有
子流程的脚本
或类似机制,则这些脚本将始终位于与主服务器相同的容器中、相同的pod中、相同的节点上。您永远不会触发任何Kubernetes自动缩放功能。如果pod设置了资源限制,您可能会限制CPU利用率,如果您超过配置的内存限制,pod可能会被关闭(Django及其所有子进程一起关闭)

如果您想更好地利用Kubernetes调度和资源管理,可能需要重新构造此应用程序。理想情况下,您可以在单独的pod中运行Django服务器和每个支持任务。然后需要一种方法来触发任务并收集结果

我通常会通过在混合中引入作业队列系统(如RabbitMQ或芹菜)来实现这一点。Django应用程序将项目添加到队列中,但不直接自己完成工作。然后,每个进程都有一个工作进程来读取队列并执行工作。这与Kubernetes没有直接联系,您可以通过RabbitMQ或Redis安装和本地虚拟环境运行此设置

如果将此设置部署到Kubernetes,则每个任务都可以在其自己的部署中运行,由工作队列提供。每个任务可以运行到其自己配置的内存和CPU限制,并且可以在不同的节点上运行。只需做一点额外的工作,您就可以连接一个水平吊舱自动缩放器,根据作业队列的长度缩放工作人员,因此,如果您在处理其中一项任务时落后,HPA可能会导致启动更多工作人员,这将创建更多吊舱,从而可能分配更多节点


然而,这里重要的细节是,一个吊舱是缩放的关键单元;如果您的所有工作都停留在一个pod内,那么您将永远不会触发水平pod自动缩放器或集群自动缩放器。

当您说“一个包含5个进程的Python脚本”,特别是在Kubernetes进程中,您如何启动它?它是Web服务器吊舱中的一个子流程,还是一个单独的(一组)部署,或者类似芹菜工人之类的东西,或者其他东西?@DavidMaze嘿-对不起,我应该澄清一下。它与Django Web服务器/pods位于同一容器中。因此,本质上,在我的一个Django视图中,执行了一个使用5个CPU/进程的函数。这是我的第一个Kubernetes问题,所以如果还有什么不清楚的地方,我会尽力解决。嗨,David,这太棒了:我实际上有一个来自Gensim的自然语言处理函数,它使用多个worker(你可以在这里找到LDA模型:)我目前对该应用程序的想法是,Django应用程序将达到CPU利用率/内存限制,然后它将水平扩展。就像芹菜一样(我计划设置芹菜),当它需要更多的工人时,就会创建更多的节点。我有点不清楚芹菜的例子为什么不能与Django一起使用——在Django中,更多的节点将从GKE创建?也许我理解的水平扩展是错误的:我认为这是由于我们接近CPU/内存限制,我们创建了一个新的pod,并且可能是一个节点。我正在阅读你的芹菜示例,你必须将度量值输入Kubernetes——当然,我也可能对Django豆荚错了。我是否需要为Kubernetes提供一个指标来扩展Django吊舱?在当前的布局中,您可以将HPA附加到单个部署中,并根据CPU利用率进行扩展。不过,这是一个非常被动的过程:如果您收到两个请求,每个请求启动一个500%CPU的作业,一两分钟后HPA会注意到部署的平均CPU很高,并创建另一个pod,大约一分钟后,下一个请求可能会被路由到新的、不太繁忙的pod。同样,如果HPA缩小规模,它可能会决定关闭一个仍在工作的吊舱。在这种情况下,作业队列系统将能够重试作业。好的-那么我有一个不知道如何解决的问题。我向你们展示的Gensim进程,我希望在5个vCPU上运行它。芹菜只运行每个工人使用1个CPU。我不能使用像Dask这样的东西,所以我被卡住了:如果我想运行一个CPU密集型任务,而该任务没有与调度器的本机集成,我不知道该怎么办。回到您提出的要点,我将以高于我指定要使用的最大工作线程数的限制运行每个Django,而不是限制为1个CPU并从那里自动缩放。我真的很感谢你在这里帮助我。还有,是什么阻止了Django吊舱本身发生同样的一系列失败。Giv