如何使用Kubernetes进行扩展工作队列

时间:2019-01-04 20:33:21

标签: python azure docker kubernetes azure-kubernetes

我需要基于docker / python worker的可扩展队列处理。我的想法转向了kubernetes。但是,我不确定最好的控制器/服务。

基于azure函数,我收到了传入的http流量,将简单消息添加到存储队列。这些消息需要处理,并将结果反馈到结果队列中。

为了处理这些队列消息,我开发了python代码来循环队列并处理这些作业。每次成功循环之后,该消息将从源队列中删除,并将结果写入结果队列。一旦队列为空,代码就存在。

因此,我创建了一个运行python代码的docker映像。如果启动了多个容器,显然队列会更快地工作。 我还实现了新的Azure Kubernetes服务以进行扩展。 当我是kubernetes的新手时,我读到了在队列准备工作之前工作队列的工作范式。我简单的yaml模板如下所示:

apiVersion: batch/v1
kind: Job
metadata:
  name: myjob
spec:
  parallelism: 4
  template:
    metadata:
      name: myjob
    spec:
      containers:
      - name: c
        image: repo/image:tag

我现在的问题是,该作业无法重新启动。

通常,队列中充满了一些条目,然后有一段时间没有任何反应。然后,更大的队列又会到达,需要尽快处理。当然,我想再次运行该作业,但这似乎是不可能的。另外,如果队列中什么也没有,我想将占用空间减小到最小。

所以我的问题是,在这种情况下我应该使用哪种体系结构,是否有简单的Yaml示例?

2 个答案:

答案 0 :(得分:2)

这是一种常见的模式,有几种方法可以设计解决方案。

一个常见的解决方案是让一个带有一组工作人员的应用程序总是轮询您的队列(这可能是您的python脚本,但您需要使其成为服务),通常您会希望使用Kubernetes {{3} },并根据您的队列或CPU的某些指标使用Deployment

在您的情况下,您需要将脚本设置为Horizontal Pod Autoscaler,并在有任何项目的情况下轮询队列(我假设您已经在使用并行性处理竞争条件)。然后,使用Kubernetes部署来部署该守护程序,然后您就可以基于指标或时间表进行伸缩。

已经有许多不同语言的工作计划程序。 daemon是一种非常流行的方法,它已经具备了“工人”的能力,但这对于单个python脚本而言可能是过大的。

答案 1 :(得分:1)

这可能是一个“愚蠢/ hacky”的答案,但是它简单,健壮,而且我已经在生产系统中使用了几个月了。

我有一个类似的系统,其中有一个队列,有时会被清空,有时会被猛烈撞击。我以类似的方式编写队列处理器,它一次处理队列中的一条消息,如果队列为空,则终止。它设置为在Kubernetes作业中运行。

诀窍是这样的:我创建了一个CronJob来定期启动该作业的一个新实例,并且该作业允许无限的并行性。如果队列为空,它将立即终止(“缩小”)。如果队列被猛击,而最后一个作业尚未完成,则另一个实例启动(“向上扩展”)。

无需查询队列和扩展状态集或任何东西,如果队列为空,则不会消耗任何资源。您可能需要调整CronJob间隔,以微调它对填充队列的反应速度,但是它应该反应良好。