概述
Tekton 是一个强大、灵活的构建 CI/CD 流水线系统的开源框架,允许开发者构建、测试和发布应用。Tekton 是云原生的,通过定义 CRD ,让用户快速灵活定义流水线。
使用 tekton 的好处
- 可定制的:Tekton实体是完全可定制的,从而具有高度的灵活性。平台工程师可以定义非常详细的构建基目录,以供开发人员在各种情况下使用
- 可重复使用的:Tekton实体是完全可移植的,因此一旦定义,组织内的任何人都可以使用给定的管道并重用其构造块。这使开发人员可以快速构建复杂的管道,而无需“重新发明轮子”。
- 可扩展的:Tekton Catalog是Tekton社区驱动的存储库。您可以使用Tekton目录中的预制组件快速创建新的并展开现有管道。
- 标准化:Tekton在您的Kubernetes集群上作为扩展安装并运行,并使用完善的Kubernetes资源模型。 Tekton工作负载在Kubernetes容器中执行。
- 缩放性:为了增加工作负载容量,您可以简单地将节点添加到群集。 Tekton与您的群集进行缩放,无需重新定义您的资源分配或对管道的任何其他修改
Tekton 中的组件
- Tekton Pipelines:tekton 的基础,定义了一组 CRD,用于定义 pipeline
- Tekton Triggers:允许基于 event 实例化 pipeline。比如:git的pr请求
- Tekton Cli:提供命令行工具和 tekton 交互
- Tekton Dashboard:图形化界面展示 pipeline 信息
- Tekton Catalog:高质量的、社区贡献的 pipeline 仓库
- Tekton Hub:图形化界面访问 tekton catalog
- Tekton Operator:在k8s上安装、移除、更新tekton组件的项目
如无特殊说明,后文提到的Tekton专指 Tekton Pipeline 组件
基本概念
Tekton 最重要的五个概念:Task、TaskRun、Pipeline、PipelineRun、PipelineResources
- Task:Tekton中的最小单元,代表一个任务模板,包括多个步骤。每一个操作定义为Task中的一个step
- Pipeline:多个 Task 组成的有向无环图,定义了流水线的模板
- PipelineRun:Pipeline 真正执行时需要定义一个PipelineRun,作为流水线的实例,生成一条流水线记录
- TaskRun:Task 真正执行的实例,记录任务状态。一个TaskRun 会创建一个对应的 Pod,每个 step 对应 pod 中的一个 container
- PipelineResource:流水线执行过程中需要的资源信息
安装
安装过程中会用到 gcr.io 上的镜像,需要配置docker代理。以centos7为例
mkdir /etc/systemd/system/docker.service.d cat <<EOF > /etc/systemd/system/docker.service.d/http-proxy.conf [Service] [Service] Environment="HTTP_PROXY=http://192.168.0.119:3128" Environment="HTTPS_PROXY=http://192.168.0.119:3128" Environment="NO_PROXY=localhost,127.0.0.1,localaddress,.localdomain.com" EOF systemctl daemon-reload && systemctl restart docker 复制代码
前置条件:
- k8s 集群版本 >= 1.15
- 启动集群 RBAC
- 授予当前用户 cluster-admin 角色
安装控制器
kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
复制代码
配置存储
kubectl create configmap config-artifact-pvc \
--from-literal=size=10Gi \
--from-literal=storageClassName=rook-ceph-block \
-o yaml -n tekton-pipelines \
--dry-run=client | kubectl replace -f -
复制代码
安装dashboard
kubectl apply --filename https://github.com/tektoncd/dashboard/releases/latest/download/tekton-dashboard-release.yaml
复制代码
配置ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tekton-dashboard
namespace: tekton-pipelines
spec:
rules:
- host: tekton.demo.com
http:
paths:
- backend:
serviceName: tekton-dashboard
servicePort: 9097
复制代码
kubectl apply -f ingress.yaml -n tekton-pipelines
复制代码
校验
kubectl get pods --namespace tekton-pipelines
复制代码
Dashboard 页面
HelloWorld
该示例执行一个命令行输出 Hello World
定义Task
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: hello
spec:
steps:
- name: hello
image: ubuntu
command:
- echo
args:
- "Hello World!"
复制代码
执行task
# 执行
➜ helloworld sudo kubectl apply -f task.yaml
Password:
task.tekton.dev/hello created
# 查看
➜ helloworld sudo kubectl get task
NAME AGE
hello 65s
复制代码
定义TaskRun
为了在tekton中运行前面的Task,需要定义一个TaskRun
apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
generateName: hello-run-
spec:
taskRef:
name: hello
复制代码
TaskRun的metadata中定义了generateName,意思是每次创建时自动生成以generateName为前缀的名称。
这时候执行必须使用 kubectl create,使用 kubectl apply 会报错
# 使用 kubectl apply 会报错
➜ sudo kubectl apply -f taskrun.yaml
error: from hello-run-: cannot use generate name with apply
# 使用 kubectl create 执行
➜ sudo kubectl create -f taskrun.yaml
taskrun.tekton.dev/hello-run-8lkcl created
# 查看 taskrun
➜ sudo kubectl get taskrun
NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME
hello-run-8lkcl True Succeeded 2m25s 2m11s
复制代码
查看执行结果
查看任务对应的 Pod
TaskRun 自动拉起一个 Pod,且成功执行完毕,状态是 Completed
NAME READY STATUS RESTARTS AGE
ast-slave-test 1/1 Running 0 2d5h
hello-run-8lkcl-pod-pdrv9 0/1 Completed 0 5m38s
复制代码
查看pod的日志文件
➜ sudo kubectl logs hello-run-8lkcl-pod-pdrv9
Hello World!
复制代码
查看pod的编排文件:pod中定义的 container 中指定了执行的命令 echo hello World
# kubectl get pod hello-run-8lkcl-pod-pdrv9 -oyaml
apiVersion: v1
kind: Pod
metadata:
...
name: hello-run-8lkcl-pod-pdrv9
namespace: default
spec:
containers:
- args:
- -wait_file
- /tekton/downward/ready
- -wait_file_content
- -post_file
- /tekton/tools/0
- -termination_path
- /tekton/termination
- -entrypoint
- echo
- --
- Hello World!
command:
- /tekton/tools/entrypoint
env:
- name: HOME
value: /tekton/home
image: ubuntu
imagePullPolicy: Always
name: step-hello
...
initContainers:
- command:
- /ko-app/entrypoint
- cp
- /ko-app/entrypoint
- /tekton/tools/entrypoint
image: gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/entrypoint:v0.23.0@sha256:5489d6a444ff63b14d94dead8cc10b221ec147cd817b18254dbf28f3d70f4fa5
imagePullPolicy: IfNotPresent
name: place-tools
...
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END