Argo Workflows 发布 3.6,一文解析关键新特性

文摘   2024-11-05 09:54   中国香港  
Argo Workflows 是 CNCF 毕业项目,专为 Kubernetes 上编排并行 Job 而设计,本文主要对最新发布的 Argo Workflows 3.6 版本的关键新特性做一个深入的解析。
01

Argo Workflows 简介

Cloud Native

Argo Workflowshttps://github.com/argoproj/argo-workflows是 CNCF 毕业项目,专为 Kubernetes 上编排并行 Job 而设计,将工作流中的每一个任务实现为一个单独的容器实例单独运行,具有轻量级、易扩展、并行性高等特点。

Argo Workflows 主要被应用在以下的场景:

  • 批处理系统:对于需要定期或按需执行的大规模数据处理任务,如ETL作业、数据分析报告生成等,Argo Workflows 提供了一种声明式的方式来定义和执行这些批处理作业。

  • 机器学习工作流:在机器学习项目中,Argo Workflows 可以协调数据预处理、模型训练、验证、调参和部署等步骤,同时利用 Kubernetes 的资源调度能力,高效地分配GPU等资源,支持大规模并行计算需求。

  • 基础设施自动化:在管理云原生基础设施时,可用于执行一系列自动化任务,比如创建和配置 Kubernetes 资源、执行备份恢复操作、监控系统的健康状态等。

  • CI/CD:持续集成和持续部署流程通常包含代码构建、测试、部署等多个阶段。Argo Workflows 能够很好地整合这些步骤,实现自动化流水线,提高软件交付的速度和质量。

Argo Workflows Use Cases
阿里云容器服务是国内早期使用 Argo Workflow 的团队之一。在落地生产过程中,解决了大量性能瓶颈,并且开发了较多功能回馈给社区。在 v3.6 版本中贡献了多项特性,尤其是在核心控制器的易用性和稳定性上,贡献了超大参数自动 Offload、模板调度约束、超大扁平工作流并行解析、OSS 文件流式传输、OSS Artifacts 垃圾回收、Pod 并行清理 Retry、动态模板引用等众多特性,提升了工作流引擎的稳定性、易用性和性能。

本文将会对 Argo Workflows 3.6 版本的关键新特性做一个深入的解析。

02

新特性解析

Cloud Native

1)CronWorkflows:调度策略增强

CronWorkflows 是 Argo Workflows 最常用的功能之一,您可以使用该功能在自定义时间节点触发任务调度,在 v3.6 中,有以下几个增强:
  • 多个 cron scheduler 调度:可以在单个 CronWorkflow 中集成多个定时调度策略来进行工作流调度。

  • 增加停止策略:可以设定策略在特定情况下停止调度,可以避免定时工作流持续失败,导致集群中失败工作流积压。

  • When 表达式:在每次调度之前检查表达式是否为 true,提供了和 cron scheduler 更灵活的组合机制。
该增强方便了用户对调度策略进行组合,实现各种不同的定时调度策略。
使用示例:
apiVersion: argoproj.io/v1alpha1kind: CronWorkflowmetadata:  name: cron-workflow-examplespec:  schedules: # 多个调度策略,每3分钟和5分钟执行一次,在第15分钟只执行一次。  - "*/3 * * * *"  - "*/5 * * * *"  concurrencyPolicy: "Allow"  stopStrategy: # 在Faild的工作流超过10个之后停止该Cron Workflow    condition: "failed >= 10"  # 通过表达式限制在两次执行间隔超过3600s  when: "{{= cronworkflow.lastScheduledTime == nil || (now() - cronworkflow.lastScheduledTime).Seconds() > 3600 }}"  startingDeadlineSeconds: 0  workflowSpec:    entrypoint: whalesay    templates:    - name: whalesay      container:        image: alpine:3.6        command: [sh, -c]        args: ["date; sleep 1"]

2)用户界面优化

