配置工作流并发控制

更新时间:
复制 MD 格式

在大规模工作流场景下,大量工作流同时运行可能导致集群资源耗尽或任务相互干扰。Argo Workflows提供了多层次的并发控制机制,包括控制器级别并行度限制、工作流优先级等机制,帮助您精细化管控工作流的并发执行行为。本文介绍如何在工作流集群中配置并发控制策略。

准备工作

配置集群级和命名空间级并行限制

  1. 将下方命令中的CLUSTER_ID改为集群ID后执行,编辑workflow-controller-configmap。

    kubectl edit configmap -n CLUSTER_ID workflow-controller-configmap
  2. 通过parallelism字段限制集群内的并发工作流数。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: workflow-controller-configmap
    data:
      parallelism: "10"    # 集群最多同时运行10个工作流
  3. 通过namespaceParallelism字段限制每个命名空间内的并发工作流数。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: workflow-controller-configmap
    data:
      parallelism: "10"              # 集群最多同时运行10个工作流
      namespaceParallelism: "4"      # 每个命名空间最多同时运行4个工作流
  4. 如需对特定命名空间设置独立的并行度限制,请为命名空间添加workflows.argoproj.io/parallelism-limit Label。

    配置了该Label的命名空间不受namespaceParallelism配置的限制。
    apiVersion: v1
    kind: Namespace
    metadata:
      name: high-priority-ns
      labels:
        workflows.argoproj.io/parallelism-limit: "8"    # 该命名空间最多同时运行8个工作流

配置工作流优先级

请通过Workflow中的priority字段指定工作流在排队等待时的调度优先级。priority值越大,优先级越高,越优先被调度执行。priority默认值为0

重要

当启用命名空间级别并行限制时,某些命名空间可能因已达到并行度上限而无法调度新工作流。此时,低优先级但所在命名空间有剩余配额的工作流可能先于高优先级工作流执行。

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: high-priority-
spec:
  priority: 10                # 高优先级工作流
  entrypoint: main
  templates:
  - name: main
    container:
      image: mirrors-ssl.aliyuncs.com/busybox:latest
      command: [echo]
      args: ["高优先级任务"]

配置Pod优先级(PriorityClass)

priority字段控制的是Argo层面的工作流调度顺序。如果还需要控制Kubernetes调度器对工作流Pod的调度优先级(例如在集群资源不足时决定Pod的调度和抢占顺序),请通过podPriorityClassName字段为工作流的所有Pod指定Kubernetes PriorityClass。

prioritypodPriorityClassName作用于不同层面:priority决定Argo控制器在并行度受限时的工作流调度顺序;podPriorityClassName决定Kubernetes调度器对Pod的调度和抢占行为。建议对关键工作流同时配置两者,确保在Argo调度和Kubernetes调度两个层面都获得优先处理。
  1. 创建PriorityClass,并在其中指定优先级数值和抢占策略。

    apiVersion: scheduling.k8s.io/v1
    kind: PriorityClass
    metadata:
      name: high-priority
    value: 1000000  # 优先级数值,值越大优先级越高
    preemptionPolicy: Never # 抢占策略请使用Never,否则可能会对正在运行任务产生影响
    globalDefault: false
    description: "用于生产环境关键工作流的高优先级调度"
  2. Workflow中引用PriorityClass。

    apiVersion: argoproj.io/v1alpha1
    kind: Workflow
    metadata:
      generateName: critical-pipeline-
    spec:
      priority: 10                          # Argo调度优先级
      podPriorityClassName: high-priority   # Kubernetes Pod调度优先级
      entrypoint: main
      templates:
      - name: main
        container:
          image: mirrors-ssl.aliyuncs.com/busybox:latest
          command: [sh, -c]
          args: ["echo '关键任务执行中'; sleep 30"]