Tekton 是一个功能强大的 Kubernetes 原生开源工具,用于创建持续集成和交付系统。
通过抽象底层实现细节,用户可以跨多云平台和本地系统进行构建、测试和部署。
Pipelines创建自定义资源作为构建块去声明Pipelines。
自定义资源是Kubernetes API的扩展,可以创建自定义Kubernetes对象。安装自定义资源后,用户可以使用kubectl创建和访问其对象,就像对pod,部署等内置资源一样。这些资源在集群上运行,并由Kubernetes自定义资源定义(CRD)实施。 Tekton Pipeline中有5类对象,核心理念是通过定义yaml定义构建过程.构建任务的状态存放在status字段中。 其中5类对象分别是:PipelineResouce、Task、TaskRun、Pipeline、PipelineRun。
- Task是单个任务的构建过程,需要通过定义TaskRun任务去运行Task。
- Pipeline包含多个Task,并在此基础上定义input和output,input和output以PipelineResource作为交付。
- PipelineResource是可用于input和output的对象集合。
- 同样地,需要定义PipelineRun才会运行Pipeline。
下图中的箭头放下描述了从一种资源到另一种资源的依赖。
关于Tekton的设计理念:
-
Pipelines不知道什么会触发它们,它们可以由事件或手动创建PipelineRun触发。
-
Tasks可以单独存在,并且可以完全独立于Pipelines调用。它们具有高内聚低耦合特点。
-
Tasks可以取决于其他Tasks创建的工件和参数。
-
Tasks可以被TaskRuns调用。
-
PipelineResources是用作Tasks输入和输出的工件。
我们这里主要介绍下Task。
Task(或ClusterTask)是希望在连续集成流程中运行的顺序步骤的集合。任务将在集群上的pod内运行。
一个 Task 声明包括:
-
Inputs
-
Outputs
-
Steps
Task的作用范围是一个namespace,而ClusterTask的作用范围是整个kubernetes 集群。 语法
要为Task资源定义配置文件,可以指定以下字段: 必写:
-
steps - 指定要在Task中运行的一个或多个容器镜像。
-
apiVersion- 指定 API 版本, 例如tekton.dev/v1alpha1.
-
kind- 指定 Task 资源对象.
-
metadata- 指定数据以唯一标识Task资源对象, 例如name.
-
spec- 为Task资源对象指定配置信息。必须通过以下任一字段定义Task steps: 可选:
-
inputs- 指定你Task需要用到的参数和 PipelineResources
-
outputs- 指定你Task 产生的 PipelineResources
-
volumes- 指定一个或多个要用于Task中steps的 挂载卷.
-
stepTemplate- 指定容器 step 定义,以用作“Task”中所有step的基础。.
-
sidecars- 指定sidercar容器与steps一起运行.
apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
name: example-task-name
spec:
inputs:
resources:
- name: workspace
type: git
params:
- name: pathToDockerFile
type: string
description: The path to the dockerfile to build
default: /workspace/workspace/Dockerfile
outputs:
resources:
- name: builtImage
type: image
steps:
- name: ubuntu-example
image: ubuntu
args: ["ubuntu-build-example", "SECRETS-example.md"]
- image: gcr.io/example-builders/build-example
command: ["echo"]
args: ["$(inputs.params.pathToDockerFile)"]
- name: dockerfile-pushexample
image: gcr.io/example-builders/push-example
args: ["push", "$(outputs.resources.builtImage.url)"]
volumeMounts:
- name: docker-socket-example
mountPath: /var/run/docker.sock
volumes:
- name: example-volume
emptyDir: {}
参考上面的例子,我们来看一下几个参数的解释:
Steps
Steps字段是必填字段。您定义一个或多个Step字段以定义Task主体。 如果定义了多个Step,则由TaskRun调用任务时,将按照定义的顺序执行它们。 Task中的每个Step都必须指定一个遵守容器规约的容器镜像。对于您定义的每个Step字段或容器镜像: 按照配置文件,依次运行和评估容器镜像。 个容器镜像一直运行到完成或检测到第一个故障为止。 如果容器镜像在“Task”中的所有容器镜像中没有最大的资源请求,则CPU,内存和临时存储资源请求将设置为零。这样可以确保执行任务的Pod仅请求执行任务中任何单个容器镜像所需的资源,而不是请求所有容器镜像资源请求的总和。
Inputs
一个Task可以声明其所需的inputs,可以是以下之一或全部:
- 参数
- 输入资源
参数:
Task可以声明在TaskRun期间必须提供给任务的输入参数。此的一些示例用例包括: 需要知道一个Task构建应用程序时使用什么编译标志。 需要知道如何命名已构建工件的Task。 参数名称仅限于字母数字字符-和_,并且只能以字母字符和_开头。例如,fooIs-Bar_是有效的参数名称,barIsBa $或0banana不是。 每个声明的参数都有一个类型字段,如果用户未提供,则假定为字符串。另一个可能的类型是数组-例如,当需要向构建应用程序的任务提供动态数量的编译标志时,此数组很有用。提供实际参数值时,将根据类型字段验证其解析的类型。
用法:
以下示例显示如何对Tasks进行参数化,以及如何将这些参数从TaskRun传递给Task。 $(inputs.params.foo)形式的输入参数在步骤内被替换(另请参见变量替换)。 以下Task声明一个名为“ flags”的输入参数,并在steps.args列表中使用它。
apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
name: task-with-parameters
spec:
inputs:
params:
- name: flags
type: array
- name: someURL
type: string
steps:
- name: build
image: my-builder
args: ["build", "$(inputs.params.flags)", "url=$(inputs.params.someURL)"]
Outputs
Task定义可以包括输入和输出PipelineResource声明。如果仅在输出中声明了特定的资源集,则预期在下一个任务上载或共享的资源副本位于路径/ workspace / output / resource_name /下。
resources:
outputs:
name: storage-gcs
type: gcs
steps:
- image: objectuser/run-java-jar #https://hub.docker.com/r/objectuser/run-java-jar/
command: [jar]
args:
["-cvf", "-o", "/workspace/output/storage-gcs/", "projectname.war", "*"]
env:
- name: "FOO"
value: "world"
Pipeline的正常运转还需要其他的资源配合如: 通过Secrets挂载到工作容器的Git、Docker的账户或token;容器内访问k8s集群所需要的serviceAccount。这些凭据资源挂载到tekton提供的特殊基础镜像容器,由这些基础容器(通常是initContainers)来对账户、凭据进行读取。
结语
Tekton Pipeline 中的任务模板可以拿来复用,而不需要重复定义,另外通过 CRD 重新定义 CI/CD 是一大亮点。
官方资讯最新技术独家解读