去年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資源的限制等。
為了方便用戶操作,我們給用戶一個大的graph,讓用戶盡情的發揮,動態的增加node(任務),編排自己的pipeline。
在pipelinerun模塊上上可以按到自己的任務構建的狀態。
任務跑成功后的狀態。
日志顯示方式。
整體的pipeline的跑的狀態,包括創建時間,耗時等。
上面我省略了git倉儲和鏡像倉儲的配置,還有pipeline的配置,正式這些復雜的配置有了我們后續的優化方式。
說下缺點:
- 繁瑣的配置,對普通開發不能快速上手。
- 不支持trigger操作。
- 不支持多語言的模板。
- 構建成功失敗,不能夠通知用戶。
- 不支持概覽
- 不支持某個task的暫停功能。
針對以上缺點,說下思路是如何去優化。
-
每個任務下需要配置繁瑣的step。就是類似kaniko構建就需要很多的配置了,針對step做一個step的crd資源,復用step操作。支持用戶的step編輯step,上傳step模板到倉儲里面。
-
devOps工程師提供多語言task的最佳實踐模板,用戶直接fork一份task對自己的業務任務進行改造,並且編排。
-
封裝一CRD編排以上五種資源,傳入一些對應的params(包括 git和image)整個pipeline啟動。用戶不關新task和resource和pipelin的編排。
-
支持gitOps和chatOps。
-
pipeline的構建成功和失敗,可以通過informer的形式,watch其pipelinerun資源的成功和失敗的實踐。作出響應的通知。
-
tekton支持了prometheus的收集。根據你需要支持的緯度進行支持即可。
總結: CI的道路上任重而道遠,目前這塊還是比較多毛刺,需要時間的磨合,也需要更多用戶的反饋,貼切用戶的使用,才能作出更好的產品,共勉。