Kubernetes 原生 CI/CD 构建框架 Argo 详解!
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。
作者:FogDong(才云)
编辑:Bach(才云)
什么是流水线?
在计算机中,流水线是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术,也叫 Pipeline。由于这种 s工作方式与工厂中的生产流水线十分相似, 因此也被称为流水线技术。从本质上讲,流水线技术是一种时间并行技术。以“构建镜像”过程为例:
上图流程中使用的是 Jenkins。Jenkins 作为老牌流水线框架被大家所熟知。在云原生时代,Jenkins 推出了 Jenkins X 作为基于 Kubernetes 的新一代流水线,另外云原生时代还诞生了两大流水线框架—— Argo 和 Tekton。本文就详细介绍了 Argo 的相关内容。
《Kubernetes 原生 CI/CD 构建框架 Tekton 详解!》详细介绍了 Tekton 的相关内容。
Argo
Quick Start
Argo 基于 Kubernetes,可以直接使用 kubectl 安装,安装的组件主要包括了一些 CRD 以及对应的 controller 和一个 server。
注意,上述安装只会执行同 namespace 内的 Workflow,cluster install 详见文档。文档地址:https://github.com/argoproj/argo/blob/master/docs/installation.md
三级定义
要了解 Argo 定义的 CRD,先从其中的三级定义入手。概念上的从大到小分别为 WorkflowTemplate、Workflow、template,这些资源的命名有些相似,要注意分辨。
从最简单的 template 说起,一个 template 有多种类型,分别为 container、script、dag、steps、resource 以及 suspend。对于 template,我们可以简单的将其理解为一个 Pod ——container/script/resource 类型的 template 都会去实际控制一个 Pod,而 dag/steps 类型的 template 则是由多个基础类型的 template (container/script/resource)组成的。
container:最常见的模板类型,与 Kubernetes container spec 保持一致。
script:该类型基于 Container,支持用户在 template 定义一段脚本,另有一个 Source 字段来表示脚本的运行环境。
resource:该类型支持我们在 template 中对 kubernetes 的资源进行操作,有一个 action 字段可以指定操作类型,如 create, apply, delete 等,并且支持设定相关的成功与失败条件用于判断该 template 的成功与失败。
suspend:Suspend template 将在一段时间内或在手动恢复执行之前暂停执行。可以从 CLI (使用 argo resume)、API 或 UI 恢复执行。
steps:Steps Template 允许用户以一系列步骤定义任务。在 Steps 中,[--] 代表顺序执行,[-] 代表并行执行。
dag:DAG template 允许用户将任务定义为带依赖的有向无环图。在 DAG 中,通过 dependencies设置在特定任务开始之前必须完成的其他任务。没有任何依赖项的任务将立即运行。有关 DAG 的详细逻辑可见源码 https://github.com/argoproj/argo/blob/master/workflow/controller/dag.go#L204。
定义了要执行的工作流。 存储了工作流的状态。
而 Workflow 由一个 entrypoint 及一系列 template 组成,entrypoint 定义了这个 workflow 执行的入口,而 template 会实际去执行一个 Pod,其中,用户定义的内容会在 Pod 中以 Main Container 体现。此外,还有两个 Sidecar 来辅助运行。
Sidecar
在 Argo 中,这些 Sidecar 的镜像都是 argoexec。Argo 通过这个 executor 来完成一些流程控制。
Inputs and Outputs
在运行 Workflow 时,一个常见的场景是输出产物的传递。通常,一个 Step 的输出产物可以用作后续步骤的输入产物。在 Argo 中,产物可以通过 Artifact 或是 Parameter 传递。
{{xxx}} 是 Argo 固定的变量替换格式:
关于变量的格式详见文档,文档地址:https://github.com/argoproj/argo/blob/master/docs/variables.md 关于变量替换的逻辑详见源码,源码地址:https://github.com/argoproj/argo/blob/master/workflow/common/util.go#L305
其他流程控制功能
循环
对比 Tekton
相较于 Tekton 而言,Argo 的流程控制功能更加丰富。拥有着循环、递归等功能,这对于一些机器学习的场景都是十分适用的。而 Argo 社区对自己的定位也是 MLOps、AIOps、Data/Batch Processing,这也正是 Kubeflow Pipeline 底层基于 Argo 的原因(尽管 KFP 也在做 Tekton 的 backend)。
Argo Roadmap:https://github.com/argoproj/argo/blob/master/docs/roadmap.md Argo Examples:https://argoproj.github.io/argo/examples/#welcome Argo Source Code:https://github.com/argoproj/argo
K8S 进阶训练营