精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

云原生 CI/CD 框架 Tekton 初體驗

云計算 云原生
Tekton 是一款功能非常強大而靈活的 CI/CD 開源的云原生框架。Tekton 的前身是 Knative 項目的 build-pipeline 項目。

[[404558]]

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

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

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

組件

Tekton 由一些列組件組成:

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

安裝

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

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

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

  1. 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)來檢查安裝是否成功:

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

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

  1. brew tap tektoncd/tools 
  2. brew install tektoncd/tools/tektoncd-cli 

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

  1. $ tkn version 
  2. Client version: 0.15.0 
  3. Pipeline version: v0.24.1 
  4. Dashboard version: v0.17.0 

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

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

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

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

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

概念

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

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

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

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

示例

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

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

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

  1. # task-test.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: Task 
  4. metadata: 
  5.   name: test 
  6. spec: 
  7.   resources: 
  8.     inputs: 
  9.       - name: repo 
  10.         type: git 
  11.   steps: 
  12.     - name: run-test 
  13.       image: golang:1.14-alpine 
  14.       workingDir: /workspace/repo 
  15.       command: ['go'
  16.       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í)行運行測試命令的步驟,這里我們直接在代碼的根目錄中運行 go test 命令即可,需要注意的是命令和參數(shù)需要分別定義。

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

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

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

  1. $ tkn task start test --dry-run 
  2. no pipeline resource of type "git" found in namespace: default 
  3. Please create a new "git" resource for pipeline resource "repo" 
  4. ? Enter a name for a pipeline resource : demo-git 
  5. ? Enter a value for url :  https://github.com/cnych/tekton-demo 
  6. ? Enter a value for revision :  master 
  7. New git resource "demo-git" has been created 
  8. apiVersion: tekton.dev/v1beta1 
  9. kind: TaskRun 
  10. metadata: 
  11.   creationTimestamp: null 
  12.   generateName: test-run- 
  13.   namespace: default 
  14. spec: 
  15.   resources: 
  16.     inputs: 
  17.     - name: repo 
  18.       resourceRef: 
  19.         name: demo-git 
  20.   serviceAccountName: "" 
  21.   taskRef: 
  22.     name: test 
  23. status: 
  24.   podName: "" 

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

  1. $ kubectl get pipelineresource 
  2. NAME       AGE 
  3. demo-git   3m37s 
  4. $ kubectl get pipelineresource demo-git -o yaml 
  5. apiVersion: tekton.dev/v1alpha1 
  6. kind: PipelineResource 
  7. metadata: 
  8.   name: demo-git 
  9.   namespace: default 
  10.   ...... 
  11. spec: 
  12.   params: 
  13.   - name: url 
  14.     value: https://github.com/cnych/tekton-demo 
  15.   - name: revision 
  16.     value: master 
  17.   type: git 

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

  1. # taskrun.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: TaskRun 
  4. metadata: 
  5.   name: testrun 
  6. spec: 
  7.   resources: 
  8.     inputs: 
  9.       - name: repo 
  10.         resourceRef: 
  11.           name: demo-git 
  12.   taskRef: 
  13.     name: test 

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

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

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

  1. tkn taskrun logs --last -f 

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

  1. $ kubectl get taskrun 
  2. NAME      SUCCEEDED   REASON    STARTTIME   COMPLETIONTIME 
  3. testrun   Unknown     Pending   21s 
  4. $ kubectl get pods 
  5. NAME                             READY   STATUS     RESTARTS   AGE 
  6. testrun-pod-l629c                0/2     Init:1/2   0          59s 
  7. $ kubectl describe pod testrun-pod-l629c 
  8. Name:         testrun-pod-l629c 
  9. Namespace:    default 
  10. ...... 
  11. Events: 
  12.   Type    Reason     Age    From               Message 
  13.   ----    ------     ----   ----               ------- 
  14.   Normal  Scheduled  2m53s  default-scheduler  Successfully assigned default/testrun-pod-l629c to node1 
  15.   Normal  Pulling    2m52s  kubelet, node1     Pulling image "cnych/tekton-distroless-base:v0.24.1" 
  16.   Normal  Pulled     2m27s  kubelet, node1     Successfully pulled image "cnych/tekton-distroless-base:v0.24.1" in 24.910571044s 
  17.   Normal  Created    2m27s  kubelet, node1     Created container working-dir-initializer 
  18.   Normal  Started    2m27s  kubelet, node1     Started container working-dir-initializer 
  19.   Normal  Pulling    2m27s  kubelet, node1     Pulling image "cnych/tekton-entrypoint:v0.24.1" 
  20.   Normal  Pulled     2m     kubelet, node1     Successfully pulled image "cnych/tekton-entrypoint:v0.24.1" in 27.120230223s 
  21.   Normal  Created    2m     kubelet, node1     Created container place-tools 
  22.   Normal  Started    2m     kubelet, node1     Started container place-tools 
  23.   Normal  Pulling    119s   kubelet, node1     Pulling image "cnych/tekton-git-init:v0.24.1" 
  24.   Normal  Pulled     82s    kubelet, node1     Successfully pulled image "cnych/tekton-git-init:v0.24.1" in 36.318235738s 
  25.   Normal  Created    82s    kubelet, node1     Created container step-git-source-repo-jg7vz 
  26.   Normal  Started    82s    kubelet, node1     Started container step-git-source-repo-jg7vz 
  27.   Normal  Pulling    82s    kubelet, node1     Pulling image "golang:1.14-alpine" 
  28.   Normal  Pulled     28s    kubelet, node1     Successfully pulled image "golang:1.14-alpine" in 54.587298174s 
  29.   Normal  Created    27s    kubelet, node1     Created container step-run-test 
  30.   Normal  Started    27s    kubelet, node1     Started container step-run-test 

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

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

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

  1. $ kubectl logs testrun-r-n97ls-pod-7jvrd --all-containers 
  2. 2021/06/08 09:07:31 Copied /ko-app/entrypoint to /tekton/tools/entrypoint 
  3. {"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"
  4. {"level":"info","ts":1623144122.796532,"caller":"git/git.go:207","msg":"Successfully initialized and updated submodules in path /workspace/repo"
  5. PASS 
  6. ok      _/workspace/repo        0.002s 

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

Docker Hub 配置

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

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

  1. # harbor-auth.yaml 
  2. apiVersion: v1 
  3. kind: Secret 
  4. metadata: 
  5.   name: harbor-auth 
  6.   annotations: 
  7.     tekton.dev/docker-0: http://harbor.k8s.local 
  8. type: kubernetes.io/basic-auth 
  9. stringData: 
  10.   username: admin 
  11.   password: Harbor12345 

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

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

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

  1. # sa.yaml 
  2. apiVersion: v1 
  3. kind: ServiceAccount 
  4. metadata: 
  5.   name: build-sa 
  6. secrets: 
  7.   - name: harbor-auth 

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

  1. $ kubectl apply -f harbor-auth.yaml 
  2. secret/harbor-auth created 
  3. $ kubectl apply -f sa.yaml 
  4. serviceaccount/build-sa created 

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

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

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

  1. FROM golang:1.14-alpine 
  2.  
  3. WORKDIR /go/src/app 
  4. COPY . . 
  5.  
  6. RUN go get -d -v ./... 
  7. RUN go install -v ./... 
  8.  
  9. CMD ["app"

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

  1. apiVersion: tekton.dev/v1beta1 
  2. kind: Task 
  3. metadata: 
  4.   name: build-and-push 
  5. spec: 
  6.   resources: 
  7.     inputs: # 定義輸入資源 
  8.       - name: repo #輸入資源,就是github的那個倉庫 
  9.         type: git 
  10.     outputs: # 定義輸出資源 
  11.       - name: builtImage # 輸出鏡像名字 
  12.         type: image 
  13.   params: 
  14.     - name: pathToDockerfile #指明 dockerfile 在倉庫中的哪個位置 
  15.       type: string 
  16.       default: /workspace/repo/Dockerfile # repo資源的路徑 
  17.       description: dockerfile path 
  18.     - name: pathToContext #指明 dockerfile 在倉庫中的哪個位置 
  19.       type: string 
  20.       default: /workspace/repo  # repo資源的路徑 
  21.       description: the build context used by docker daemon 
  22.   steps: 
  23.     - name: build-and-push 
  24.       image: docker:stable 
  25.       script: | 
  26.         #!/usr/bin/env sh 
  27.         docker login harbor.k8s.local 
  28.         docker build -t $(resources.outputs.builtImage.url) -f $(params.pathToDockerfile) $(params.pathToContext) 
  29.         docker push $(resources.outputs.builtImage.url)  # 這邊的參數(shù)都是在 input 和 output 中定義的 
  30.       volumeMounts: 
  31.         - name: dockersock #將docker.sock文件掛載進來,使用宿主機docker daemon 構(gòu)建鏡像 
  32.           mountPath: /var/run/docker.sock 
  33.   volumes: 
  34.     - name: dockersock 
  35.       hostPath: 
  36.         path: /var/run/docker.sock 

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

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

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

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

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

  1. # taskrun-build-push.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: TaskRun 
  4. metadata: 
  5.   name: build-and-push 
  6. spec: 
  7.   serviceAccountName: build-sa 
  8.   taskRef: 
  9.     name: build-and-push # 關(guān)聯(lián)定義好的task 
  10.   resources: 
  11.     inputs: 
  12.       - name: repo # 指定輸入的倉庫資源 
  13.         resourceRef: 
  14.           name: demo-git 
  15.     outputs: # 指定輸出的鏡像資源 
  16.       - name: builtImage 
  17.         resourceRef: 
  18.           name: harbor-image 

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

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

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

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

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

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

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

  1. $ kubectl get pods 
  2. NAME                                      READY   STATUS            RESTARTS   AGE 
  3. build-and-push-pod-fl65m                  0/4     PodInitializing   0          9s 
  4. $  tkn taskrun logs build-and-push 
  5.  
  6. [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"
  7. [git-source-repo-rsvcf] {"level":"info","ts":1623151584.968812,"caller":"git/git.go:207","msg":"Successfully initialized and updated submodules in path /workspace/repo"
  8.  
  9. [build-and-push] Authenticating with existing credentials... 
  10. [build-and-push] WARNING! Your password will be stored unencrypted in /root/.docker/config.json. 
  11. [build-and-push] Configure a credential helper to remove this warning. See 
  12. [build-and-push] https://docs.docker.com/engine/reference/commandline/login/#credentials-store 
  13. [build-and-push] 
  14. [build-and-push] Login Succeeded 
  15. [build-and-push] Sending build context to Docker daemon  12.99MB 
  16. [build-and-push] Step 1/6 : FROM golang:1.14-alpine 
  17. ...... 
  18. [build-and-push] 9f9d00b69565: Pushed 
  19. [build-and-push] latest: digest: sha256:521a803fb15d2e05b6168cba36e6e31c548bdd369f274e86c8f5be2118cdb357 size: 2201 
  20.  
  21. [image-digest-exporter-mpbwq] {"severity":"INFO","timestamp":"2021-06-08T11:26:43.642545898Z","caller":"logging/config.go:116","message":"Successfully created the logger."
  22. [image-digest-exporter-mpbwq] {"severity":"INFO","timestamp":"2021-06-08T11:26:43.642786678Z","caller":"logging/config.go:117","message":"Logging level set to: info"
  23. [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"
  24. $ kubectl get taskrun 
  25. NAME             SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME 
  26. build-and-push   True        Succeeded   15m         2m24s 

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

創(chuàng)建流水線

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

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

  1. apiVersion: tekton.dev/v1beta1 
  2. kind: Pipeline 
  3. metadata: 
  4.   name: test-build-push 
  5. spec: 
  6.   resources: 
  7.     - name: repo 
  8.       type: git 
  9.   tasks: 
  10.     # 運行應用測試 
  11.     - name: test 
  12.       taskRef: 
  13.         name: test 
  14.       resources: 
  15.         inputs: 
  16.           - name: repo # Task 輸入名稱 
  17.             resource: repo # Pipeline 資源名稱 
  18.     # 構(gòu)建并推送 Docker 鏡像 
  19.     - name: build-and-push 
  20.       taskRef: 
  21.         name: build-and-push 
  22.       runAfter: 
  23.         - test # 測試任務(wù)執(zhí)行之后 
  24.       resources: 
  25.         inputs: 
  26.           - name: repo # Task 輸入名稱 
  27.             resource: repo # Pipeline 資源名稱 

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

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

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

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

  1. apiVersion: tekton.dev/v1beta1 
  2. kind: PipelineRun 
  3. metadata: 
  4.   name: test-build-push-run 
  5. spec: 
  6.   serviceAccountName: build-sa 
  7.   pipelineRef: 
  8.     name: test-build-push 
  9.   resources: 
  10.     - name: repo 
  11.       resourceRef: 
  12.         name: demo-git 

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

  1. $ kubectl apply -f pipelinerun.yaml 
  2. pipelinerun.tekton.dev/test-build-push-run created 
  3. $ kubectl get pods | grep test-build-push-run 
  4. test-build-push-run-build-and-push-xl7wp-pod-hdnbl   0/2     Completed   0          5m27s 
  5. test-build-push-run-test-4s6qh-pod-tkwzk             0/2     Completed   0          6m5s 
  6. $ kubectl logs -f test-build-push-run-build-and-push-xl7wp-pod-hdnbl --all-containers 
  7. {"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"
  8. {"level":"info","ts":1588908934.577377,"caller":"git/git.go:177","msg":"Successfully initialized and updated submodules in path /workspace/repo"
  9. {"level":"info","ts":1588908927.469531,"caller":"creds-init/main.go:44","msg":"Credentials initialized."
  10. INFO[0004] Retrieving image manifest golang:1.14-alpine 
  11. ...... 
  12. app 
  13. INFO[0281] Taking snapshot of full filesystem... 
  14. INFO[0287] Resolving 11666 paths 
  15. INFO[0291] CMD ["app"
  16. $ kubectl get taskrun |grep test-build-push-run 
  17. test-build-push-run-build-and-push-xl7wp   True        Succeeded   6m21s       65s 
  18. test-build-push-run-test-4s6qh             True        Succeeded   6m58s       6m21s 

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

 

責任編輯:姜華 來源: k8s技術(shù)圈
相關(guān)推薦

2021-05-13 18:23:53

Tekton云原生Kubernetes

2021-11-26 08:14:05

云原生CICD

2023-08-07 08:48:13

2023-05-04 16:03:50

KubernetesCI/CD集成

2021-07-04 07:24:48

GitOps 工具 Argo CD

2022-02-21 10:17:33

Rancher開源云原生

2025-09-02 02:53:00

LangExtracGoogle開源

2020-10-21 14:10:28

工具測試開發(fā)

2021-07-27 08:01:22

CICD平臺

2021-08-13 07:00:41

云原生k8sspringboot

2021-08-26 07:20:05

云原生K8sSpringboot

2021-07-09 06:40:59

TektonArgo CD GitOps

2022-04-25 08:07:45

TektonArgocdCI和CD

2022-02-22 09:00:00

軟件開發(fā)CI/CD 管道工具

2009-08-01 09:06:35

UbuntuOneLinux開源操作系統(tǒng)

2009-03-09 15:12:39

XenServer安裝

2011-11-21 11:19:19

Oracle NoSQ

2023-04-02 21:49:10

開源Tekton

2010-11-16 09:12:42

SQL Azure

2023-07-15 08:01:38

點贊
收藏

51CTO技術(shù)棧公眾號

成人三级伦理片| 99久久亚洲精品| 日本韩国一区二区三区视频| 日本在线观看不卡| 亚洲大尺度视频| 久热re这里精品视频在线6| www日韩欧美| 永久免费看mv网站入口亚洲| 欧美日韩国产一二三| 亚洲精品成人三区| 亚洲风情第一页| 黄色污网站在线观看| 久久99精品久久只有精品| 欧美国产日本在线| 黄色激情小视频| 日韩母乳在线| 日韩伦理av| 欧美系列电影免费观看| 日韩免费看网站| 日韩毛片在线免费看| 中文字幕伦理免费在线视频 | 欧美日韩国产精选| 国产精品网站免费| 性爱视频在线播放| 国产精品久久久久久一区二区三区 | 久久精品日产第一区二区三区高清版| 91免费国产网站| 亚洲激情视频一区| 吴梦梦av在线| 亚洲色图激情小说| 精品亚洲国内自在自线福利| 国产精品一区二区三区99| 国内精品久久久久久| 婷婷国产成人精品视频| 妖精一区二区三区精品视频| 日本午夜一区二区| 亚洲国产成人精品久久| theporn国产精品| 五月激情久久| 色婷婷亚洲一区二区三区| 青青艹视频在线| 超碰中文在线| 亚洲一区二区在线视频| 天天做天天爱天天高潮| 欧美a在线看| 国产精品久久久久久久久久免费看| 久久免费看av| 青青草娱乐在线| 久久这里都是精品| 日产中文字幕在线精品一区| 国产人成在线观看| 国产亚洲欧美一区在线观看| 欧美日韩精品不卡| 精品99又大又爽又硬少妇毛片| youjizz国产精品| 国产精品视频免费一区二区三区 | 极品av少妇一区二区| 九九热精品视频国产| 青娱乐在线视频免费观看| 香蕉精品视频在线观看| 欧美日韩成人免费| 日韩乱码一区二区| 亚洲欧美bt| 国产成人精品电影| 国产精品传媒在线观看| 蜜臀99久久精品久久久久久软件| 国产美女精品视频免费观看| 国产又粗又大又爽视频| 国产综合色视频| 成人在线免费观看一区| 色哟哟中文字幕| 91美女片黄在线观看91美女| 日韩欧美在线一区二区| 免费在线看黄| 亚洲网友自拍偷拍| 97成人在线观看视频| 亚洲精品555| 91精品国产91综合久久蜜臀| 色诱av手机版| 激情五月色综合国产精品| 久久精品视频va| 欧美不卡视频在线观看| 美国毛片一区二区| 国产亚洲精品自在久久| 电影av在线| 日韩一区欧美一区| 亚欧无线一线二线三线区别| 成人全视频免费观看在线看| 欧美成人一区二区| 尤物视频最新网址| 欧美久色视频| 国产黑人绿帽在线第一区| 99精品久久久久久中文字幕| 91一区二区在线观看| 亚洲美女搞黄| 久久久男人天堂| 欧美日韩在线播放三区四区| 久久国产劲爆∧v内射| 激情五月综合| 97久久国产精品| 96日本xxxxxⅹxxx17| 99久久综合精品| 天堂v在线视频| 成人性生交大片免费网站| 欧美一区二区三区男人的天堂| 中出视频在线观看| 亚洲一区在线| 国产精品一二区| 视频国产在线观看| 亚洲永久精品国产| 99sesese| 久久91麻豆精品一区| 欧美肥婆姓交大片| 国产精品一区二区黑人巨大| 久久久99精品久久| 欧美深夜福利视频| 亚洲精品福利| 久久久成人精品视频| 日韩 国产 欧美| a美女胸又www黄视频久久| 成年丰满熟妇午夜免费视频| 黄色精品视频网站| 国产亚洲美女久久| 日韩久久中文字幕| 99re视频精品| 妞干网在线观看视频| 亚洲成人黄色| 欧美老女人性生活| 国产美女免费视频| 国产精品第五页| 天天爱天天操天天干| 国产精品手机在线播放| 91精品国产精品| 五月婷婷狠狠干| 五月婷婷久久综合| 熟妇高潮一区二区| 亚洲免费播放| 精品国产一二| 亚洲欧美韩国| 精品夜色国产国偷在线| 日韩欧美一区二区一幕| 99r精品视频| 精品久久久久av| 国模吧精品视频| 国产精品极品在线| 成a人片在线观看www视频| 在线观看区一区二| 调教驯服丰满美艳麻麻在线视频| 美女精品网站| 日本在线观看一区| 欧美爱爱视频| 久久成人国产精品| 农村少妇久久久久久久| 精品久久久久久亚洲国产300| 国产精品第七页| 久久人人超碰| 亚洲一区bb| 欧美成年网站| 亚州成人av在线| 九色视频成人自拍| 欧美伊人精品成人久久综合97| 国产精品情侣呻吟对白视频| 久久国产剧场电影| 国产一区二区三区在线免费| 欧美丝袜美腿| 国产精品91在线| 秋霞a级毛片在线看| 日韩亚洲欧美中文三级| 五月天婷婷网站| 久久久.com| 亚洲第一区第二区第三区| 黄色亚洲大片免费在线观看| 蜜桃视频日韩| 国产第一精品| 欧美精品www在线观看| 色天堂在线视频| 欧美视频精品在线| 国产在线观看99| 国产亚洲精品资源在线26u| 四季av一区二区三区| 尤物在线精品| 日韩欧美在线电影| 爱高潮www亚洲精品| 国产精品成人一区二区三区吃奶| 黄色网在线免费看| 亚洲国产日韩欧美在线图片| 国产成人av免费| 亚洲综合一区二区| 丁香激情五月少妇| 成人免费高清在线观看| 日本在线观看免费视频| 极品裸体白嫩激情啪啪国产精品| 色一情一区二区三区四区 | 国产在线美女| 久久亚洲精品中文字幕冲田杏梨| 天天操天天干天天干| 欧美日韩国产美女| yjizz国产| 一区二区三区四区精品在线视频| 无码人妻丰满熟妇啪啪欧美| 国产高清不卡二三区| 天天干在线影院| 亚洲精品女人| 欧洲精品视频在线| 国产日韩视频在线| 国产区欧美区日韩区| 91成人app| 国产精品美女www| yellow在线观看网址| 欧美精品一区在线播放| 粉嫩av一区| 亚洲免费电影一区| 亚洲欧美强伦一区二区| 精品视频一区二区三区免费| 手机看片久久久| 亚洲在线一区二区三区| 国产一区二区精彩视频| 国产精品免费人成网站| 深爱五月激情网| eeuss国产一区二区三区| 精品人妻无码中文字幕18禁| 精品一区二区久久| 亚洲一级免费在线观看| 日韩和欧美的一区| 国内外成人激情视频| 亚洲国产第一| 91传媒免费视频| 自拍偷拍欧美专区| 在线观看成人av电影| 日韩一级毛片| 亚洲人成人77777线观看| 国产区精品区| 少妇精品久久久久久久久久| 国产乱码精品一区二区亚洲| 免费看成人片| 香蕉久久精品| 麻豆亚洲一区| 久久不见久久见国语| 欧洲在线视频一区| 欧美a视频在线观看| 成人黄色在线看| 亚洲女则毛耸耸bbw| 粉嫩久久99精品久久久久久夜 | 日韩精品一区不卡| 色欧美日韩亚洲| 天堂av免费在线观看| 欧美在线你懂得| 亚洲天天综合网| 欧美日韩成人一区二区| wwwww在线观看| 国产一二三区精品| 日本最黄一级片免费在线| 99国产精品免费视频观看| 精品久久久久久久大神国产| 三级黄色片网站| 久久综合九色综合欧美98| 亚洲码无人客一区二区三区| 国产午夜亚洲精品羞羞网站| 亚洲精品成人无码| 中文字幕中文字幕一区| 青青青在线免费观看| 亚洲一区二区三区三| 中文字幕激情小说| 欧美在线免费观看亚洲| 国产毛片在线视频| 精品成人a区在线观看| 欧洲毛片在线| 中文字幕成人在线| 污污视频在线看| 91av视频在线| 国产精品亲子伦av一区二区三区| 91天堂在线观看| 97se亚洲| 午夜午夜精品一区二区三区文| 91精品成人| 免费无码不卡视频在线观看| 日韩成人av影视| 久久久久亚洲av片无码v| 成人福利视频网站| 俄罗斯毛片基地| 一区二区三区四区视频精品免费| 免费av网站在线| 这里只有精品电影| 天天舔天天干天天操| 北条麻妃99精品青青久久| 波多野结衣精品| 国产精品视频自在线| 风间由美中文字幕在线看视频国产欧美 | 国产精品一区二区在线播放 | 在线看成人短视频| 亚洲国产精品久久| 50度灰在线观看| 91精品国产91久久久久久密臀 | 久久久久亚洲AV成人无在| 亚洲精品ww久久久久久p站| 日韩国产亚洲欧美| 亚洲国产精品99久久| 蜜桃视频在线观看www社区| 91sa在线看| 视频一区中文字幕精品| 午夜久久资源| 亚洲欧美日韩视频二区| 乱码一区二区三区| 中文字幕佐山爱一区二区免费| 久久夜色精品国产噜噜亚洲av| 欧美一区二视频| 福利视频在线播放| 欧美在线视频在线播放完整版免费观看 | 超碰免费在线观看| 97在线免费观看视频| 999精品视频在线观看| 日韩影视精品| 亚洲综合社区| 国产chinese中国hdxxxx| 亚洲欧洲综合另类在线| 中文字幕一区二区三区波野结| 亚洲精品wwww| 丰满大乳少妇在线观看网站| 91精品视频在线播放| 日本精品三区| 国内自拍视频一区| 久久久美女艺术照精彩视频福利播放| 久久在线视频精品| 欧美伊人久久久久久久久影院 | 欧美www视频| 成人在线app| 成人免费自拍视频| 天天操综合网| 色婷婷一区二区三区av免费看| 欧美激情一区二区三区不卡| 在线观看 亚洲| 精品一区二区三区四区| 国产99在线观看| 精品产品国产在线不卡| 亚洲承认在线| 国产激情第一页| 亚洲高清久久久| 熟妇人妻av无码一区二区三区| 久99久在线视频| 在线日韩成人| 国产主播自拍av| a亚洲天堂av| 中文字幕一区在线播放| 亚洲乱码一区二区| 校园春色亚洲色图| 品久久久久久久久久96高清| 日本va欧美va瓶| 成年人免费视频播放| 欧美老人xxxx18| 国产一二区在线| 99精彩视频| 亚洲精选国产| 天天躁夜夜躁狠狠是什么心态| 在线免费观看日韩欧美| 嫩草在线视频| 成人18视频| 国产精品婷婷| 一区二区三区在线观看免费视频| 欧美揉bbbbb揉bbbbb| 超碰在线观看免费| 国产乱码精品一区二区三区中文| 9久re热视频在线精品| 欧洲av一区二区三区| 欧美精品三级在线观看| 里番在线播放| 免费看污久久久| 国产一区久久久| 久久久久久久久久影院| 中文字幕亚洲激情| 久久伊人影院| 久久综合色视频| 中文字幕免费观看一区| www.国产黄色| 2019av中文字幕| 91精品精品| 国产亚洲无码精品| 在线不卡免费av| 极品美鲍一区| 黄色高清视频网站| ww久久中文字幕| 国产片在线播放| 欧洲中文字幕国产精品| 国产精品二区不卡| 在线观看国产免费视频| 欧美日韩精品一区二区三区蜜桃| 肉肉视频在线观看| 五月天久久综合网| 成人aaaa免费全部观看| 一区二区不卡视频在线观看| 高清亚洲成在人网站天堂| 日韩毛片视频| 自拍视频一区二区| 制服丝袜一区二区三区| 最新日韩精品| 免费看污污视频| 日本一区二区视频在线观看| 免费观看成年人视频| 国产日韩在线免费| 久久激情一区| 国产精品99精品无码视|