Argo UI 是工作流重要的组成部分,用户提交工作流之后,可以通过该界面便捷的观测到工作流的运行状况。在 3.6 中,增加了工作流详细信息、时间显示、输出 Artifacts 目录、Markdown 语法等,于此同时还可以访问 Cron Workflow、Workflow Template 的执行历史、实时日志等。

The UI shows the directory used for input artifacts

这些增强完善了用户界面的可用性、可观测性,方便用户能够更好的观测自己的工作流状况。

3)Argo Workflows 控制器:大规模、稳定性、安全性、功能增强

控制器是 Argo Workflows 最核心的组件,其稳定性和高性能至关重要。在 v3.6 中主要有以下的一些增强:
大规模、稳定性、安全性增强:
  • 归档工作流使用队列,改善了同时归档大量工作流时的内存管理。

  • 并行清理 Pod,在 Retry 超大工作流时非常有用,可以在容忍时间内完成 Retry。

  • Pod 增加 Pod Kubernetes finalizer, 避免过早删除导致出现"Pod Delete"  Error,便于控制器 Reconceil。

  • 超大扁平工作流并行解析,可以让大型工作流的解析更快。

  • 超大参数自动 Offload,可以支持更长的启动参数,这对于大型的科学模拟场景很有帮助。

  • 自动设置 seccomp profile 为 RuntimeDefault,提高容器安全性,降低被攻击的风险。

这些功能会在控制器启动时默认开启,除此之外,还有一些功能上的增强:
a. OSS Artifacts 自动回收
可以通过配置 artifactGC 策略使得工作流在完成或者删除的时候回收工作流在阿里云 OSS 上中间文件结果,从而节省存储成本。使用示例如下:
apiVersion: argoproj.io/v1alpha1kind: Workflowmetadata:  generateName: artifact-gc-spec:  entrypoint: main  artifactGC:    strategy: OnWorkflowDeletion # the overall strategy, which can be overridden    podMetadata:      annotations:         kubernetes.io/resource-type: eci  templates:    - name: main      container:        image: argoproj/argosay:v2        command:          - sh          - -c        args:          - |            echo "hello world" > /tmp/on-completion.txt            echo "hello world" > /tmp/on-deletion.txt      outputs:        artifacts:          - name: on-completion # 该Artifact会在工作流完成时回收            path: /tmp/on-completion.txt            oss:              endpoint: http://oss-cn-zhangjiakou-internal.aliyuncs.com              bucket: my-argo-workflow              key: on-completion.txt              accessKeySecret:                name: my-argo-workflow-credentials                key: accessKey              secretKeySecret:                name: my-argo-workflow-credentials                key: secretKey            artifactGC:              strategy: OnWorkflowCompletion # overriding the default strategy for this artifact          - name: on-deletion # 该Artifact会在工作流被删除时回收            path: /tmp/on-deletion.txt            oss:              endpoint: http://oss-cn-zhangjiakou-internal.aliyuncs.com              bucket: my-argo-workflow              key: on-deletion.txt              accessKeySecret:                name: my-argo-workflow-credentials                key: accessKey              secretKeySecret:                name: my-argo-workflow-credentials                key: secretKey
b. 模板支持调度约束
可以在定义模板时增加 NodeSelectors 和 Tolerations,使用示例如下:
apiVersion: argoproj.io/v1alpha1kind: WorkflowTemplatemetadata:  name: benchmarksspec:  entrypoint: main  serviceAccountName: workflow  templates:  - dag:      tasks:      - arguments:          parameters:          - name: msg            value: 'hello'        name: benchmark        template: benchmark    name: main    nodeSelector: # 模版上定义节点选择器,该选择器会传递到Pod上      pool: workflows    tolerations:  # 模版上定义容忍,该容忍会传递到Pod上    - key: pool      operator: Equal      value: workflows  - inputs:      parameters:      - name: msg    name: benchmark    script:      command:      - python      image: python:latest      source: |        print("{{inputs.parameters.msg}}")
c. 支持动态模板引用
在定义模板引用时,可以直接使用参数,从而极大的优化 Yaml 编排文件的结构和大小。使用示例如下:
apiVersion: argoproj.io/v1alpha1kind: Workflowmetadata:  generateName: hello-world-wf-global-arg-  namespace: defaultspec:  entrypoint: whalesay  arguments:    parameters:      - name: global-parameter        value: hello  templates:    - name: whalesay      steps:        - - name: hello-world            templateRef: #  Step 中动态模板引用              name: '{{item.workflow-template}}' # 从循环中读取需要调用的模板工作流              template: '{{item.template-name}}' # 从循环中读取template名称            withItems: # 定义循环参数                - { workflow-template: 'hello-world-template-global-arg', template-name: 'hello-world'}          - name: hello-world-dag            template: diamond
- name: diamond dag: tasks: - name: A templateRef: # DAG 中动态模板引用 name: '{{item.workflow-template}}' # 从循环中读取需要调用的模板工作流 template: '{{item.template-name}}' # 从循环中读取template名称 withItems:              - { workflow-template: 'hello-world-template-global-arg', template-name: 'hello-world'}
d. 更新 expr 库,支持多种函数。
可以使用更多的表达式函数,比如列表拼接和字符串合并。使用示例如下:
apiVersion: argoproj.io/v1alpha1kind: Workflowmetadata:  generateName: test-expression-  namespace: argospec:  entrypoint: main  arguments:    parameters:      - name: expr         value: "{{= concat(['a', 'b'], ['c', 'd']) | join('\\n') }}" # 使用列表拼接和字符串合并函数  templates:    - name: main      inputs:        parameters:          - name: expr      script:        image: alpine:3.6        command: ["sh"]        source: |          echo result: '{{ inputs.parameters.expr }}'

