雲原生強大且靈活的持續集成CI開源框架Tekton實戰-上

@

概述

定義

Tekton 官網地址 //tekton.dev/

Tekton 最新官網文檔 //tekton.dev/docs/

Tekton GitHub源碼地址 //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 "//storage.googleapis.com/kubernetes-release/release/v1.18.8/bin/linux/amd64/kubectl"
    chmod 777 kubectl 
    mv kubectl /usr/local/bin
    # 安裝minikube
    curl -LO //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=//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 \
//storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
  • 修改鏡像地址方式
# 創建資源時,pull 鏡像用的鏡像庫是國外的,gcr.io 需要替換成中國的鏡像源:gcr.azk8s.cn;如果使用原來的gcr.io , 資源創建成功後在啟動的過程中,pod狀態一直是 imagepullbackoff , 查看pod 內部,是無法pull 鏡像所致。
# 官方提供release.yaml中需要的鏡像是從Google雲拉取的,中國的環境可能拉不到鏡像
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 //storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
%s/gcr.io/gcr.azk8s.cn/g
#重新創建資源
kubectl apply -f release.yaml
  • 阿里雲資源方式
# 上面的都還是有問題,最後可以使用阿里雲的資源,這一個可以成功的創建
kubectl apply -f //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 //storage.googleapis.com/tekton-releases/dashboard/latest/tekton-dashboard-release.yaml
  • 阿里雲資源方式
# 安裝一個 Tekton 提供的一個 Dashboard,我們可以通過 Dashboard 查看 Tekton 整個任務的構建過程,直接執行下面的命令直接安裝即可
kubectl apply -f //my-oss-testing.oss-cn-beijing.aliyuncs.com/k8s/tekton/dashboard.yaml

安裝完後,可以查看其svc資源,類型為NodePort,暴露30952埠

image-20221004162338138

訪問//tekton.com:30952/ ,這裡我是作為host解析,所以可以域名訪問

image-20221004162732082

安裝Cli

# 下載rpm或者二進位包
wget //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