9

云原生强大且灵活的持续集成CI开源框架Tekton实战-上 - itxiaoshen

 1 year ago
source link: https://www.cnblogs.com/itxiaoshen/p/16754413.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Tekton 官网地址 https://tekton.dev/

Tekton 最新官网文档 https://tekton.dev/docs/

Tekton GitHub源码地址 https://github.com/tektoncd

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

Tekton是构建CI/CD系统的本地云解决方案。它由提供构建块的Tekton pipeline和支持组件组成,如Tekton CLI和Tekton Catalog,使Tekton成为一个完整的生态系统;Tekton也是CD基金会(一个Linux基金会项目)的一部分;以yaml文件编排应用构建及部署流程,是一个纯云原生的标准化CICD流水线构建、测试和部署流程的工具。

常见CICD工具

image-20221004202340320
  • 可定制的:Tekton实体是完全可定制的,从而具有高度的灵活性。平台工程师可以定义非常详细的构建基目录,以供开发人员在各种情况下使用。
  • 可重复使用的:Tekton实体是完全可移植的,因此一旦定义,组织内的任何人都可以使用给定的管道并重用其构造块。这使开发人员可以快速构建复杂的管道,而无需“重新发明轮子”。
  • 可扩展的:Tekton Catalog是Tekton社区驱动的存储库。您可以使用Tekton目录中的预制组件快速创建新的并展开现有管道。
  • 标准化:Tekton在您的Kubernetes集群上作为扩展安装并运行,并使用完善的Kubernetes资源模型。 Tekton工作负载在Kubernetes容器中执行。
  • 缩放性:为了增加工作负载容量,您可以简单地将节点添加到群集。 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 最重要的五个概念:Task、TaskRun、Pipeline、PipelineRun、PipelineResources:

  • Task:Tekton中的最小单元,代表一个任务模板,包括多个步骤。每一个操作定义为Task中的一个step
  • Pipeline:多个 Task 组成的有向无环图,定义了流水线的模板
  • PipelineRun:Pipeline 真正执行时需要定义一个PipelineRun,作为流水线的实例,生成一条流水线记录
  • TaskRun:Task 真正执行的实例,记录任务状态。一个TaskRun 会创建一个对应的 Pod,每个 step 对应 pod 中的一个 container
  • PipelineResource:流水线执行过程中需要的资源信息
image-20221004115832087

每个任务在它自己的Kubernetes Pod中执行。因此,默认情况下,Pipeline中的任务不共享数据。要在任务之间共享数据,必须显式地配置每个任务,使其输出可用于下一个任务,并将先前执行的任务的输出作为其输入。

  • 安装kubectl

  • 安装K8S集群

    • minikube部署用于开发测试的K8S集群。
    # 先要安装docker,然后安装kubectl
    wget "https://storage.googleapis.com/kubernetes-release/release/v1.18.8/bin/linux/amd64/kubectl"
    chmod 777 kubectl 
    mv kubectl /usr/local/bin
    # 安装minikube
    curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
    install minikube-linux-amd64 /usr/local/bin/minikube
    minikube start
    # 创建新用户,这步不是必要
    adduser K8S  //创建K8S用户
    passwd K8S  //设置密码asdfwsxedc
    # 将创建的新用户加入到docker组中,,这步不是必要
    groupadd mydocker
    gpasswd -a K8S mydocker  //$USER为上面创建的K8S用户
    newgrp mydocker
    docker version
    # 启动minikube
    minikube start 
    # 卸载minikube
    minikube delete
    #也可以使用--registry-mirror=https://registry.docker-cn.com, running minikube within a VM, consider using --driver=none,--image-mirror-country='cn'
    minikube start --force --driver=docker 
    
    • Kubekey部署单节点K8S集群,详细可以参考前面的文章《云原生下基于K8S声明式GitOps持续部署工具ArgoCD实战-上》
    image-20221004145544760

安装Tekton Pipelines

  • 官方部署方式
# 使用kubectl安装最新版本的Tekton pipeline
kubectl apply --filename \
https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
  • 修改镜像地址方式
# 创建资源时,pull 镜像用的镜像库是国外的,gcr.io 需要替换成国内的镜像源:gcr.azk8s.cn;如果使用原来的gcr.io , 资源创建成功后在启动的过程中,pod状态一直是 imagepullbackoff , 查看pod 内部,是无法pull 镜像所致。
# 官方提供release.yaml中需要的镜像是从谷歌云拉取的,国内的环境可能拉不到镜像
kubectl get pods --namespace tekton-pipelines --watch
kubectl get pods --namespace describe pod <pod-id>
kubectl --namespace tekton-pipelines describe pods
# 创建目录
mkdir tekton
# 下载yaml 文件,注意如果因为我们下面要替换的国内源不是即时更新的,有一个同步时间差,如果下载latest release 可能会遇到下载到昨天发布的最新版本,而使用国内源时会出现找不到最新镜像ID. 所以在更新之前可以在官网看一下最新版本是不是昨天才更新的版本,如果是建议选上一个版本,如果latest 是几天之前的,则没有问题。
#修改yaml 里面的镜像库
vi release.yaml
wget https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
%s/gcr.io/gcr.azk8s.cn/g
#重新创建资源
kubectl apply -f release.yaml
  • 阿里云资源方式
# 上面的都还是有问题,最后可以使用阿里云的资源,这一个可以成功的创建
kubectl apply -f http://my-oss-testing.oss-cn-beijing.aliyuncs.com/k8s/tekton/release.yaml
kubectl get pods -n tekton-pipelines

安装完后后,可以看到在Kubernetes集群中新增了哪些Tekton的crd

image-20221004160401057
image-20221004155746777

创建并运行任务

创建并运行一个基本任务,Task在API中表示为Task类对象,它定义了一系列按顺序运行的步骤,以执行Task所需的逻辑。每个Task都作为一个pod在Kubernetes集群上运行,每个步骤都在自己的容器中运行。创建vi hello-world.yaml

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: hello
spec:
  steps:
    - name: echo
      image: alpine
      script: |
        #!/bin/sh
        echo "Hello World,itxs"  
        
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: hello
spec:
  steps:
    - name: echo        
      image: ubuntu # contains bash
      script: |
        #!/usr/bin/env bash
        echo "Hello World,itxs"              

应用到集群的更改

kubectl apply --filename hello-world.yaml

要运行此Task,必须使用TaskRun实例化它。创建另一个名为hello-task-run的文件Yaml,内容如下:

apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
  name: hello-task-run
spec:
  taskRef:
    name: hello

将更改应用到集群以启动任务

kubectl apply --filename hello-task-run.yaml
# 验证运行是否正常
kubectl get taskrun hello-task-run
# 查看容器运行日志
kubectl logs --selector=tekton.dev/taskRun=hello-task-run
image-20221004161301339

安装Dashboard

  • 官方部署方式
kubectl apply --filename https://storage.googleapis.com/tekton-releases/dashboard/latest/tekton-dashboard-release.yaml
  • 阿里云资源方式
# 安装一个 Tekton 提供的一个 Dashboard,我们可以通过 Dashboard 查看 Tekton 整个任务的构建过程,直接执行下面的命令直接安装即可
kubectl apply -f http://my-oss-testing.oss-cn-beijing.aliyuncs.com/k8s/tekton/dashboard.yaml

安装完后,可以查看其svc资源,类型为NodePort,暴露30952端口

image-20221004162338138

访问http://tekton.com:30952/ ,这里我是作为host解析,所以可以域名访问

image-20221004162732082

安装Cli

# 下载rpm或者二进制包
wget https://github.com/tektoncd/cli/releases/download/v0.26.0/tektoncd-cli-0.26.0_Linux-64bit.rpm
# rpm安装
rpm -Uvh tektoncd-cli-0.26.0_Linux-64bit.rpm
tkn task list
tkn --help
image-20221004161632457

Pipelines示例演示

演示步骤如下

  • 创建两个任务。其中一个任务用2.3节的任务
  • 创建一个包含任务的管道。
  • 使用PipelineRun实例化并运行包含任务的管道。

创建goodbye-world.yaml

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: goodbye
spec:
  steps:
    - name: goodbye
      image: alpine
      script: |
        #!/bin/sh
        echo "Goodbye World,itxs" 
# 应用第二个任务
kubectl apply --filename goodbye-world.yaml
# 管道定义了一个按特定执行顺序排列的有序任务系列,作为CI/CD工作流的一部分,创建管道包含前面两个任务
vi 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 --filename hello-goodbye-pipeline.yaml
# 用PipelineRun对象实例化你的Pipeline。创建一个名为hello-goodbye-pipeline-run的新文件。Yaml,内容如下
vi hello-goodbye-pipeline-run.yaml
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
  name: hello-goodbye-run
spec:
  pipelineRef:
    name: hello-goodbye
# 通过将PipelineRun配置应用到集群来启动Pipeline:
kubectl apply --filename hello-goodbye-pipeline-run.yaml
# 使用如下命令查看PipelineRun的日志:
tkn pipelinerun logs hello-goodbye-run -f -n default

后续再补充基于Tekton的CI结合ArgoCD的CD实现完美新一代云原生组合

**本人博客网站 **IT小神 www.itxiaoshen.com


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK