云原生CI/CD框架Tekton初體驗(yàn)

2022-10-06    分類: 網(wǎng)站建設(shè)

云原生 CI/CD 框架 Tekton 初體驗(yàn)

Tekton 是一款功能非常強(qiáng)大而靈活的 CI/CD 開源的云原生框架。Tekton 的前身是 Knative 項(xiàng)目的 build-pipeline 項(xiàng)目,這個項(xiàng)目是為了給 build 模塊增加 pipeline 的功能,但是隨著不同的功能加入到 Knative build 模塊中,build 模塊越來越變得像一個通用的 CI/CD 系統(tǒng),于是,索性將 build-pipeline 剝離出 Knative,就變成了現(xiàn)在的 Tekton,而 Tekton 也從此致力于提供全功能、標(biāo)準(zhǔn)化的云原生 CI/CD 解決方案。

Tekton 為 CI/CD 系統(tǒng)提供了諸多好處:

可定制:Tekton 是完全可定制的,具有高度的靈活性,我們可以定義非常詳細(xì)的構(gòu)建塊目錄,供開發(fā)人員在各種場景中使用。 可重復(fù)使用:Tekton 是完全可移植的,任何人都可以使用給定的流水線并重用其構(gòu)建塊,可以使得開發(fā)人員無需"造輪子"就可以快速構(gòu)建復(fù)雜的流水線。 可擴(kuò)展:Tekton Catalog 是社區(qū)驅(qū)動的 Tekton 構(gòu)建塊存儲庫,我們可以使用 Tekton Catalog 中定義的組件快速創(chuàng)建新的流水線并擴(kuò)展現(xiàn)有管道。 標(biāo)準(zhǔn)化:Tekton 在你的 Kubernetes 集群上作為擴(kuò)展安裝和運(yùn)行,并使用完善的 Kubernetes 資源模型,Tekton 工作負(fù)載在 Kubernetes Pod 內(nèi)執(zhí)行。 伸縮性:要增加工作負(fù)載容量,只需添加新的節(jié)點(diǎn)到集群即可,Tekton 可隨集群擴(kuò)展,無需重新定義資源分配或?qū)艿肋M(jìn)行任何其他修改。 組件

 

Tekton 由一些列組件組成:

Tekton Pipelines 是 Tekton 的基礎(chǔ),它定義了一組 Kubernetes CRD 作為構(gòu)建塊,我們可以使用這些對象來組裝 CI/CD 流水線。 Tekton Triggers 允許我們根據(jù)事件來實(shí)例化流水線,例如,可以我們在每次將 PR 合并到 GitHub 倉庫的時候觸發(fā)流水線實(shí)例和構(gòu)建工作。 Tekton CLI 提供了一個名為 tkn 的命令行界面,它構(gòu)建在 Kubernetes CLI 之上,運(yùn)行和 Tekton 進(jìn)行交互。 Tekton Dashboard 是 Tekton Pipelines 的基于 Web 的一個圖形界面,可以線上有關(guān)流水線執(zhí)行的相關(guān)信息。 Tekton Catalog 是一個由社區(qū)貢獻(xiàn)的高質(zhì)量 Tekton 構(gòu)建塊(任務(wù)、流水線等)存儲庫,可以直接在我們自己的流水線中使用這些構(gòu)建塊。 Tekton Hub 是一個用于訪問 Tekton Catalog 的 Web 圖形界面工具。 Tekton Operator 是一個 Kubernetes Operator,可以讓我們在 Kubernetes 集群上安裝、更新、刪除 Tekton 項(xiàng)目。 安裝

 

安裝 Tekton 非常簡單,可以直接通過 tektoncd/pipeline 的 GitHub 倉庫中的 release.yaml 文件進(jìn)行安裝,如下所示的命令:

kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/previous/v0.24.1/release.yaml 

由于官方使用的鏡像是 gcr 的鏡像,所以正常情況下我們是獲取不到的,如果你的集群由于某些原因獲取不到鏡像,可以使用下面的資源清單文件,我已經(jīng)將鏡像替換成了 Docker Hub 上面的鏡像:

