KNative原生 CI/CD 框架 Tekton 探祕

Tekton 是一個功能強大的 Kubernetes 原生開源工具,用於建立持續集成和交付系統。


經過抽象底層實現細節,用戶能夠跨多雲平臺和本地系統進行構建、測試和部署。java

Pipelines建立自定義資源做爲構建塊去聲明Pipelines。git

自定義資源是Kubernetes API的擴展,能夠建立自定義Kubernetes對象。 安裝自定義資源後,用戶可使用kubectl建立和訪問其對象,就像對pod,部署等內置資源同樣。 這些資源在集羣上運行,並由Kubernetes自定義資源定義(CRD)實施。

Tekton Pipeline中有5類對象,核心理念是經過定義yaml定義構建過程構建任務的狀態存放在status字段中。sql

其中5類對象分別是:PipelineResouce、Task、TaskRun、Pipeline、PipelineRun。docker

Task是單個任務的構建過程,須要經過定義TaskRun任務去運行Task。ubuntu

Pipeline包含多個Task,並在此基礎上定義input和output,以PipelineResource做爲交付。api

PipelineResource是可用於input和output的對象集合。數組

一樣地,須要定義PipelineRun纔會運行Pipeline。bash

下圖中的箭頭放下描述了從一種資源到另外一種資源的依賴。微信

關於Tekton的設計理念:app

  • Pipelines不知道什麼會觸發它們,它們能夠由事件或手動建立PipelineRun觸發;

  • Tasks能夠單獨存在,而且能夠徹底獨立於Pipelines調用。它們具備高內聚低耦合特色;

  • Tasks能夠取決於其餘Tasks建立的工件和參數;

  • Tasks能夠被TaskRuns調用;

  • PipelineResources是用做Tasks輸入和輸出的工件。

咱們這裏主要介紹下Task。

Task(或ClusterTask)是但願在連續集成流程中運行的順序步驟的集合。任務將在集羣上的pod內運行。

一個 Task 聲明包括:

  • Inputs

  • Outputs

  • Steps

Task的做用範圍是一個namespace,而ClusterTask的做用範圍是整個kubernetes 集羣。

語法

要爲Task資源定義配置文件,能夠指定如下字段:

  • 必寫:

    • steps - 指定要在Task中運行的一個或多個容器鏡像。

    • apiVersion- 指定 API 版本, 例如tekton.dev/v1alpha1.

    • kind- 指定 Task 資源對象.

    • metadata- 指定數據以惟一標識Task資源對象, 例如name.

    • spec- 爲Task資源對象指定配置信息。必須經過如下任一字段定義Task steps:

  • 可選:

    • inputs- 指定你Task須要用到的參數和 PipelineResources

    • outputs- 指定你Task 產生的 PipelineResources

    • volumes- 指定一個或多個要用於Tasksteps的 掛載卷.

    • stepTemplate- 指定容器 step 定義,以用做「Task」中全部step的基礎。.

    • sidecars- 指定sidercar容器與steps一塊兒運行.


apiVersion: tekton.dev/v1alpha1kind: Taskmetadata: name: example-task-namespec: inputs: resources: - name: workspace type: git params: - name: pathToDockerFile type: string description: The path to the dockerfile to build default: /workspace/workspace/Dockerfile outputs: resources: - name: builtImage type: image steps: - name: ubuntu-example image: ubuntu args: ["ubuntu-build-example", "SECRETS-example.md"] - image: gcr.io/example-builders/build-example command: ["echo"] args: ["$(inputs.params.pathToDockerFile)"] - name: dockerfile-pushexample image: gcr.io/example-builders/push-example args: ["push", "$(outputs.resources.builtImage.url)"] volumeMounts: - name: docker-socket-example mountPath: /var/run/docker.sock volumes: - name: example-volume emptyDir: {}

參考上面的例子,咱們來看一下幾個參數的解釋:

Steps

Steps字段是必填字段。定義一個或多個Step字段以定義Task主體。

若是定義了多個Step,則由TaskRun調用任務時,將按照定義的順序執行它們。

Task中的每一個Step都必須指定一個遵照容器規約的容器鏡像。對於定義的每一個Step字段或容器鏡像:

  • 按照配置文件,依次運行和評估容器鏡像。

  • 這個容器鏡像一直運行到完成或檢測到第一個故障爲止。

  • 若是容器鏡像在「Task」中的全部容器鏡像中沒有最大的資源請求,則CPU,內存和臨時存儲資源請求將設置爲零。這樣能夠確保執行任務的Pod僅請求執行任務中任何單個容器鏡像所需的資源,而不是請求全部容器鏡像資源請求的總和。



Inputs 

一個Task能夠聲明其所需的inputs,能夠是如下之一或所有:

  • 參數

  • 輸入資源


參數:

Task能夠聲明在TaskRun期間必須提供給任務的輸入參數。此的一些示例用例包括:

  • 須要知道一個Task構建應用程序時使用什麼編譯標誌。

  • 須要知道如何命名已構建工件的Task。

參數名稱僅限於字母數字字符-和_,而且只能以字母字符和_開頭。例如,fooIs-Bar_是有效的參數名稱,barIsBa $或0banana不是。

每一個聲明的參數都有一個類型字段,若是用戶未提供,則假定爲字符串。另外一個可能的類型是數組-例如,當須要向構建應用程序的任務提供動態數量的編譯標誌時,此數組頗有用。提供實際參數值時,將根據類型字段驗證其解析的類型。

用法:

如下示例顯示如何對Tasks進行參數化,以及如何將這些參數從TaskRun傳遞給Task。
$(inputs.params.foo)形式的輸入參數在步驟內被替換(另請參見變量替換)。
如下Task聲明一個名爲「 flags」的輸入參數,並在steps.args列表中使用它。

apiVersion: tekton.dev/v1alpha1kind: Taskmetadata: name: task-with-parametersspec: inputs: params: - name: flags type: array - name: someURL type: string steps: - name: build image: my-builder args: ["build", "$(inputs.params.flags)", "url=$(inputs.params.someURL)"]

Outputs

Task定義能夠包括輸入和輸出PipelineResource聲明。若是僅在輸出中聲明瞭特定的資源集,則預期在下一個任務上載或共享的資源副本位於路徑/ workspace / output / resource_name /下。

resources: outputs: name: storage-gcs type: gcssteps: - image: objectuser/run-java-jar #https://hub.docker.com/r/objectuser/run-java-jar/ command: [jar] args: ["-cvf", "-o", "/workspace/output/storage-gcs/", "projectname.war", "*"] env: - name: "FOO" value: "world"


Pipeline的正常運轉還須要其餘的資源配合如: 經過Secrets掛載到工做容器的Git、Docker的帳戶或token;容器內訪問k8s集羣所須要的serviceAccount。這些憑據資源掛載到tekton提供的特殊基礎鏡像容器,由這些基礎容器(一般是initContainers)來對帳戶、憑據進行讀取。

結語

Tekton Pipeline 中的任務模板能夠拿來複用,而不須要重複定義,另外經過 CRD 從新定義 CI/CD 是一大亮點。


   ---------------------------------------------------

官方資訊*最新技術*獨家解讀


本文分享自微信公衆號 - Go Official Blog(Go_Official_Blog)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索