4)Argo CLI:模板易用性

Argo CLI 是提交工作流最常用的方式,而模板是我们定义标准流程的方法,方便我们定义各种各样不同的模板,在 v3.6 对模板的易用性做了以下的一些增强:
通过 Argo CLI 可以直接更新工作流模板,这让我们在模板在更新时更加容易,避免使用 Kubectl 方法,下边是使用方法:
argo cron update FILE1 # 更新定时工作流argo template update FILE1  # 更新 workflow-templateargo cluster-template update FILE1 # 更新 cluster-workflow-template

通过 label 过滤模板,有助于对模板进行分类管理:

argo template list -l app=test # 通过label进行过滤
03

快速使用 Argo Workflows

Cloud Native

Argo Workflows 作为一款云原生的批量任务编排引擎,是在 Kubernetes 上编排各类型任务、提高业务自动化水平的必备利器,无论您是企业的架构师、数据科学家、还是 DevOps 工程师,都能使用 Argo Workflows 提高您的工作效率。

阿里云容器服务也提供了全托管的 Serverless Argo Workflows:https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/overview-12
具有以下几个特点:
  • 简单易用:托管核心组件,完全免运维,提供 RestAPI 和 Python SDK,集成简单。

  • 稳定高性能:控制面优化,支持大规模工作流编排,整体规模可达到 4w。

  • 产品化支持:众多领域最佳实践,构建高效工作流,用户只需关注业务创新。
可以帮助您快速体验提交工作流,欢迎加入钉钉交流群:35688562 一同交流。

参考文档:

[1]《Argo Workflows 3.6 发布候选者版本

[2] Argo Workflows

https://github.com/argoproj/argo-workflows

[3] Serverless Argo Workflows

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/overview-12

[4] 最佳实践

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/best-practices


文章转载自阿里云云原生点击这里阅读原文了解更多


CNCF概况(幻灯片)

扫描二维码联系我们!




CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux  Foundation,是非营利性组织。 

CNCF云原生计算基金会)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。请关注CNCF微信公众号。

CNCF
云原生计算基金会(CNCF)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。
 最新文章