KNative原生 CI/CD 框架 Tekton 探秘

996 阅读5分钟

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 是一大亮点。


官方资讯最新技术独家解读