Kubernetes 原生 CI/CD 构建框架 Tekton 详解!
共 7547字,需浏览 16分钟
·
2021-03-08 19:54
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。 本文主要介绍了诞生于云原生时代的流水线框架 Tekton。
作者:FogDong(Tekton 社区)
编辑:Bach(才云)
什么是流水线?
在计算机中,流水线是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术,也叫 Pipeline。由于这种 s工作方式与工厂中的生产流水线十分相似, 因此也被称为流水线技术。从本质上讲,流水线技术是一种时间并行技术。以“构建镜像”过程为例:
Tekton
Tekton 是一个基于 Kubernetes 的云原生 CI/CD 开源框架,属于 CD 基金会的项目之一。Tekton 通过定义 CRD 的方式,让用户以灵活的自定义流水线以满足自身 CI/CD 需求。
Task: Task 为构建任务,是 Tekton 中不可分割的最小单位,正如同 Pod 在 Kubernetes 中的概念一样。在 Task 中,可以有多个 Step,每个 Step 由一个 Container 来执行。 Pipeline: Pipeline 由一个或多个 Task 组成。在 Pipeline 中,用户可以定义这些 Task 的执行顺序以及依赖关系来组成 DAG(有向无环图)。 PipelineRun: PipelineRun 是 Pipeline 的实际执行产物,当用户定义好 Pipeline 后,可以通过创建 PipelineRun 的方式来执行流水线,并生成一条流水线记录。 TaskRun: PipelineRun 被创建出来后,会对应 Pipeline 里面的 Task 创建各自的 TaskRun。一个 TaskRun 控制一个 Pod,Task 中的 Step 对应 Pod 中的 Container。当然,TaskRun 也可以单独被创建。
git:代表一个 git 仓库,包含了需要被构建的源代码。将 git 资源作为 Task 的 Input,会自动 clone 此 git 仓库。 pullRequest:表示来自配置的 url(通常是一个 git 仓库)的 pull request 事件。将 pull request 资源作为 Task 的 Input,将自动下载 pull request 相关元数据的文件,如 base/head commit、comments 以及 labels。 image:代表镜像仓库中的镜像,通常作为 Task 的 Output,用于生成镜像。 cluster:表示一个除了当前集群外的 Kubernetes 集群。可以使用 Cluster 资源在不同的集群上部署应用。 storage:表示 blob 存储,它包含一个对象或目录。将 Storage 资源作为 Task 的 Input 将自动下载存储内容,并允许 Task 执行操作。目前仅支持 GCS。 cloud event:会在 TaskRun z执行完成后发送事件信息(包含整个 TaskRun) 到指定的 URI 地址,在与第三方通信的时候十分有用。
文档地址:https://github.com/tektoncd/pipeline/blob/master/docs/resources.md
Kaniko 是 Google 开源的项目之一,可在 Kubernetes 上无需特权模式地构建 docker 镜像。
configuring-authentication-for-docker 地址:https://github.com/tektoncd/pipeline/blob/master/docs/auth.md#configuring-authentication-for-docker
config-artifact-pvc
和一个叫做 config-artifact-bucket
的 Config Map。从命名就可以看出,这二者分别代表了产物存储的两种配置方式—— PVC 和存储桶(目前支持 GCS 和 S3)。config-artifact-pvc
需要填写两个值:size 以及 storageClassName。size 默认为 5GiB,storage class name 默认为 default。这也意味着当我们使用 PipelineResource 进行资源传递时,会自动创建一个 5GiB 的存储卷挂载在 Task 上,供 PipelineResource 使用。Tekton variables 地址:https://github.com/tektoncd/pipeline/blob/master/docs/variables.md
from:当 Task 的 Inputs 依赖于上一个 Task 的 Outputs 时,可以通过 from 参数来指定 runAfter:当 Task 间没有资源依赖,但需要使一个 Task 在另外一个 Task 之后运行的话,可以使用 runAfter 来指定。
lint-repo
和test-app
中的 Task 没有from
或runAfter
关键字,会同时开始执行。一旦
test-app
完成,build-app
和build-frontend
都会开始同时执行,因为它们runAfter
于test-app
。deploy-all
会在build-app
和build-frontend
都完成后才执行,因为它需要的资源from
于这二者。
-post_file:指定了 Step 完成后的文件写入路径。如果 Step 失败,则写入到 {{post_file}}.err
。可以看到上面的写入路径为 /tekton/tools/0,最后的这个数字即为 Step 的编号。-wait_file:指定了在启动下一个 Step 之前要查看的文件路径。它将监听 {{wait_file}}
和{{wait_file}}.err
。若有错误则跳过执行写入{{post_file}}.err
并返回错误(exitCode >= 0);若无错误则执行下一个 Step。如上例子为第一个 step,若为第二个 step,wait_ file 的地址会是/tekton/tools/0
,也就是上一个 step 的 post_file 地址。
在有 LimitRange 限制 Container 必须有资源的的情况下,每个 Container 最小会设置为 LimitRange 的设置。
PipelineResource 仍处于 Alpha 版本,它有可能会被重新设计、替换、弃用或者完全删除。Tekton 社区鼓励用户用 Task 代替 PipelineResources。
Workspace 与 Kubernetes 中 Volume 概念几乎保持一致,只不过并不是 Pod 层级的而是作用于 Tekton 资源层级的。Workspace 在 Pipeline 中使用时是一个抽象的概念,实际的存储类型需要在 PipelineRun 中指定。详见:Workspaces。
Workspaces 地址:https://github.com/tektoncd/pipeline/blob/master/docs/workspaces.md
Conditions
,高版本推荐使用 WhenExpressions
(Conditions 将在不久后废弃,完全替换为 WhenExpressions)。WhenExpressions 由 Input、Operator、Values 三部分组成,其中 Input 可以使用 Tekton 的 Parameter 或者 Results,Operator 目前仅支持 in 和 notin:K8S 进阶训练营