概述
KDO平台的流水线模块是基于Tekton实现的,Tekton 是一个强大、灵活的构建 CI/CD
流水线系统的开源框架,允许开发者构建、测试和发布应用。 Tekton
是云原生的,通过定义CRD,让用户快速灵活定义流水线。
Tekton的优点
- 可定制的: Tekton实体是完全可定制的,从而具有高度的灵活性。平台工程师可以定义非常详细的构建基目录,以供开发人员在各种情况下使用
- 可重复使用的: Tekton实体是完全可移植的,因此一旦定义,组织内的任何人都可以使用给定的管道并重用其构造块。这使开发人员可以快速构建复杂的管道,而无需“重新发明轮子”。
- 可扩展的: Tekton Catalog是Tekton社区驱动的存储库。您可以使用Tekton目录中的预制组件快速创建新的并展开现有管道。
- 标准化: Tekton在您的Kubernetes集群上作为扩展安装并运行,并使用完善的Kubernetes资源模型。 Tekton工作负载在Kubernetes容器中执行。
- 缩放性: 为了增加工作负载容量,您可以简单地将节点添加到群集。 Tekton与您的群集进行缩放,无需重新定义您的资源分配或对管道的任何其他修改
和其他工具的对比
指标 | Tekton | Jenkins X | Argo CD |
---|---|---|---|
安装与部署 | 提供Tekton Operator用于安装、移除、更新Tekton组件 | 提供一个方便使用的命令行工具 jx可用来安装Jenkins X | 通过k8s yaml文件部署,并且提供多租户的部署模式 |
高可用 | 通过配置Deployment的多副本实现 | 通过配置Deployment的多副本实现 | 通过配置Deployment的多副本实现 |
并发构建性能 | 依赖Kubernetes 的 Pod 调度能力,通过对集群节点扩容即可提升并发能力 | 依赖Kubernetes 的 Pod 调度能力,通过对集群节点扩容即可提升并发能力 | 不提供CI能力依赖其他工具,CD性能取决于Git仓库和Kubernetes |
易用性 | kdo平台提供功能丰富的Web UI页面 | 提供功能丰富的Web UI页面 | 提供功能丰富的Web UI页面 |
扩展性 | Tekton Hub提供100+插件。自研插件也比较简单,没有开发语言限制 | 插件生态丰富 | 不支持插件扩展 |
成熟度 | CD基金会项目,开源社区活跃Github star数7.7k。 | CD基金会项目,开源社区活跃Github star数4.3k。 | 开源社区活跃Github star数12.3k。 |
复杂度 | 非常轻量,易于维护 | 架构较为复杂,组件众多,需要一定的维护成本 | 架构比较简单,易于维护 |
开发工具集成 | 支持 | 不支持 | 不支持 |
Tekton的资源对象
Tekton 资源对象是构成 Tekton Pipelines 的核心组件,它们定义了 CI/CD 流水线中的各种逻辑和行为。 通过这些资源对象,Tekton 提供了一个灵活且强大的框架,用于构建和管理持续集成和持续交付(CI/CD)流程。每个资源都有其独特的功能,并且可以根据需求组合起来创建复杂的工作流。
Task
任务(Task) 是执行具体工作单元的基本构建块。它定义了一组按顺序执行的步骤(Steps),每个步骤都是一个容器操作。可以接受参数 (params) 和输出结果 (results)。支持声明工作区 (workspaces) 以便于数据共享。步骤之间可以互相传递数据。
ClusterTask
集群任务(ClusterTask) 与普通 Task 类似,但是 ClusterTask 是集群范围内的资源,可以在整个 Kubernetes 集群中使用。 ClusterTask 不局限于某个命名空间,适用于跨命名空间的任务定义。
TaskRun
任务运行(TaskRun) 是对单个 Task 的一次具体执行实例化。 提供具体的参数值、工作区绑定等运行时信息给 Task。 记录执行的状态和结果。
Pipeline
流水线(Pipeline) 定义了一个或多个 Task 的执行流程,以及这些任务之间的依赖关系。 Pipeline组织多个 Task 成为一个有序的工作流。 支持并行执行任务。 可以定义参数来动态配置 Pipeline 行为。
PipelineRun
流水线运行(PipelineRun) 是对 Pipeline 的一次具体执行实例化。 PipelineRun实例化并触发 Pipeline 中定义的所有 Task。 可以提供参数、工作区和其他运行时配置。
Condition
条件(Conditions) 允许在 Tekton Pipelines 中基于某些检查的结果来决定是否继续执行流水线。 它可用于实现更复杂的业务逻辑控制。Conditions支持自定义条件逻辑。
Resource
资源(Resource) 在早期版本来表示输入和输出的数据源,但在较新的版本中已经被弃用,转而推荐使用 Workspaces 和 Params 来处理数据。
Trigger
触发器(Triggers) 允许你设置规则,当满足特定事件时自动启动 PipelineRuns 或 TaskRuns。 Triggers包括 EventListener 和 TriggerTemplate 等子组件。 它支持 Git 提交、PR 创建等多种触发方式。
Params
参数(Params) 允许你向Pipelines、Tasks 和 PipelineRuns 传递配置信息,使得这些资源可以更加灵活和动态地执行。参数可以用于定义诸如版本号、构建选项、环境变量等可以在运行时改变的值。
Workspaces
工作区(Workspace) 允许你为 PipelineRuns 和 TaskRuns 指定持久卷或其他存储资源。工作区提供了一种机制,使得 Tasks 可以访问共享的数据或代码库,并且可以在多个步骤之间保持数据的一致性和可用性。
kdo流水线
kdo平台使用流水线主要通过两种方式: 标准流水线、嵌入流水线,下面分别进行说明。
标准流水线
标准流水线就是一个Kubernetes的Pipeline对象,下面有个例子:
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
name: pipeline-git-clone-build-push-deploy
namespace: cc-dev
spec:
description: |
该流水线提供了典型的 CI/CD 流程,流程包括:
- 获取 git 存储库作为源
- 使用buildah通过Dockerfile构建Docker镜像
- 将构建的 Docker 镜像推送到所需的存储库
- 将其部署到 Kubernetes 集群
params:
- description: 要从中克隆的git存储库URL
name: repo-url
type: string
- description: 要克隆的git标签
name: tag-name
type: string
- description: 'The image full path to host the built image, with version tag, e.g. image-registry.openshift-image-registry.svc:5000/tekton-pipelines/spring-boot-docker:v1.0.0.'
name: image-full-path-with-tag
type: string
- description: 用于部署的清单文件.
name: deployment-manifest
type: string
tasks:
- name: fetch-repository
params:
- name: url
value: $(params.repo-url)
- name: revision
value: $(params.tag-name)
- name: deleteExisting
value: 'true'
taskRef:
kind: Task
name: git-clone
workspaces:
- name: output
workspace: workspace
- name: maven
params:
- name: GOALS
value:
- '-B'
- '-DskipTests'
- clean
- package
runAfter:
- fetch-repository
taskRef:
kind: Task
name: maven
workspaces:
- name: maven-settings
workspace: maven-settings
- name: source
workspace: workspace
- name: buildah
params:
- name: IMAGE
value: $(params.image-full-path-with-tag)
runAfter:
- maven
taskRef:
kind: Task
name: buildah
workspaces:
- name: source
workspace: workspace
- name: deploy
params:
- name: script
value: |
kubectl apply -f $(params.deployment-manifest)
echo "----------"
kubectl get deployment
runAfter:
- buildah
taskRef:
kind: Task
name: kubernetes-actions
workspaces:
- name: kubeconfig-dir
workspace: empty-dir
- name: manifest-dir
workspace: empty-dir
workspaces:
- name: workspace
- name: maven-settings
- name: empty-dir
编辑标准流水线
嵌入流水线
嵌入流水线和标准流水线不一样,它不是Pipeline资源对象,是一个PipelineRun资源对象,通过模板把这个PipelineRun对象实例化,就可以实现流水线的运行。 主要用于kdo平台的应用,创建应用时它会根据模板自动生成。
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
name: spring-boot-docker-dev-ls-test
namespace: cc
spec:
params:
- name: repo_url
value: ''
- name: revision
value: ''
pipelineSpec:
tasks:
- name: fetch-repository
taskRef:
name: git-clone
kind: ClusterTask
workspaces:
- name: output
workspace: workspace
- name: basic-auth
workspace: basic-auth
params:
- name: url
value: $(params.repo_url)
- name: revision
value: $(params.revision)
- name: maven
params:
- name: MAVEN_IMAGE
value: 'registry.cn-shenzhen.aliyuncs.com/kubedo/maven:3-openjdk-8'
- name: GOALS
value:
- 'dependency:go-offline'
- '-DskipTests'
- clean
- package
runAfter:
- fetch-repository
taskRef:
kind: ClusterTask
name: maven
workspaces:
- name: source
workspace: workspace
- name: maven-settings
workspace: maven-repo
- name: maven-local-repo
workspace: maven-repo
- name: buildah
params:
- name: IMAGE
value: 'hub-k8s.kube-do.cn/cc-dev/spring-boot-docker:$(params.image_tag)'
- name: DOCKERFILE
value: docker/Dockerfile
runAfter:
- maven
taskRef:
kind: ClusterTask
name: buildah
workspaces:
- name: source
workspace: workspace
- name: dockerconfig
workspace: dockerconfig-ws
- name: deploy
params:
- name: script
value: >
kubectl set image deployment/$DEPLOYMENT_NAME $APP_NAME=hub-k8s.kube-do.cn/cc-dev/spring-boot-docker:$(params.image_tag) -n $NAMESPACE
runAfter:
- buildah
taskRef:
kind: ClusterTask
name: kubernetes-actions
workspaces:
- name: kubeconfig-dir
workspace: workspace
- name: manifest-dir
workspace: workspace
status:
reason: Skipped
workspaces:
- name: workspace
persistentVolumeClaim:
claimName: workspace
- name: maven-repo
persistentVolumeClaim:
claimName: maven-repo
- name: dockerconfig-ws
secret:
secretName: registry
和标准流水线的区别
嵌入流水线
和标准流水线
的主要区别,标准流水线的参数(Params)
和工作区(Workspaces)
默认需要手动输入,嵌入流水线可以通过平台从应用信息里面自动生成,实现了流水线的自动化。
编辑嵌入流水线
在分支流水线选择对应的分支,扩展后就能编辑嵌入流水线流水线了。
嵌入流水线的编辑提供了两种主要方式:流水线运行构建器(图形化界面)和YAML视图。 对于大多数用户而言,通常推荐采用图形化界面来进行编辑,因为它通过直观的操作流程和友好的用户界面大大降低了使用门槛,使得创建和修改流水线变得简便快捷,无需深入了解YAML语法及其复杂性。
在流水线运行构建器的页面,主要有三部分: 任务、参数、工作区,其中工作区
和参数
主要用于传递信息, 任务
可以通过图形化拖拽各种组件模板
实现流水线任务的编辑。