4

我试图弄清楚如何使用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
4

1 回答 1

3

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

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

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

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

据我所知,没有办法设置工作流限制,以便 Argo 拒绝额外的工作流提交,直到有更多资源可用。如果您担心 Kubernetes etcd 填满了太多工作流定义,这将是一个问题。

为了避免炸毁 etcd,您需要在 Argo 前面放置另一个某种应用程序来排队 Workflows 提交,直到有更多资源可用。

于 2020-09-28T15:39:16.273 回答