使用 Argo Workflows 创建队列系统

Creating a queue system with Argo Workflows

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

流程可以这样演示:

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

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

上面的例子可能可以简化为下面的例子,但问题是如果 processing queue is full?

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

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

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

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

还有一些其他的performance optimizations like setting Workflow and Pod TTLs and offloading YAML for large Workflows to a DB instead of keeping them on the cluster

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

为了避免 etcd 崩溃,您需要在 Argo 前面安装另一个某种类型的应用程序来对工作流提交进行排队,直到有更多资源可用。