kubectl apply -f http://my-oss-testing.oss-cn-beijing.aliyuncs.com/k8s/tekton/release.yaml 

上面的資源清單文件安裝后,會創(chuàng)建一個名為 tekton-pipelines 的命名空間,在該命名空間下面會有大量和 tekton 相關(guān)的資源對象,我們可以通過在該命名空間中查看 Pod 并確保它們處于 Running 狀態(tài)來檢查安裝是否成功:

$ kubectl get pods -n tekton-pipelines  NAME                                           READY   STATUS    RESTARTS   AGE  tekton-pipelines-controller-795dd94d96-lkbxt   1/1     Running   0          92s  tekton-pipelines-webhook-6b8964445d-mp4k6      1/1     Running   0          92s 

Tekton 安裝完成后,我們還可以選擇是否安裝 CLI 工具,有時候可能 Tekton 提供的命令行工具比 kubectl 管理這些資源更加方便,當(dāng)然這并不是強(qiáng)制的,我這里是 Mac 系統(tǒng),所以可以使用常用的 Homebrew 工具來安裝:

brew tap tektoncd/tools  brew install tektoncd/tools/tektoncd-cli 

安裝完成后可以通過如下命令驗(yàn)證 CLI 是否安裝成功:

$ tkn version  Client version: 0.15.0  Pipeline version: v0.24.1  Dashboard version: v0.17.0 

還可以從 tknReleases 頁面下載安裝包,下載文件后,將其解壓縮到您的 PATH:

# Replace YOUR-DOWNLOADED-FILE with the file path of your own.  sudo tar xvzf YOUR-DOWNLOADED-FILE -C /usr/local/bin/ tkn 

此外,還可以安裝一個 Tekton 提供的一個 Dashboard,我們可以通過 Dashboard 查看 Tekton 整個任務(wù)的構(gòu)建過程,直接執(zhí)行下面的命令直接安裝即可:

kubectl apply -f http://my-oss-testing.oss-cn-beijing.aliyuncs.com/k8s/tekton/dashboard.yaml 

安裝完成后我們可以通過 Dashboard 的 Service 的 NodePort 來訪問應(yīng)用。

云原生 CI/CD 框架 Tekton 初體驗(yàn)

概念

 

Tekton 為 Kubernetes 提供了多種 CRD 資源對象,可用于定義我們的流水線。

云原生 CI/CD 框架 Tekton 初體驗(yàn)

主要有以下幾個資源對象:

Task:表示執(zhí)行命令的一系列有序的步驟,task 里可以定義一系列的 steps,例如編譯代碼、構(gòu)建鏡像、推送鏡像等,每個 step 實(shí)際由一個 Pod 執(zhí)行。 Pipeline:一組有序的 Task,Pipeline 中的 Task 可以使用之前執(zhí)行過的 Task 的輸出作為它的輸入。表示一個或多個 Task、PipelineResource 以及各種定義參數(shù)的集合。 TaskRun:Task 只是定義了一個模版,TaskRun 才真正代表了一次實(shí)際的運(yùn)行,當(dāng)然你也可以自己手動創(chuàng)建一個 TaskRun,TaskRun 創(chuàng)建出來之后,就會自動觸發(fā) Task 描述的構(gòu)建任務(wù)。 PipelineRun:類似 Task 和 TaskRun 的關(guān)系,PipelineRun 也表示某一次實(shí)際運(yùn)行的 pipeline,下發(fā)一個 PipelineRun CRD 實(shí)例到 Kubernetes 后,同樣也會觸發(fā)一次 pipeline 的構(gòu)建。 ClusterTask:覆蓋整個集群的任務(wù),而不是單一的某一個命名空間,這是和 Task 大的區(qū)別,其他基本上一致的。 PipelineResource:表示 pipeline 輸入資源,比如 github 上的源碼,或者 pipeline 輸出資源,例如一個容器鏡像或者構(gòu)建生成的 jar 包等。

每個任務(wù)都在自己的 Kubernetes Pod 中執(zhí)行,因此,默認(rèn)情況下,管道內(nèi)的任務(wù)不共享數(shù)據(jù)。要在 Tasks 之間共享數(shù)據(jù),你必須明確配置每個 Task 以使其輸出可用于下一個 Task 并獲取先前執(zhí)行的 Task 的輸出作為其輸入。

