简介
Tekton 是一个功能强大且灵活的 Kubernetes 原生 CI/CD 构建框架,用于创建持续集成和交付(CI/CD)系统。 关于 Tekton ,网上可以搜到很多很多介绍文档,本文主要阐述我对 Tekton 的实现原理和背后的技术逻辑的一点理解。
Tekton 定义了 Task、TaskRun、Pipeline、PipelineRun、PipelineResource 五类核心对象,通过对 Task 和 Pipeline 的抽象,我们可以定义出任意组合的 pipeline 模板来完成各种各样的 CI/CD 任务,再通过 TaskRun、PipelineRun和PipelineResource 可以将这些模板套用到各个实际的项目中。
实现原理
高度抽象的结构化设计使得 Tekton 具有非常灵活的特性,那么 Tekton 是如何实现 workflow 的流转的呢?
Tekton 利用 Kubernetes 的 List-Watch 机制,在启动时初始化了 2 个 Controller、PipelineRunController 和 TaskRunController 。
PipelineRunController 监听 PipelineRun 对象的变化。在它的 reconcile 逻辑中,将pipeline 中所有的 Task 构建为一张有向无环图(DAG),通过遍历 DAG 找到当前可被调度的 Task 节点创建对应的 TaskRun 对象。
TaskRunController 监听 TaskRun 对象的变化。在它的 reconcile 逻辑中将 TaskRun 和对应 Task 转化为可执行的 Pod ,由 kubernetes 调度执行。利用 Kubernetes 的 OwnerReference 机制, PipelineRun Own TaskRun、TaskRun Own Pod、Pod 状态变更时,触发 TaskRun 的 reconcile 逻辑, TaskRun 状态变更时触发 PipelineRun 的 reconcile 逻辑。
DAG 支持
Tekton 对 DAG 的支持相对比较简单。在 Tekton 中一个 Pipeline 就是一张 DAG ,Pipeline 中的多个Task可是DAG中的节点。Task 默认并发执行,可以通过 RunAfter 和 From 关键字控制执行顺序。
示例:
- name: lint-repo taskRef: name: pylint resources: inputs: - name: workspace resource: my-repo- name: test-app taskRef: name: make-test resources: inputs: - name: workspace resource: my-repo- name: build-app taskRef: name: kaniko-build-app runAfter: - test-app resources: inputs: - name: workspace resource: my-repo outputs: - name: image resource: my-app-image- name: build-frontend taskRef: name: kaniko-build-frontend runAfter: - test-app resources: inputs: - name: workspace resource: my-repo outputs: - name: image resource: my-frontend-image- name: deploy-all taskRef: name: deploy-kubectl resources: inputs: - name: my-app-image resource: my-app-image from: - build-app - name: my-frontend-image resource: my-frontend-image f