开发者社区> 问答> 正文

如何使用kubernetes扩展作业队列

k8s小能手 2019-01-09 13:49:50 419

我需要一个基于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示例吗?

分享到
取消 提交回答
全部回答(1)
  • k8s小能手
    2019-07-17 23:24:56

    我有一个类似的系统,我有一个队列有时会被清空,有时会被砰的一声。我类似地编写了队列处理器,它一次处理队列中的一条消息,如果队列为空则终止。它被设置为在Kubernetes工作中运行。

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

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

    0 0