示例

 

使用 Tekton 后你的 CI/CD 工作流中的每個操作都變成了一個 Step,使用指定的容器鏡像來執(zhí)行。Steps 然后組織在 Tasks 中,它在集群中作為 Kubernetes Pod 運(yùn)行,還可以進(jìn)一步組織 Tasks 變成成 Pipelines,還可以控制幾個 Tasks 的執(zhí)行順序。

云原生 CI/CD 框架 Tekton 初體驗(yàn)

在這里我們使用一個簡單的 Golang 應(yīng)用,可以在倉庫 https://github.com/cnych/tekton-demo 下面獲取應(yīng)用程序代碼,測試以及 Dockerfile 文件。

首先第一個任務(wù)就是 Clone 應(yīng)用程序代碼進(jìn)行測試,要創(chuàng)建一個 Task 任務(wù),就需要使用到 Kubernetes 中定義的 Task 這個 CRD 對象,這里我們創(chuàng)建一個如下所示的資源文件,內(nèi)容如下所示:

# task-test.yaml  apiVersion: tekton.dev/v1beta1  kind: Task  metadata:    name: test  spec:    resources:      inputs:        - name: repo          type: git    steps:      - name: run-test        image: golang:1.14-alpine        workingDir: /workspace/repo        command: ['go']        args: ['test'] 

其中 resources 定義了我們的任務(wù)中定義的 Step 所需的輸入內(nèi)容,這里我們的步驟需要 Clone 一個 Git 倉庫作為 go test 命令的輸入,目前支持 git、pullRequest、image、cluster、storage、cloudevent 等資源。

Tekton 內(nèi)置的 git 資源類型,它會自動將代碼倉庫 Clone 到 /workspace/$input_name 目錄中,由于我們這里輸入被命名成 repo,所以代碼會被 Clone 到 /workspace/repo 目錄下面。

然后下面的 steps 就是來定義執(zhí)行運(yùn)行測試命令的步驟,這里我們直接在代碼的根目錄中運(yùn)行 go test 命令即可,需要注意的是命令和參數(shù)需要分別定義。

定義完成后直接使用 kubectl 創(chuàng)建該任務(wù):

$ kubectl apply -f task-test.yaml  task.tekton.dev/test created 

現(xiàn)在我們定義完成了一個新建的 Task 任務(wù),但是該任務(wù)并不會立即執(zhí)行,我們必須創(chuàng)建一個 TaskRun 引用它并提供所有必需輸入的數(shù)據(jù)才行。當(dāng)然我們也可以直接使用 tkn 命令來啟動這個 Task 任務(wù),我們可以通過如下所示的命令來獲取啟動 Task 所需的資源對象:

$ tkn task start test --dry-run  no pipeline resource of type "git" found in namespace: default  Please create a new "git" resource for pipeline resource "repo"  ? Enter a name for a pipeline resource : demo-git  ? Enter a value for url :  https://github.com/cnych/tekton-demo  ? Enter a value for revision :  master  New git resource "demo-git" has been created  apiVersion: tekton.dev/v1beta1  kind: TaskRun  metadata:    creationTimestamp: null    generateName: test-run-    namespace: default  spec:    resources:      inputs:      - name: repo        resourceRef:          name: demo-git    serviceAccountName: ""    taskRef:      name: test  status:    podName: "" 

由于我們這里的 Task 任務(wù)需要一個 git 代碼倉庫作為輸入,所以需要一個 PipelineResource 對象來定義輸入信息,上面的命令會自動創(chuàng)建一個名為 demo-git 的 PipelineResource 資源對象,如下所示:

$ kubectl get pipelineresource  NAME       AGE  demo-git   3m37s  $ kubectl get pipelineresource demo-git -o yaml  apiVersion: tekton.dev/v1alpha1  kind: PipelineResource  metadata:    name: demo-git    namespace: default    ......  spec:    params:    - name: url      value: https://github.com/cnych/tekton-demo    - name: revision      value: master    type: git 

