繁体   English   中英

kube.netes 排队工作人员自动缩放

[英]kubernetes queued worker with autoscaling

  • 我在 sqs/rabbitMQ 中有一个作业队列,消息很少到达

  • 每次消息到达队列时,我都想在我的 kube.netes 集群中启动一个新的 pod

  • 所有 Pod 都将具有完全相同的配置,它们只是根据从队列中提取的信息对不同的数据执行操作

  • 当一个 pod 启动时,它需要运行几个小时然后才能退出。

  • 如果 pod 失败,它将需要重新启动并理想地从它最初读取的队列中读取相同的消息

  • 有时消息队列完全为空并且所有 pod 都已完成。 但是当新消息到达队列时,它仍然需要生成一个新的 pod

  • 谁能告诉我这种东西有没有设计模式? 或者我应该编写一个脚本来以编程方式管理我的 pod?

  • 我愿意接受任何版本的 kube.netes 的任何建议,包括 aws eks

  • 我已经阅读了这里的一些设计模式,但它们似乎不适合我的用例,因为

    一种。 每个工作项使用 Pod 排队

     1. Doesn't seem to support jobs that don't complete after a pre-determined number of job completions

    b. 具有可变 Pod 计数的队列

     2. Will not spawn new jobs after the first job completes. So it's not long running

在我看来,当前的 Job 缺乏这种用法。 但是,如果您的消息(在队列中)具有可靠的 ID,则可以轻松构建 controller。

这个想法基本上是:

#!/bin/bash
while true
tasks=$(get list of messages ID)
do
for task in tasks
do
   kubectl apply -f task-consumer-def.yaml -l task_id=$task
done
sleep 60
done

task-consumer-def.yaml中,您将使用Downward API (它允许您将 Pod 信息公开给其中的容器)来公开此 worker 需要操作的任务 ID。

task-consumer-def中使用Job可能是一个更好的主意,它将为您处理重启部分。

这就是运算符模式。 基本上,您确保每条消息都有一个分配给它的工作人员。 我认为你可以让 Kube.netes 处理已完成项目的垃圾收集。 如果消息已经分配了 pod,则不会更改。

您可能会更有效地做到这一点,或者增加一个最大值,但概念基本保持不变。

一种变体是使用Indexed Jobs ,每个 Job 有多个工作项,但会稍微复杂一些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM