您的位置:

深入理解 Tekton:实现 CI/CD 的全新方法

Tekton 是一种用于构建 CI/CD 系统的 Kubernetes 原生工具, 它将各种 CI/CD 组件无缝地集成到 Kubernetes 中,提供了可扩展性、易维护性和可移植性,是一个快速开发云原生应用的理想选择。在本篇文章中,我们将从多个方面来深入探究 Tekton。

一、Tekton 简介

Tekton 是 Google 开源的 CI/CD 框架。在 Tekton 中,CI/CD 中每一个步骤都被抽象为一种资源。例如:任务(Task)、管道(Pipeline)、任务执行(TaskRun)、管道执行(PipelineRun)等。Tekton 通过这些资源提供了完整的 CI/CD 抽象和控制,同时支持多种 CI/CD 工具与技术,并将其融合到一起。 Tekton 的特点有: 1. Kubernetes 原生: Tekton 是一个 Kubernetes 原生的 CI/CD 工具,可以无缝地与 Kubernetes 集成到一起。 2. 明确的关注: Tekton 将关注点明确到构建网格中的单个步骤,这使得 Tekton 得以支持流水线如何运行、以及应该如何修正问题等需求。 3. 开放性与扩展性: Tekton 模型非常开放,您可以轻松创建自定义的基于 Tekton 的资源,编写自定义插件以及定义自己的资源类型。同时,Tekton 还提供了组件开发和扩展的方式,例如 Operator、Controller 和自定义 Webhook 等,以满足不同人群的需求。 通过使用 Tekton,可以完成以下几项工作: * 管理持续交付管道(不仅限于构建、测试和部署)。 * 集成 Kubernetes 操作到持续交付流程中,以强制执行声明性标准并支持 K8s 平台管理操作的沙盒安全模型。 * 提高性能并具有更好的可重用性和模块化管道文件。 * 简化构建服务、支持持续部署策略,可扩展性更好。

二、任务编写

在 Tekton 中,任务是一个可重用的工作单元,可以在其他任务、流水线等中引用。它可以在 Kubernetes 集群中作为一种自定义资源定义,并可以在计算资源上运行。 任务定义中包括任务所需的输入和输出参数,以及需要执行的一组步骤。任务可以从 container、image、入口脚本等的资源位置执行,支持自定义环境变量等功能。 您可以在 YAML 文件中编写 Tekton 任务,例如下面这个 `build-and-push` 的示例:
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: build-and-push
spec:
  steps:
    - name: build
      image: gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/bash:v0.12.1
      workingDir: /workspace/source
      command:
        - /bin/bash
      args:
        - -c
        - |
          ./mvnw clean package -DskipTests
    - name: push-to-registry
      image: gcr.io/kaniko-project/executor:v1.0.0
      workingDir: /workspace/source
      command:
        - /kaniko/executor
      args:
        - --dockerfile=./Dockerfile
        - --destination=${registry}/${repo}:$-
          {sha256:${succeededBuilds.default.result.buildRevision.commit_SHA}}
        - --tarPath=/workspace/source/target/*.jar
在上面的 YAML 文件中,我们定义了一个 “build-and-push” 的任务,包括两个步骤,在容器中分别运行构建和部署的命令。第一个步骤启动了一个容器,运行构建命令,第二个步骤使用 Kaniko 容器将 Docker 镜像推送到容器镜像仓库。这里使用的是 Kubernetes 的自定义资源模型作为工作流程控制的中心,从而支持管道和任务的自由组合。

三、管道定义

在 Tekton 中,管道由一组任务组成,表示构建和部署过程中的各个步骤。任务之间可以有依赖关系,在某些情况下,它们之间还可以分享资源(如 git 存储库、Docker 镜像等)。 管道定义使用 YAML 文件,在 Tekton 中被表示为 `Pipeline` 对象。由于 Tekton 显式定义了资源输入和输出,因此原理更加清晰,可以提供更高的可重用性和管道定义的代码。 下面是一个将任务组织成管道的示例:
apiVersion: tekton.dev/v1beta1
  kind: Pipeline
  metadata:
    name: demo-app-pipeline
  spec:
    tasks:
    - name: build-and-push
      taskRef:
        name: build-and-push
      params:
      - name: registry
        value: gcr.io
      - name: repo
        value: some/repo
    - name: apply-manifests
      taskRef:
        name: kubectl-apply
      runAfter:
        - build-and-push
      params:
        - name: mani
在 YAML 文件中,我们定义了一个 “demo-app-pipeline” 的流水线,它包括了两个任务,并且第二个任务被定义为 `runAfter` 第一个任务完成后开启。

四、Tekton 架构和部署

Tekton 可以安装在 Kubernetes 集群中。Tekton 的核心组件由控制器和自定义资源定义 (CRDs) 组成。Tekton 还提供了一些示例和工具,用于演示如何在 Kubernetes 集群中使用 Tekton 来构建 CI/CD 流水线。

控制器组件:

1. Tekton Pipelines Controller:提供数据持久性和控制关键操作(如启动管道)的核心控制器。 2. Tekton Dashboard:提供用户界面,用于查看 Tekton 的管道定义、任务执行、日志和面板文档。 3. Tekton Triggers:用于创建基于事件的管道,可以根据 GitHub Activity、Kubernetes事件等触发事件和执行操作。

自定义资源定义(CRDs):

1. PipelineResource:定义管道或任务使用的资源(例如git存储库、Docker 映像、任务执行者)。 2. Task:定义管道中的工作单元。 3. Pipeline:将任务或管道组装在一起以构造流水线。 4. TaskRun (针对单个任务对应的执行结果):记录任务的执行,通常一个任务和 TaskRun 一一对应。 5. PipelineRun:每次使用特定输入的流水线的实例,执行流水线时会创建 PipelineRun 对象。

代码部署示例:

下面是一个 Tekton 部署的代码示例:
# 1. 通过以下命令创建自定义资源和服务帐户:
kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml

# 2. 使用以下命令创建自定义的资源资源:
kubectl apply -f https://storage.googleapis.com/tekton-releases/dashboard/latest/tekton-dashboard-release.yaml

五、Tekton 和其他CI/CD工具的对比

与传统的 CI/CD 工具相比, Tekton 具有以下实用特色: 1. 开放性: Tekton 易于扩展和调整,而传统的 CI/CD 工具不支持灵活的定制。 2. Kubernetes原生: Tekton 可以无缝地与 Kubernetes 集成到一起,而不需要另外集成。 3. 可移植性: Tekton 在不同平台和环境中都能正常工作(支持不同地区和云提供商)。 4. 计算资源: Tekton 可以升级服务的可用性、稳定性和可伸缩性,而这些操作传统的 CI/CD 工具很难实现。 综上所述, Tekton 是针对 Kubernetes 的一种开放性 CI / CD 工具,提供了灵活、可移植、可扩展的流水线 API。Tekton 的各个组件可以混搭、匹配使用,并且可以根据不同的应用需求进行组合。当然, Tekton 还有一些缺点需要考虑,例如:安全方面问题和持久性问题等。但是, Tekton 提供的多种资源类型以及任务和管道自定义,足以应对各种应用场景和问题。 参考链接: Tekton 官网:https://tekton.dev/ Tekton GitHub :https://github.com/tektoncd/tektoncd-pipeline Tekton Dashboard GitHub:https://github.com/tektoncd/dashboard