使用Argo工作流创建队列系统



我正在尝试如何使用Argo设置工作队列。Argo工作流的计算成本很高。我们需要为许多同时发生的请求做好计划。工作流项目通过HTTP请求添加到工作队列中。

流程可以这样演示:

client  
=> hasura # user authentication  
=> redis # work queue
=> argo events # queue listener
=> argo workflows 
=> redis + hasura # inform that workflow has finished
=> client 

我从未构建过超过其资源的K8s集群。我在哪里限制工作流的执行?或者Argo事件和工作流是否根据集群中的资源来限制这些?

上面的例子可能可以简化为下面的例子,但问题是如果处理队列已满会发生什么?

client
=> argo events # HTTP request listener
=> argo workflows

Argo工作流没有队列的概念,因此无法知道队列何时已满。如果您需要队列控制,则应在提交工作流之前进行。

提交工作流后,有多种方法可以限制资源使用。

  1. Pod资源-每个工作流步骤都由一个Kubernetes Pod表示。您可以像在部署中使用Pod一样设置资源请求和限制
  2. 步骤并行性限制-在工作流中,您可以限制并发运行的步骤数。当一个步骤特别耗费资源时,这会有所帮助
  3. 工作流并行性限制-您可以通过向我们配置信号量来限制并发运行的工作流的数量

还有许多其他性能优化,如设置工作流和Pod TTL,以及将大型工作流的YAML卸载到数据库中,而不是将它们保留在集群中。

据我所知,没有办法设置工作流限制,以便Argo在有更多资源可用之前拒绝其他工作流提交。如果您担心Kubernetes etcd填充了太多的工作流定义,那么这就是一个问题。

为了防止etcd爆炸,你需要在Argo前面放另一个某种应用程序来排队工作流提交,直到有更多资源可用。

最新更新