使用 Argo Workflows 创建队列系统

Esp*_*and 6 kubernetes argo-workflows argo-events

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

该流程可以这样演示:

client  
  => hasura # user authentication  
    => redis # work queue
      => argo events # queue listener
        => argo workflows 
          => redis + hasura # inform that workflow has finished
            => client 
Run Code Online (Sandbox Code Playgroud)

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

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

client
  => argo events # HTTP request listener
    => argo workflows
Run Code Online (Sandbox Code Playgroud)

Mic*_*haw 6

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

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

  1. Pod 资源- 每个工作流步骤都由 Kubernetes Pod 表示。您可以设置资源请求和限制,就像在部署中设置 Pod 一样。
  2. 步骤并行度限制- 在工作流程中,您可以限制同时运行的步骤数。当某个步骤特别消耗资源时,这会有所帮助。
  3. 工作流并行度限制- 您可以通过将工作流配置为信号量来限制同时运行的工作流数量。

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

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

为了避免破坏 etcd,您需要在 Argo 前面放置另一个某种应用程序来对工作流程提交进行排队,直到有更多资源可用。