當(dāng)我們不知道如何創(chuàng)建 PipelineResource 的時候我們就可以參考上面的方式來創(chuàng)建,當(dāng)然最后還需要創(chuàng)建 TaskRun 對象才可以真正執(zhí)行這個 Task 任務(wù),上面的 tkn task start 命令也為我們打印出對應(yīng)的 TaskRun 資源,將其內(nèi)容添加到 taskrun.yaml 文件中:

# taskrun.yaml  apiVersion: tekton.dev/v1beta1  kind: TaskRun  metadata:    name: testrun  spec:    resources:      inputs:        - name: repo          resourceRef:            name: demo-git    taskRef:      name: test 

這里的 taskRef 引用上面定義的 Task 和 git 倉庫作為輸入,resourceRef 也是引用上面定義的 PipelineResource 資源對象。現(xiàn)在我們創(chuàng)建這個資源對象過后,就會開始運(yùn)行了:

$ kubectl apply -f taskrun.yaml  taskrun.tekton.dev/testrun created 

Tekton 現(xiàn)在將開始運(yùn)行您的 Task, 要查看最后一個 TaskRun 的日志,可以使用以下 tkn命令:

tkn taskrun logs --last -f 

此外我們還可以通過查看 TaskRun 資源對象的狀態(tài)來查看構(gòu)建狀態(tài):

$ kubectl get taskrun  NAME      SUCCEEDED   REASON    STARTTIME   COMPLETIONTIME  testrun   Unknown     Pending   21s  $ kubectl get pods  NAME                             READY   STATUS     RESTARTS   AGE  testrun-pod-l629c                0/2     Init:1/2   0          59s  $ kubectl describe pod testrun-pod-l629c  Name:         testrun-pod-l629c  Namespace:    default  ......  Events:    Type    Reason     Age    From               Message    ----    ------     ----   ----               -------    Normal  Scheduled  2m53s  default-scheduler  Successfully assigned default/testrun-pod-l629c to node1    Normal  Pulling    2m52s  kubelet, node1     Pulling image "cnych/tekton-distroless-base:v0.24.1"    Normal  Pulled     2m27s  kubelet, node1     Successfully pulled image "cnych/tekton-distroless-base:v0.24.1" in 24.910571044s    Normal  Created    2m27s  kubelet, node1     Created container working-dir-initializer    Normal  Started    2m27s  kubelet, node1     Started container working-dir-initializer    Normal  Pulling    2m27s  kubelet, node1     Pulling image "cnych/tekton-entrypoint:v0.24.1"    Normal  Pulled     2m     kubelet, node1     Successfully pulled image "cnych/tekton-entrypoint:v0.24.1" in 27.120230223s    Normal  Created    2m     kubelet, node1     Created container place-tools    Normal  Started    2m     kubelet, node1     Started container place-tools    Normal  Pulling    119s   kubelet, node1     Pulling image "cnych/tekton-git-init:v0.24.1"    Normal  Pulled     82s    kubelet, node1     Successfully pulled image "cnych/tekton-git-init:v0.24.1" in 36.318235738s    Normal  Created    82s    kubelet, node1     Created container step-git-source-repo-jg7vz    Normal  Started    82s    kubelet, node1     Started container step-git-source-repo-jg7vz    Normal  Pulling    82s    kubelet, node1     Pulling image "golang:1.14-alpine"    Normal  Pulled     28s    kubelet, node1     Successfully pulled image "golang:1.14-alpine" in 54.587298174s    Normal  Created    27s    kubelet, node1     Created container step-run-test    Normal  Started    27s    kubelet, node1     Started container step-run-test 

我們可以通過 kubectl describe 命令來查看任務(wù)運(yùn)行的過程,首先會通過 tekton-git-init 拉取代碼,然后會使用我們定義的 Task 任務(wù)中的 Steps 鏡像來執(zhí)行任務(wù)。當(dāng)任務(wù)執(zhí)行完成后, Pod 就會變成 Completed 狀態(tài)了:

$ kubectl get pods  NAME                        READY   STATUS      RESTARTS   AGE  testrun-r-n97ls-pod-7jvrd   0/2     Completed   0          4m27s  $ kubectl get taskrun  NAME              SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME  testrun-r-n97ls   True        Succeeded   16m         119s 

我們可以查看容器的日志信息來了解任務(wù)的執(zhí)行結(jié)果信息:

$ kubectl logs testrun-r-n97ls-pod-7jvrd --all-containers  2021/06/08 09:07:31 Copied /ko-app/entrypoint to /tekton/tools/entrypoint  {"level":"info","ts":1623144122.7787642,"caller":"git/git.go:169","msg":"Successfully cloned https://github.com/cnych/tekton-demo @ c6c2a85091d538a13c44f85bcee9e861c362b0d3 (grafted, HEAD, origin/master) in path /workspace/repo"}  {"level":"info","ts":1623144122.796532,"caller":"git/git.go:207","msg":"Successfully initialized and updated submodules in path /workspace/repo"}  PASS  ok      _/workspace/repo        0.002s 

我們可以看到我們的測試已經(jīng)通過了。

Docker Hub 配置

 

為了能夠構(gòu)建 Docker 鏡像,一般來說我們需要使用 Docker 來進(jìn)行,我們這里是容器,所以可以使用 Docker In Docker 模式,這種模式安全性不高,除了這種方式之外,我們還可以使用 Google 推出的 Kaniko 工具來進(jìn)行構(gòu)建,該工具可以在 Kubernetes 集群中構(gòu)建 Docker 鏡像而無需依賴 Docker 守護(hù)進(jìn)程,之前我們已經(jīng)介紹過 kaniko 這種形式,這里我們就介紹 DIND 這種模式。

使用 Kaniko 構(gòu)建鏡像和 Docker 命令基本上一致,所以我們可以提前設(shè)置下 Docker Hub 的登錄憑證,方便后續(xù)將鏡像推送到鏡像倉庫。登錄憑證可以保存到 Kubernetes 的 Secret 資源對象中,創(chuàng)建一個名為 harbor-auth.yaml 的文件,內(nèi)容如下所示:

# harbor-auth.yaml  apiVersion: v1  kind: Secret  metadata:    name: harbor-auth    annotations:      tekton.dev/docker-0: http://harbor.k8s.local  type: kubernetes.io/basic-auth  stringData:    username: admin    password: Harbor12345 

記得將 username 和 password 替換成你的 Harbor 倉庫登錄憑證。

我們這里在 Secret 對象中添加了一個 tekton.dev/docker-0 的 annotation,該注解信息是用來告訴 Tekton 這些認(rèn)證信息所屬的 Docker 鏡像倉庫。

然后創(chuàng)建一個 ServiceAccount 對象來使用上面的 docker-auth 這個 Secret 對象,創(chuàng)建一個名為 sa.yaml 的文件,內(nèi)容如下所示:

# sa.yaml  apiVersion: v1  kind: ServiceAccount  metadata:    name: build-sa  secrets:    - name: harbor-auth 

然后直接創(chuàng)建上面兩個資源對象即可:

$ kubectl apply -f harbor-auth.yaml  secret/harbor-auth created  $ kubectl apply -f sa.yaml  serviceaccount/build-sa created 

創(chuàng)建完成后,我們就可以在運(yùn)行 Tekton 的任務(wù)或者流水線的時候使用上面的 build-sa 這個 ServiceAccount 對象來進(jìn)行 Docker Hub 的登錄認(rèn)證了。

創(chuàng)建鏡像任務(wù)

 

現(xiàn)在我們創(chuàng)建一個 Task 任務(wù)來構(gòu)建并推送 Docker 鏡像,我們這里使用的示例應(yīng)用根目錄下面已經(jīng)包含了一個 Dockerfile 文件了,所以我們直接 Clone 代碼就可以獲得:

FROM golang:1.14-alpine    WORKDIR /go/src/app  COPY . .    RUN go get -d -v ./...  RUN go install -v ./...    CMD ["app"] 

創(chuàng)建一個名為 task-build-push.yaml 的文件,文件內(nèi)容如下所示:

apiVersion: tekton.dev/v1beta1  kind: Task  metadata:    name: build-and-push  spec:    resources:      inputs: # 定義輸入資源        - name: repo #輸入資源,就是github的那個倉庫          type: git      outputs: # 定義輸出資源        - name: builtImage # 輸出鏡像名字          type: image    params:      - name: pathToDockerfile #指明 dockerfile 在倉庫中的哪個位置        type: string        default: /workspace/repo/Dockerfile # repo資源的路徑        description: dockerfile path      - name: pathToContext #指明 dockerfile 在倉庫中的哪個位置        type: string        default: /workspace/repo  # repo資源的路徑        description: the build context used by docker daemon    steps:      - name: build-and-push        image: docker:stable        script: |          #!/usr/bin/env sh          docker login harbor.k8s.local          docker build -t $(resources.outputs.builtImage.url) -f $(params.pathToDockerfile) $(params.pathToContext)          docker push $(resources.outputs.builtImage.url)  # 這邊的參數(shù)都是在 input 和 output 中定義的        volumeMounts:          - name: dockersock #將docker.sock文件掛載進(jìn)來,使用宿主機(jī)docker daemon 構(gòu)建鏡像            mountPath: /var/run/docker.sock    volumes:      - name: dockersock        hostPath:          path: /var/run/docker.sock 

和前面的測試任務(wù)類似,這里我們同樣將 git 作為輸入資源,此外還定義了一個 dockerfile-path 的參數(shù),用來指定 Dockerfile 的路徑,此外還定義了一個名為 builtImage 的鏡像輸出資源,用來定義 Docker 鏡像的相關(guān)參數(shù)。然后定義了一個名為 build-and-push 的步驟,這里我們使用 DIND 的方式,將宿主機(jī)的 /var/run/docker.sock 文件掛載到 docker:stable 的容器中,然后執(zhí)行 script 下面的 Docker 鏡像構(gòu)建推送的操作。同樣直接創(chuàng)建上面的資源對象即可:

$ kubectl apply -f task-build-push.yaml  task.tekton.dev/build-and-push created 

創(chuàng)建了 Task 任務(wù)過后,要想真正去執(zhí)行這個任務(wù),我們就需要創(chuàng)建一個對應(yīng)的 TaskRun 資源對象。

執(zhí)行任務(wù)

 

和前面一樣,現(xiàn)在我們來創(chuàng)建一個 TaskRun 對象來觸發(fā)任務(wù),不同之處在于我們需要指定 Task 時需要的 ServiceAccount 對象。創(chuàng)建一個名為 taskrun-build-push.yaml 的文件,內(nèi)容如下所示:

# taskrun-build-push.yaml  apiVersion: tekton.dev/v1beta1  kind: TaskRun  metadata:    name: build-and-push  spec:    serviceAccountName: build-sa    taskRef:      name: build-and-push # 關(guān)聯(lián)定義好的task    resources:      inputs:        - name: repo # 指定輸入的倉庫資源          resourceRef:            name: demo-git      outputs: # 指定輸出的鏡像資源        - name: builtImage          resourceRef:            name: harbor-image 

注意這里我們通過 serviceAccountName 屬性指定了 Docker 認(rèn)證信息的 ServiceAccount對象,然后通過 taskRef 引用我們的任務(wù),以及下面的 resourceRef 關(guān)聯(lián)第一部分我們聲明的輸入資源,此外還需要定義一個關(guān)于輸出鏡像的 PipelineResource 資源:

# harbor-image-res.yaml  apiVersion: tekton.dev/v1alpha1  kind: PipelineResource  metadata:    name: harbor-image  spec:    type: image    params:      - name: url        value: harbor.k8s.local/course/tekton-demo:latest #構(gòu)建完的鏡像名稱 

然后直接創(chuàng)建這個資源對象即可:

$ kubectl apply -f harbor-image-res.yaml  pipelineresource.tekton.dev/harbor-image created  $ kubectl apply -f taskrun-build-push.yaml  taskrun.tekton.dev/build-and-push created 

創(chuàng)建完成后就會觸發(fā)任務(wù)執(zhí)行了,我們可以通過查看 Pod 對象狀態(tài)來了解進(jìn)度:

$ kubectl get pods  NAME                                      READY   STATUS            RESTARTS   AGE  build-and-push-pod-fl65m                  0/4     PodInitializing   0          9s  $ kubectl get taskrun  NAME              SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME  build-and-push    Unknown     Pending     26s 

現(xiàn)在任務(wù)執(zhí)行的 Pod 還在初始化容器階段,我們可以看到 TaskRun 的狀態(tài)處于 Pending,隔一會兒正常構(gòu)建就會成功了,我們可以查看構(gòu)建任務(wù)的 Pod 日志信息:

$ kubectl get pods  NAME                                      READY   STATUS            RESTARTS   AGE  build-and-push-pod-fl65m                  0/4     PodInitializing   0          9s  $  tkn taskrun logs build-and-push    [git-source-repo-rsvcf] {"level":"info","ts":1623151584.9503093,"caller":"git/git.go:169","msg":"Successfully cloned https://github.com/cnych/tekton-demo @ c6c2a85091d538a13c44f85bcee9e861c362b0d3 (grafted, HEAD, origin/master) in path /workspace/repo"}  [git-source-repo-rsvcf] {"level":"info","ts":1623151584.968812,"caller":"git/git.go:207","msg":"Successfully initialized and updated submodules in path /workspace/repo"}    [build-and-push] Authenticating with existing credentials...  [build-and-push] WARNING! Your password will be stored unencrypted in /root/.docker/config.json.  [build-and-push] Configure a credential helper to remove this warning. See  [build-and-push] https://docs.docker.com/engine/reference/commandline/login/#credentials-store  [build-and-push]  [build-and-push] Login Succeeded  [build-and-push] Sending build context to Docker daemon  12.99MB  [build-and-push] Step 1/6 : FROM golang:1.14-alpine  ......  [build-and-push] 9f9d00b69565: Pushed  [build-and-push] latest: digest: sha256:521a803fb15d2e05b6168cba36e6e31c548bdd369f274e86c8f5be2118cdb357 size: 2201    [image-digest-exporter-mpbwq] {"severity":"INFO","timestamp":"2021-06-08T11:26:43.642545898Z","caller":"logging/config.go:116","message":"Successfully created the logger."}  [image-digest-exporter-mpbwq] {"severity":"INFO","timestamp":"2021-06-08T11:26:43.642786678Z","caller":"logging/config.go:117","message":"Logging level set to: info"}  [image-digest-exporter-mpbwq] {"severity":"INFO","timestamp":"2021-06-08T11:26:43.643090681Z","caller":"imagedigestexporter/main.go:59","message":"No index.json found for: builtImage","commit":"7ca5d61"}  $ kubectl get taskrun  NAME             SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME  build-and-push   True        Succeeded   15m         2m24s 

我們可以看到 TaskRun 任務(wù)已經(jīng)執(zhí)行成功了。這個時候其實(shí)我們可以在 Harbor 上找到我們的鏡像了,當(dāng)然也可以直接使用這個鏡像進(jìn)行測試:

云原生 CI/CD 框架 Tekton 初體驗(yàn)

創(chuàng)建流水線

 

到這里前面我們的兩個任務(wù) test 和 build-and-push 都已經(jīng)完成了,我們還可以創(chuàng)建一個流水線來將這兩個任務(wù)組織起來,首先運(yùn)行 test 任務(wù),如果通過了再執(zhí)行后面的 build-and-push 這個任務(wù)。

創(chuàng)建一個名為 pipeline.yaml 的文件,內(nèi)容如下所示:

apiVersion: tekton.dev/v1beta1  kind: Pipeline  metadata:    name: test-build-push  spec:    resources:      - name: repo        type: git    tasks:      # 運(yùn)行應(yīng)用測試      - name: test        taskRef:          name: test        resources:          inputs:            - name: repo # Task 輸入名稱              resource: repo # Pipeline 資源名稱      # 構(gòu)建并推送 Docker 鏡像      - name: build-and-push        taskRef:          name: build-and-push        runAfter:          - test # 測試任務(wù)執(zhí)行之后        resources:          inputs:            - name: repo # Task 輸入名稱              resource: repo # Pipeline 資源名稱 

