本文是我对Tekton的实现原理和背后技术逻辑的理解,以及在实践过程中的一些总结。

简介

Tekton 是一个基于 Kubernetes 的云原生 CI/CD 开源(https://cd.foundation/)框架,基于 CRD(Custom Resource Definitions)方式实现,目前阿里、google、ibm 都在使用这个框架。

Tekton 定义了 Task、TaskRun、Pipeline、PipelineRun、PipelineResource 五类核心对象,通过对task、pipeline资源的编排我可以实现CI/CD。

除此之外Tekton还提供了:

  • Tekton CLI 命令行工具可以更加快捷和针对性的现实tekton的运行状态;
  • Tekton Dashboard 可以图形化界面的形式查看运行状态和结果;
  • Tekton Trigger 提供了web api可以进行基本的触发。

实现原理

Tekton 是基于CRD(Custom Resource Definitions)实现的,是标准的k8s扩展机制。Tekton 有四个基本的对象 Task、TaskRun、Pipeline、PipelineRun ,下图是Tekton Dashboard 的界面,可以直观的感受一下 这几个对象。

如下图所示, Pipeline 实例化为 Pipeline Run,Pipeline Run 创建并管理 Pod,一个 Pod 对应 Task 的实例 Task Run,Task Run / Task 中的 step 对应 Pod 中的 container,除此Pod通常会共享一个 PersistentVolume 支持的临时文件系统。

参考: 产品路线图 https://github.com/orgs/tektoncd/projects/26

  • Task 构建任务,是 Tekton 中不可分割的最小单位,正如同 Pod 在 Kubernetes 中的概念一样。在 Task 中,可以有多个 Step,每个 Step 由一个 Container 来执行。
  • Pipeline 由一个或多个 Task 组成。在 Pipeline 中,用户可以定义这些 Task 的执行顺序以及依赖关系来组成 DAG(有向无环图)。
  • Pipeline Run 是 Pipeline 的实际执行产物,当用户定义好 Pipeline 后,可以通过创建 PipelineRun 的方式来执行流水线,并生成一条流水线记录。
  • Task Run PipelineRun 被创建出来后,会对应 Pipeline 里面的 Task 创建各自的 TaskRun。一个 TaskRun 控制一个 Pod,Task 中的 Step 对应 Pod 中的 Container。当然,TaskRun 也可以单独被创建。

引用:https://cloud.tencent.com/developer/article/1803399

CLI

https://tekton.dev/docs/cli/

Tekton Trigger

可以通过http接口的形式触发Tekton流水线,包括三个主要组件,设置有点繁琐,如果是所有人都需要配置会疯掉。

  • EventListner 监听http请求的发起
  • TriggerTemplate 配置Pipeline Run
  • TriggerBinding 从http的request body中获取数据传递给Pipeline Run

参考:https://tekton.dev/docs/getting-started/triggers/

Tekton Dashboard

后端的接口会转发到k8s的api

参考:https://tekton.dev/docs/dashboard/install/

源码:https://github.com/tektoncd/dashboard

实践

以下yaml文件均存储于 https://github.com/smallidea/tekton-test

部署

以 linux / mac 为例

# docker & docker-compose install
curl -o- https://smartidedl.blob.core.chinacloudapi.cn/docker/linux/docker-install.sh | bash # Kubectl install
curl -LO https://smartidedl.blob.core.chinacloudapi.cn/kubectl/v1.23.0/bin/linux/amd64/kubectl
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl # minikube install,参考 https://minikube.sigs.k8s.io/docs/start/
curl -LO https://smartidedl.blob.core.chinacloudapi.cn/minikube/v1.24.0/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikub
minikube delete
minikube start --image-mirror-country=cn --driver=docker --cpus=2 --memory=2048mb # Tekton Pipeline & Dashboard install
kubectl apply -f https://gitee.com/chileeb/SmartIDE/raw/main/server/deployment/online/pipeline/v0.32.0/smartide-tekton-release.yaml
kubectl apply -f https://gitee.com/chileeb/SmartIDE/raw/main/server/deployment/online/dashboard/v0.32.0/smartide-tekton-dashboard-release.yaml # Tekton Trigger install (选装)
kubectl apply -f https://gitee.com/chileeb/SmartIDE/raw/main/server/deployment/online/trigger/v0.18.0/smartide-release.yaml
kubectl apply -f https://gitee.com/chileeb/SmartIDE/raw/main/server/deployment/online/trigger/v0.18.0/smartide-interceptor.yaml # Tekton CLI, https://tekton.dev/docs/cli/
brew install tektoncd-cli

参考:SmartIDE (https://smartide.cn/zh/)的私有化部署脚本

国内网络一键安装

curl -o- https://gitee.com/chileeb/SmartIDE/raw/main/server/deployment/online/deployment_cn.sh | bash

国际网络一键安装

curl -o- https://gitee.com/chileeb/SmartIDE/raw/main/server/deployment/online/deployment.sh | bash

示例

1. yaml

task.yaml

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: tekton-task-test
spec:
description: >-
This Task is test task to test Tekton. params:
- name: USERNAME
description: your name
type: string
default: steps:
- name: step-01
image: ubuntu
script: |
#!/bin/bash
echo "Hello World!" - name: step-02
image: ubuntu
script: |
#!/bin/bash
echo "I'm $(params.USERNAME)"

pipeline.yaml

apiVersion: tekton.dev/v1beta1
kind: Pipeline metadata:
name: tekton-pipeline-test spec:
params:
- name: FIRST_NAME
description: Your first name
type: string
default: "jason"
- name: LAST_NAME
description: Your last name
type: string
default: "chen" tasks:
- name: task-001
taskRef:
name: tekton-task-test
params:
- name: USERNAME
value: $(params.FIRST_NAME) - name: task-002
runAfter:
- task-001
taskRef:
name: tekton-task-test
params:
- name: USERNAME
value: $(params.LAST_NAME)

pipeline_run.yaml

apiVersion: tekton.dev/v1beta1
kind: PipelineRun metadata:
name: tekton-pipeline-test-run-003 spec:
pipelineRef:
name: tekton-pipeline-test
params:
- name: FIRST_NAME
value: "Jason"
- name: LAST_NAME
value: "Chen"

2. Pipeline Run

# apply
kubectl apply -f task.yaml
kubectl apply -f pipeline.yaml
kubectl apply -f pipeline-run.yaml # 通过 Tekton CLI 查看运行结果
tkn pipelinerun logs tekton-pipeline-test-run-003 -f -n default



通过 Dashboard 查看运行结果

3. Tekton Trigger

trigger.yaml

apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerBinding
metadata:
name: pipeline-binding-test
spec:
params:
- name: FIRST_NAME
value: $(body.FIRST_NAME)
- name: LAST_NAME
value: $(body.LAST_NAME) --- apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
metadata:
name: trigger-listener-test
spec:
serviceAccountName: tekton-triggers-test-sa
triggers:
- name: trigger-test
bindings:
- ref: pipeline-binding-test
template:
ref: tekton-pipeline-test --- apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
name: pipeline-template-test
spec:
params:
- name: FIRST_NAME
default:
- name: LAST_NAME
default: resourcetemplates:
- apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
generateName: tekton-pipeline-test-run-
spec:
pipelineRef:
name: tekton-pipeline-test
params:
- name: FIRST_NAME
value: $(tt.params.FIRST_NAME)
- name: LAST_NAME
value: $(tt.params.LAST_NAME) --- apiVersion: v1
kind: ServiceAccount
metadata:
name: tekton-triggers-test-sa --- apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: tekton-triggers-test-eventlistener-binding
subjects:
- kind: ServiceAccount
name: tekton-triggers-test-sa
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: tekton-triggers-eventlistener-roles --- apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: tekton-triggers-test-eventlistener-clusterbinding
subjects:
- kind: ServiceAccount
name: tekton-triggers-test-sa
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: tekton-triggers-eventlistener-clusterroles
# apply
kubectl apply -f trigger.yaml
# 端口尽量不要使用常用的,避免冲突;如果是多个pipeline的trigger,记得端口保持唯一。
# Tekton Listener 对应service的名称,一般是 el-<tekton listener name>
kubectl port-forward service/el-trigger-listener-test 9091:8080 --address 0.0.0.0 & # 使用curl命令触发
curl -v \
-H 'content-Type: application/json' \
-d '{"FIRST_NAME": "Tekton", "LAST_NAME": "CD"}' \
http://localhost:9091

Tekton 设计简介 及 实践的更多相关文章

  1. Prometheus Metrics 设计的最佳实践和应用实例,看这篇够了!

    Prometheus 是一个开源的监控解决方案,部署简单易使用,难点在于如何设计符合特定需求的 Metrics 去全面高效地反映系统实时状态,以助力故障问题的发现与定位.本文即基于最佳实践的 Metr ...

  2. 基于 Angularjs&Node.js 云编辑器架构设计及开发实践

    基于 Angularjs&Node.js 云编辑器架构设计及开发实践 一.产品背景 二.总体架构 1. 前端架构 a.前端层次 b.核心基础模块设计 c.业务模块设计 2. Node.js端设 ...

  3. RESTful接口设计原则/最佳实践(学习笔记)

    RESTful接口设计原则/最佳实践(学习笔记) 原文地址:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api 1 ...

  4. atitit. 日志系统的原则and设计and最佳实践(1)-----原理理论总结.

    atitit. 日志系统的原则and设计and最佳实践总结. 1. 日志系统是一种不可或缺的单元测试,跟踪调试工具 1 2. 日志系统框架通常应当包括如下基本特性 1 1. 所输出的日志拥有自己的分类 ...

  5. PHP实现微信随机红包算法和微信红包的架构设计简介

    微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...

  6. 【Dubbo 源码解析】01_Dubbo 设计简介

    Dubbo 设计简介 Dubbo 采用 Microkernel + Plugin (微内核 + 插件)模式,Microkernel 只负责组装 Plugin,Dubbo 自身的功能也是通过扩展点实现的 ...

  7. lucene 简介和实践 分享

    之前项目做了搜索的改造,使用lucene,公司内做了相关的技术分享,故先整理下ppt内容,后面会再把项目中的具体做法进行介绍 lucene 简介和实践  分享 搜索改造项目

  8. PHP实现微信红包算法和微信红包的架构设计简介

    微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...

  9. Vue项目架构设计与工程化实践

    摘自Berwin<Vue项目架构设计与工程化实践>github.com/berwin/Blog/issues/14 1.Vue依赖套件 vuex:项目复杂后,用vuex来管理状态 elem ...

  10. 微观SOA:服务设计原则及其实践方式

    大 量互联网公司都在拥抱SOA和服务化,但业界对SOA的很多讨论都比较偏向高大上.本文试图从稍微不同的角度,以相对接地气的方式来讨论SOA, 集中讨论SOA在微观实践层面中的缘起.本质和具体操作方式, ...

随机推荐

  1. 【设计模式】Java设计模式 - 模板模式

    Java设计模式 - 模板模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  2. 在Winform开发中,我们使用的几种下拉列表展示字典数据的方式

    在Winform开发中中,我们为了方便客户选择,往往使用系统的字典数据选择,毕竟选择总比输入来的快捷.统一,一般我们都会简单封装一下,以便方便对控件的字典值进行展示处理,本篇随笔介绍DevExpres ...

  3. 【BotR】CLR类型系统

    .NET运行时之书(Book of the Runtime,简称BotR)是一系列描述.NET运行时的文档,2007年左右在微软内部创建,最初目的是为了帮助其新员工快速上手.NET运行时:随着.NET ...

  4. 使用调度器apscheduler实现py文件不停连接MySQL数据库

    背景说明: 使用内网负载均衡添加后端主机,该主机安装有nginx,其配置文件代理内网的MySQL数据库地址 (数据库是主备形式的,重启的话会都重启) 需要测试两个目标: (采用不停往MySQL里写数据 ...

  5. 基于CentOS 8服务器来搭建FastDFS高可用集群环境

    服务器版本 我们在服务器的命令行输入如下命令来查看服务器的内核版本. [root@localhost lib]# cat /etc/redhat-release CentOS Linux releas ...

  6. sql 中HAVING函数

    select * from <表名> group by<过滤的数据> having <晒选的列名>=<条件> 例 select * from villa ...

  7. IDEA上关于 jstl导包的问题

    IDEA上关于 jstl的问题 在 IDEA上使用 maven创建 web骨架项目,在 pom文件中添加 jstl依赖 <dependency> <groupId>jstl&l ...

  8. IDEAidea导入Scala包

    IDEAidea导入Scala包 一.配置windows的scala的环境变量 二.IDEA导入scala插件 1.如图步骤导入IDEA的scala插件 三.添加本地的scala目录 这时候我们应该在 ...

  9. 第二阶段:高级核心基础知识·第4章shell特性·2

    1.统计日志,日志内容 39.96.187.239 - - [11/Nov/2019:10:08:01 +0800] "GET / HTTP/1.1" 302 0 "-& ...

  10. Sublime Text4(Build 4126) 安装备忘

    Sublime Text4(Build 4126) 安装备忘 sublime text 4126 PJ已测可用 打开浏览器进入网站https://hexed.it 打开sublime text4安装目 ...