Tekton入门介绍

概述

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:流水线执行过程中需要的资源信息

Tekton重要概念

安装

安装过程中会用到 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
  ...
复制代码