雲原生下的CICD


去年9月份,我們打算做自己的容器雲,為了方便用戶使用,我們需要結合自己公司特性去改造。容器雲離不開的ci模塊,在ci這塊我們選擇了用tekton作為我們的ci模塊。

tekton的介紹

Tekton 是一個強大而靈活的 Kubernetes 原生開源框架,可用於創建持續集成和交付 (CI/CD) 系統。該框架可讓您跨多個雲服務商或本地系統進行構建、測試和部署,無需操心基礎實現細節。

為什么選擇tekton,作為我們的ci呢?

雲原生

  • 跑在Kubernetes上面
  • 使用容器作為他的構建塊
  • 提供Kubernetes聲明式資源的pipeline

靈活

  • 一條pipeline可以部署到任意的Kubernetes集群中
  • 組成pipeline的task可以任意組成
  • git資源和image資源的自由組裝
  • Tekton 賦予您充分的靈活性,您可以使用自己偏好的 CI/CD 工具創建功能強大的流水線。Tekton 讓您無需操心基礎實現,只需根據團隊的要求選擇構建、測試和部署工作流即可。

輕量

  • 基於operator的方式編排你的pipeline

資源限制

  • 多租戶場景,資源的控制。

多環境運行

  • 可讓您跨多個環境(例如虛擬機、無服務器、Kubernetes 或 Firebase 環境)進行構建、測試和部署。您還可以使用 Tekton 流水線跨多個雲服務商或混合環境進行部署

tekton的資源介紹

PipelineResource 資源簡介

PipelineResource 是 pipeline 中的一組對象,這些對象可以用於 task 的 input(輸入)和 outoput( 輸出),Pipeline-resoure 目前支持兩種類型(git 和 image), 一個 task(任務)可以有一個或者多個 input(輸入)和 output(輸出)。

舉個栗子:

  • 一個 task 的 input 可以是一個 github/gitlab/gitea 地址。
  • 一個 task 的 output 可以是一個 image(鏡像)。
  • 一個 task 的 output 可以輸出一個 jar 包,golang 的二進制文件,dotnet 的二進制文件,rust 的二進制執行程序等。

Task 資源簡介

一個 task 代表這一次任務,task 里面可以配置多個 step(多個步驟)。step 按照你配置的順序執行。一個做完才到下一個,如果一個 step 出現了錯誤,后面的步驟將不會執行。也沒必要執行。

pipeline 資源簡介

一個 pipeline 可以包含多個 task,定義你的執行順序,按照你的 task 的順序執行 task,也可以支持並行 task。

舉個栗子:

        |            |
        v            v
     test-app    lint-repo
    /        \
   v          v
build-app  build-frontend
   \          /
    v        v
    deploy-all

為了更生動形象的表示 用 golang 為代碼表示為如下:

func task1(inputs,outputs Resource) {}
func task2(inputs,outputs Resource) {}
func task3(inputs,outputs Resource) {}
func pipeline(inputs,outputs Resource){
    task1(inputs,outputs);
    task2(inputs,outputs);
    task3(inputs,outputs);
}

func pipeineRun(){
    var inputs,outputs Resource
    inputs="git"
    outputs="image"
    pipeline(inputs,outputs)
}

func main(){
    pipeineRun()
}

PipelineRun 資源簡介

一個 pipelierun 允許你指定並執行你定義的 pipeline,並且按照你 pipeline 定義的任務按順序執行。

以上定義了這么多資源,是為了更好的抽象,更好的復用,更好的職責分離。

我們是怎么集成的呢?

我們的隔離顆粒度是以部門為單位,每個部門下人只能看見他們部門的ci構建,部門與部門之間相互隔離,部門按照namespaces划分。每個部門的ci資源的限制等。

image

為了方便用戶操作,我們給用戶一個大的graph,讓用戶盡情的發揮,動態的增加node(任務),編排自己的pipeline。


pipeline-run

在pipelinerun模塊上上可以按到自己的任務構建的狀態。

任務跑成功后的狀態。

日志顯示方式。

整體的pipeline的跑的狀態,包括創建時間,耗時等。

上面我省略了git倉儲和鏡像倉儲的配置,還有pipeline的配置,正式這些復雜的配置有了我們后續的優化方式。

說下缺點:

  1. 繁瑣的配置,對普通開發不能快速上手。
  2. 不支持trigger操作。
  3. 不支持多語言的模板。
  4. 構建成功失敗,不能夠通知用戶。
  5. 不支持概覽
  6. 不支持某個task的暫停功能。

針對以上缺點,說下思路是如何去優化。

  1. 每個任務下需要配置繁瑣的step。就是類似kaniko構建就需要很多的配置了,針對step做一個step的crd資源,復用step操作。支持用戶的step編輯step,上傳step模板到倉儲里面。

  2. devOps工程師提供多語言task的最佳實踐模板,用戶直接fork一份task對自己的業務任務進行改造,並且編排。

  3. 封裝一CRD編排以上五種資源,傳入一些對應的params(包括 git和image)整個pipeline啟動。用戶不關新task和resource和pipelin的編排。

  4. 支持gitOps和chatOps。

  5. pipeline的構建成功和失敗,可以通過informer的形式,watch其pipelinerun資源的成功和失敗的實踐。作出響應的通知。

  6. tekton支持了prometheus的收集。根據你需要支持的緯度進行支持即可。

總結: CI的道路上任重而道遠,目前這塊還是比較多毛刺,需要時間的磨合,也需要更多用戶的反饋,貼切用戶的使用,才能作出更好的產品,共勉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM