【问题标题】:kubernetes queued worker with autoscaling具有自动缩放功能的 kubernetes 排队工作者
【发布时间】:2022-02-10 21:17:05
【问题描述】:
  • 我在 sqs/rabbitMQ 中有一个作业队列,其中有消息不常到达

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

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

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

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

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

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

  • 我愿意接受任何关于任何版本的 kubernetes 的建议,包括 aws eks

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

    一个。 每个工作项的 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
    

【问题讨论】:

  • 你在寻找类似 knative eventing 的东西吗?
  • 感谢您的建议。现在只需阅读文档以了解 knative eventing。你能推荐一个工作流程或一个好的起点/任何例子吗?

标签: amazon-web-services kubernetes amazon-eks kubernetes-pod


【解决方案1】:

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

这个想法基本上是:

#!/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 信息)来公开该工作人员需要操作的任务ID。

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

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

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

对此的一种变体是使用Indexed Jobs,每个作业有多个工作项,但这会更复杂一些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-07
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2014-11-19
    • 2021-04-28
    相关资源
    最近更新 更多