首先我們需要定義流水線需要哪些資源,可以是輸入或者輸出的資源,在這里我們只有一個輸入,那就是命名為 repo 的應(yīng)用程序源碼的 GitHub 倉庫。接下來定義任務(wù),每個任務(wù)都通過 taskRef 進(jìn)行引用,并傳遞任務(wù)需要的輸入?yún)?shù)。

同樣直接創(chuàng)建這個資源對象即可:

$ kubectl apply -f pipeline.yaml  pipeline.tekton.dev/test-build-push created 

前面我們提到過和通過創(chuàng)建 TaskRun 去觸發(fā) Task 任務(wù)類似,我們可以通過創(chuàng)建一個 PipelineRun 對象來運(yùn)行流水線。這里我們創(chuàng)建一個名為 pipelinerun.yaml 的 PipelineRun 對象來運(yùn)行流水線,文件內(nèi)容如下所示:

apiVersion: tekton.dev/v1beta1  kind: PipelineRun  metadata:    name: test-build-push-run  spec:    serviceAccountName: build-sa    pipelineRef:      name: test-build-push    resources:      - name: repo        resourceRef:          name: demo-git 

定義方式和 TaskRun 幾乎一樣,通過 serviceAccountName 屬性指定 ServiceAccount 對象,pipelineRef 關(guān)聯(lián)流水線對象。同樣直接創(chuàng)建這個資源,創(chuàng)建后就會觸發(fā)我們的流水線任務(wù)了:

$ kubectl apply -f pipelinerun.yaml  pipelinerun.tekton.dev/test-build-push-run created  $ kubectl get pods | grep test-build-push-run  test-build-push-run-build-and-push-xl7wp-pod-hdnbl   0/2     Completed   0          5m27s  test-build-push-run-test-4s6qh-pod-tkwzk             0/2     Completed   0          6m5s  $ kubectl logs -f test-build-push-run-build-and-push-xl7wp-pod-hdnbl --all-containers  {"level":"info","ts":1588908934.442572,"caller":"git/git.go:136","msg":"Successfully cloned https://github.com/cnych/tekton-demo @ f840e0c390be9a1a6edad76abbde64e882047f05 (grafted, HEAD, origin/master) in path /workspace/repo"}  {"level":"info","ts":1588908934.577377,"caller":"git/git.go:177","msg":"Successfully initialized and updated submodules in path /workspace/repo"}  {"level":"info","ts":1588908927.469531,"caller":"creds-init/main.go:44","msg":"Credentials initialized."}  INFO[0004] Retrieving image manifest golang:1.14-alpine  ......  app  INFO[0281] Taking snapshot of full filesystem...  INFO[0287] Resolving 11666 paths  INFO[0291] CMD ["app"]  $ kubectl get taskrun |grep test-build-push-run  test-build-push-run-build-and-push-xl7wp   True        Succeeded   6m21s       65s  test-build-push-run-test-4s6qh             True        Succeeded   6m58s       6m21s 

到這里證明我們的流水線執(zhí)行成功了。我們將 Tekton 安裝在 Kubernetes 集群上,定義了一個 Task,并通過 YAML 清單和 Tekton CLI 創(chuàng)建 TaskRun 對其進(jìn)行了測試。我們創(chuàng)建了由兩個任務(wù)組成的 Tektok 流水線,第一個任務(wù)是從 GitHub 克隆代碼并運(yùn)行應(yīng)用程序測試,第二個任務(wù)是構(gòu)建一個 Docker 鏡像并將其推送到 Docker Hub 上。到這里我們就完成了使用 Tekton 創(chuàng)建 CI/CD 流水線的一個簡單示例,不過這個示例還比較簡單,接下來我們再通過一個稍微復(fù)雜點(diǎn)的應(yīng)用來完成我們的流水線。

當(dāng)前題目:云原生CI/CD框架Tekton初體驗(yàn)
網(wǎng)址分享:http://muchs.cn/news6/202606.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、服務(wù)器托管建站公司、網(wǎng)站內(nèi)鏈、響應(yīng)式網(wǎng)站、虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司