Knative 社区很早就在讨论用 Tekton 替换 Build 模块的事宜。Knative Build 官方已经正式说明不再建议使用 Knative Build 了。
如果你知道 Knative Build 是什么相信你理解起 Tekton 就是很容易的一件事了。
- Knative Build 对自己的一句话概述是:
A Kubernetes-native Build resource.
- Tekton 对自己的一句话概述是:
A K8s-native Pipeline resource. https://tekton.dev
可以看到两者的定位非常相近,而且在功能上 Tekton 的设计更加的丰富、完整,这也是社区最终采用 Tekton 的原因。接下来我们就看一下 Tekton 的核心概念。
Tekton 极速入门
Tekton 主要由如下五个核心概念组成:
- Task
- TaskRun
- Pipeline
- PipelineRun
- PipelineResource
这五个概念每一个都是以 CRD 的形式提供服务的,下面分别简述一下这五个概念的含义。
Task
Task 就是一个任务执行模板,之所以说 Task 是一个模板是因为 Task 定义中可以包含变量,Task 在真正执行的时候需要给定变量的具体值。Tekton 的 Task 很类似于一个函数的定义,Task 通过 inputs.params 定义需要哪些入参,并且每一个入参还可以指定默认值。Task 的 steps 字段表示当前 Task 是有哪些子步骤组成的。每一个步骤具体就是一个镜像的执行,镜像的启动参数可以通过 Task 的入参使用模板语法进行配置。
TaskRun
Task 定义好以后是不能执行的,就像一个函数定义好以后需要调用才能执行一样。所以需要再定义一个 TaskRun 去执行 Task。TaskRun 主要是负责设置 Task 需要的参数,并通过 taskRef 字段引用要执行的 Task。
Pipeline
一个 TaskRun 只能执行一个 Task,当需要编排多个 Task 的时候就需要 Pipeline 出马了。Pipeline 是一个编排 Task 的模板。Pipeline 的 params 声明了执行时需要的入参。 Pipeline 的 spec.tasks 定义了需要编排的 Task。Tasks 是一个数组,数组中的 task 并不是通过数组声明的顺序去执行的,而是通过 runAfter 来声明 task 执行的顺序。Tekton controller 在解析 CRD 的时候会解析 Task 的顺序,然后依据设定的顺序依次去执行。Pipeline 在编排 Task 的时候需要给每一个 Task 传入必须的参数,这些参数的值可以来自 Pipeline 自身的 params。
PipelineRun
和 Task 一样 Pipeline 定义完成以后也是不能直接执行的,需要 PipelineRun 才能执行 Pipeline。PipelineRun 的主要作用是给 Pipeline 设定必要的入参,并执行 Pipeline。
PipelineResource
前面已经介绍了 Tekton 的四个核心概念。现在我们已经知道怎么定义 task、执行 task 以及编排 task 了。但可能你还想在 Task 之间共享资源,这就是 PipelineResource 的作用。比如我们可以把 git 仓库信息放在 PipelineResource 中。这样所有 Pipeline 就可以共享这份数据了。
授权信息
git 仓库、镜像仓库这些都是需要鉴权才能使用的。所以还需要一种设定鉴权信息的机制。Tekton 本身是 Kubernetes 原生的编排系统。所以可以直接使用 Kubernetes 的 ServiceAccount 机制实现鉴权。
实例如下:
- 定义一个保存镜像仓库鉴权信息的 secret
- 定义 ServiceAccount ,并且使用上面的 secret
- PipelineRun 中引用 ServiceAccount
Hello World
https://github.com/knative-sample/tekton-knative 这是一个完整的 Tekton 的 Helle World。下面我们一起体验一下这个 Helle World。
在开始实战之前你需要有一个 Kubernetes 集群,并还需要安装 Knative 和 Tekton。tekton-knative 中的 release-v0.5.2.yaml 直接提交到 Kubernetes 集群即可完成 Tekton 的安装。下面我们开始体验使用 Tekton 从源码到构建再到部署的自动化过程。
clone 代码
clone 代码到本地。
git clone https://github.com/knative-sample/tekton-knative
创建 PipelineResource
主要内容在 resources/picalc-git.yaml
文件中。如下所示主要是把 https://github.com/knative-sample/tekton-knative 保存在 resource 中给其他资源使用。
创建 task
创建 task,这个例子中我们创建两个 task:source-to-image 和 deploy-using-kubectl
- source-to-image
主要内容在tasks/source-to-image.yaml
文件中。此 task 的主要功能是把源代码编译成镜像。
主要是使用 kaniko 实现容器内编译 Docker 镜像的能力。此 Task 的参数主要是设置编译上下文的一些信息,比如:Dockerfile、ContextPath 以及目标镜像 tag 等。
- deploy-using-kubectl
主要内容在tasks/deploy-using-kubectl.yaml
文件中。
如下所示这个 Task 主要的作用是通过参数获取到目标镜像的信息,然后执行一条 sed 命令把 Knative Service yaml 中的 __IMAGE__
替换成目标镜像。再通过 kubectl 发布到 Kubernetes 中。
定义 Pipeline
现在我们已经有两个 Task 了,现在我们就用一个 PIpeline 来编排这两个 Task:
鉴权信息
如下所示,定义一个 Secret 和 ServiceAccount。并且给 ServiceAccount 绑定执行 Knative Service 的权限。
首先创建一个 Secret 保存镜像仓库的鉴权信息,如下所示:
- tekton.dev/docker-0 换成你要推送的镜像仓库的地址
- username 换成镜像仓库鉴权的用户名
- password 环境镜像仓库鉴权的密码
下面这些信息保存到文件中,然后使用 kubectl apply -f 指令提交到 Kubernetes
定义 PIpelineRun
ServiceAccount 对应的鉴权信息是通过和 PIpelineRun 绑定的方式执行的。参见 run/picalc-pipeline-run.yaml
文件
执行 HelloWorld
准备 PIpeline 的资源
执行 create 把 pipelieRun 提交到 Kubernetes 集群。之所以这里使用 create 而不是使用 apply 是因为 PIpelineRun 每次都会创建一个新的,kubectl 的 create 指令会基于 generateName 创建新的 PIpelineRun 资源。
查看一下 pod 信息可能是下面这样:
本文作者:冬岛
本文为云栖社区原创内容,未经允许不得转载。