Tekton初体验

前言

  • 简介

    1
    2
    Tekton是一个强大、灵活的构建CI/CD流水线系统的开源框架,允许开发者构建、测试和发布应用。
    Tekton是云原生的,通过CRD让用户快速灵活定义流水线。
  • 使用tekton的好处

    1
    2
    3
    4
    5
    可定制:tekton实体是完全可定制的,从而具有高度的灵活性。
    可重复使用:tekton实体完全可移植,因此一旦定义组织内任何人都可以使用给定的管道并重用其构造块。快速构建复杂的管道而无需重新造轮子。
    可扩展:可使用tekton目录中的预制组件快色创建新的并展开现有管道。
    标准化:tekton在k8s集群中作为扩展安装并运行。
    缩放性:与集群进行缩放,无需重新定义资源分配或对管道的任何其他修改。
  • 组件

    1
    2
    3
    4
    5
    6
    7
    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组件
  • 基本概念

1
2
3
4
5
6
7
Tekton最重要的五个概念:Task、TaskRun、Pipeline、PipelineRun、PipelineResource

Task: tekton中的最小单元,代表一个任务模版,包含多个步骤。每个操作定义为task中的一个step
Pipeline: 多个task组成的有向无环图,定义了流水线的模版
PipelineRun: pipeline真正执行时需要定义一个pipelineRun作为流水线的实例,生成一条流水线记录
TaskRun: task真正执行的实例,记录任务状态
PipelineResource: 流水线执行过程中需要的资源信息。

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 官方文档
https://tekton.dev/docs/installation/pipelines/

# 能访问国外网,如gcr.io
kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml


# 查看安装的资源
[root@master ~]# kubectl get pod -n tekton-pipelines-resolvers
NAME READY STATUS RESTARTS AGE
tekton-pipelines-remote-resolvers-5b6d9f9d55-gqst5 1/1 Running 0 11m
[root@master ~]# kubectl get pod -n tekton-pipelines
NAME READY STATUS RESTARTS AGE
tekton-pipelines-controller-6754f4c756-8t5gp 1/1 Running 0 11m
tekton-pipelines-webhook-649f49588-tztsk 1/1 Running 0 11m
[root@master ~]#
[root@master ~]# kubectl get crd | grep tekton
clustertasks.tekton.dev 2023-01-24T09:04:04Z
customruns.tekton.dev 2023-01-24T09:04:04Z
pipelineresources.tekton.dev 2023-01-24T09:04:04Z
pipelineruns.tekton.dev 2023-01-24T09:04:04Z
pipelines.tekton.dev 2023-01-24T09:04:04Z
resolutionrequests.resolution.tekton.dev 2023-01-24T09:04:04Z
runs.tekton.dev 2023-01-24T09:04:04Z
taskruns.tekton.dev 2023-01-24T09:04:04Z
tasks.tekton.dev 2023-01-24T09:04:04Z
verificationpolicies.tekton.dev 2023-01-24T09:04:04Z

安装Dashboard

  • yaml安装
1
2
3
4
5
6
7
8
9
kubectl apply --filename https://storage.googleapis.com/tekton-releases/dashboard/latest/release.yaml
# 这是默认安装只读权限的dashboard,安装读写权限使用 release-full.yaml

# 查看资源
[root@master ~]# kubectl get pod -n tekton-pipelines
NAME READY STATUS RESTARTS AGE
tekton-dashboard-664cb4fd64-54ww8 1/1 Running 0 110s
tekton-pipelines-controller-6754f4c756-8t5gp 1/1 Running 0 17m
tekton-pipelines-webhook-649f49588-tztsk 1/1 Running 0 17m
  • ingress暴露服务
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: tekon-dashboard
    namespace: tekton-pipelines
    spec:
    ingressClassName: liykingress
    rules:
    - host: tekton.key1024.cn
    http:
    paths:
    - backend:
    service:
    name: tekton-dashboard
    port:
    number: 9097
    path: /
    pathType: Prefix

创建任务

  • 创建简单task
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建个最简单task,使用alpine的镜像启动一个容器执行指定脚步
# hello-world.yaml 文件内容, 定义名称为 hello 的 task
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: hello
spec:
steps:
- name: echo
image: alpine
script: |
#!/bin/sh
echo "Hello World"

# 部署:kubectl apply -f hello-world.yaml
1
2
3
4
5
6
7
8
9
10
11
# 创建taskrun来执行hello这个task
#hello-world-run.yaml
apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
name: hello-task-run
spec:
taskRef:
name: hello

# 部署:kubectl apply -f hello-world-run.yaml
1
2
3
4
5
6
7
# 查看任务
[root@master task]# kubectl get task
NAME AGE
hello 3m52s
[root@master task]# kubectl get taskrun
NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME
hello-task-run True Succeeded 79s 26s

  • 创建pipeline调用task
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 创建名称goodbye的task
    # goodbye-world.yaml
    apiVersion: tekton.dev/v1beta1
    kind: Task
    metadata:
    name: goodbye
    spec:
    steps:
    - name: goodbye
    image: ubuntu
    script: |
    #!/bin/sh
    echo "Goodbye World!"
    # 部署:kubectl apply -f goodbye-world.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建并运行1个包含上述2个task的pipeline
#hello-goodbye-pipeline.yaml
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: hello-goodbye
spec:
tasks:
- name: hello
taskRef:
name: hello
- name: goodbye
runAfter:
- hello
taskRef:
name: goodbye
# 部署:kubectl apply -f hello-goodbye-pipeline.yaml
1
2
3
4
5
6
7
8
9
10
# 创建pipelineRun对象来实例化一个pipeline,即运行这个pipeline
#hello-goodbye-pipeline-run.yaml
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
name: hello-goodbye-run
spec:
pipelineRef:
name: hello-goodbye
# 部署:kubectl apply -f hello-goodbye-pipeline-run.yaml


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 上述文件合并一起
# multi-task-pipeline.yaml
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: hello
spec:
steps:
- name: echo
image: alpine
script: |
#!/usr/bin/env sh
echo "Hello World"
---
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: goodbye
spec:
steps:
- name: goodbye
image: ubuntu
script: |
#!/usr/bin/env sh
echo "Goodbye World!"
---
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: multiple-task-pipeline
spec:
tasks:
- name: hello
taskRef:
name: hello
- name: goodbye
runAfter:
- hello
taskRef:
name: goodbye

  • 简化task任务的pipeline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 上面定义的task比较累赘,可以在pipeline中内嵌定义task
# simple-multi-task-pipeline.yaml
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: simple-multi-task-pipeline
spec:
tasks:
- name: hello
taskSpec:
steps:
- image: alpine
script: |
#!/bin/sh
echo "Hello world!"

- name: goodbye
runAfter:
- hello
taskSpec:
steps:
- image: alpine
script: |
#!/bin/sh
echo "Goodbye world!"

# 执行可定义pipelineRun通过kubectl来执行;也可以在tekton dashboard上触发执行(需有读写权限的dashboard)
1
2
3
4
5
6
7
8
#simple-multi-task-pipeline-run.yaml
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
name: simple-multi-task-pipeline-run
spec:
pipelineRef:
name: simple-multi-task-pipeline
-------------本文结束感谢您的阅读-------------
原创技术分享,感谢您的支持。