2022-10-06 分類: 網(wǎng)站建設(shè)
Tekton 是一款功能非常強(qiáng)大而靈活的 CI/CD 開(kāi)源的云原生框架。Tekton 的前身是 Knative 項(xiàng)目的 build-pipeline 項(xiàng)目,這個(gè)項(xiàng)目是為了給 build 模塊增加 pipeline 的功能,但是隨著不同的功能加入到 Knative build 模塊中,build 模塊越來(lái)越變得像一個(gè)通用的 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)建塊目錄,供開(kāi)發(fā)人員在各種場(chǎng)景中使用。 可重復(fù)使用:Tekton 是完全可移植的,任何人都可以使用給定的流水線并重用其構(gòu)建塊,可以使得開(kāi)發(fā)人員無(wú)需"造輪子"就可以快速構(gòu)建復(fù)雜的流水線。 可擴(kuò)展:Tekton Catalog 是社區(qū)驅(qū)動(dòng)的 Tekton 構(gòu)建塊存儲(chǔ)庫(kù),我們可以使用 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ò)展,無(wú)需重新定義資源分配或?qū)艿肋M(jìn)行任何其他修改。 組件
Tekton 由一些列組件組成:
Tekton Pipelines 是 Tekton 的基礎(chǔ),它定義了一組 Kubernetes CRD 作為構(gòu)建塊,我們可以使用這些對(duì)象來(lái)組裝 CI/CD 流水線。 Tekton Triggers 允許我們根據(jù)事件來(lái)實(shí)例化流水線,例如,可以我們?cè)诿看螌?PR 合并到 GitHub 倉(cāng)庫(kù)的時(shí)候觸發(fā)流水線實(shí)例和構(gòu)建工作。 Tekton CLI 提供了一個(gè)名為 tkn 的命令行界面,它構(gòu)建在 Kubernetes CLI 之上,運(yùn)行和 Tekton 進(jìn)行交互。 Tekton Dashboard 是 Tekton Pipelines 的基于 Web 的一個(gè)圖形界面,可以線上有關(guān)流水線執(zhí)行的相關(guān)信息。 Tekton Catalog 是一個(gè)由社區(qū)貢獻(xiàn)的高質(zhì)量 Tekton 構(gòu)建塊(任務(wù)、流水線等)存儲(chǔ)庫(kù),可以直接在我們自己的流水線中使用這些構(gòu)建塊。 Tekton Hub 是一個(gè)用于訪問(wèn) Tekton Catalog 的 Web 圖形界面工具。 Tekton Operator 是一個(gè) Kubernetes Operator,可以讓我們?cè)?Kubernetes 集群上安裝、更新、刪除 Tekton 項(xiàng)目。 安裝
安裝 Tekton 非常簡(jiǎn)單,可以直接通過(guò) tektoncd/pipeline 的 GitHub 倉(cāng)庫(kù)中的 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上面的資源清單文件安裝后,會(huì)創(chuàng)建一個(gè)名為 tekton-pipelines 的命名空間,在該命名空間下面會(huì)有大量和 tekton 相關(guān)的資源對(duì)象,我們可以通過(guò)在該命名空間中查看 Pod 并確保它們處于 Running 狀態(tài)來(lá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 92sTekton 安裝完成后,我們還可以選擇是否安裝 CLI 工具,有時(shí)候可能 Tekton 提供的命令行工具比 kubectl 管理這些資源更加方便,當(dāng)然這并不是強(qiáng)制的,我這里是 Mac 系統(tǒng),所以可以使用常用的 Homebrew 工具來(lái)安裝:
brew tap tektoncd/tools brew install tektoncd/tools/tektoncd-cli安裝完成后可以通過(guò)如下命令驗(yàn)證 CLI 是否安裝成功:
$ tkn version Client version: 0.15.0 Pipeline version: v0.24.1 Dashboard version: v0.17.0還可以從 tknReleases 頁(yè)面下載安裝包,下載文件后,將其解壓縮到您的 PATH:
# Replace YOUR-DOWNLOADED-FILE with the file path of your own. sudo tar xvzf YOUR-DOWNLOADED-FILE -C /usr/local/bin/ tkn此外,還可以安裝一個(gè) Tekton 提供的一個(gè) Dashboard,我們可以通過(guò) Dashboard 查看 Tekton 整個(gè)任務(wù)的構(gòu)建過(guò)程,直接執(zhí)行下面的命令直接安裝即可:
kubectl apply -f http://my-oss-testing.oss-cn-beijing.aliyuncs.com/k8s/tekton/dashboard.yaml安裝完成后我們可以通過(guò) Dashboard 的 Service 的 NodePort 來(lái)訪問(wèn)應(yīng)用。
概念
Tekton 為 Kubernetes 提供了多種 CRD 資源對(duì)象,可用于定義我們的流水線。
主要有以下幾個(gè)資源對(duì)象:
Task:表示執(zhí)行命令的一系列有序的步驟,task 里可以定義一系列的 steps,例如編譯代碼、構(gòu)建鏡像、推送鏡像等,每個(gè) step 實(shí)際由一個(gè) Pod 執(zhí)行。 Pipeline:一組有序的 Task,Pipeline 中的 Task 可以使用之前執(zhí)行過(guò)的 Task 的輸出作為它的輸入。表示一個(gè)或多個(gè) Task、PipelineResource 以及各種定義參數(shù)的集合。 TaskRun:Task 只是定義了一個(gè)模版,TaskRun 才真正代表了一次實(shí)際的運(yùn)行,當(dāng)然你也可以自己手動(dòng)創(chuàng)建一個(gè) TaskRun,TaskRun 創(chuàng)建出來(lái)之后,就會(huì)自動(dòng)觸發(fā) Task 描述的構(gòu)建任務(wù)。 PipelineRun:類似 Task 和 TaskRun 的關(guān)系,PipelineRun 也表示某一次實(shí)際運(yùn)行的 pipeline,下發(fā)一個(gè) PipelineRun CRD 實(shí)例到 Kubernetes 后,同樣也會(huì)觸發(fā)一次 pipeline 的構(gòu)建。 ClusterTask:覆蓋整個(gè)集群的任務(wù),而不是單一的某一個(gè)命名空間,這是和 Task 大的區(qū)別,其他基本上一致的。 PipelineResource:表示 pipeline 輸入資源,比如 github 上的源碼,或者 pipeline 輸出資源,例如一個(gè)容器鏡像或者構(gòu)建生成的 jar 包等。每個(gè)任務(wù)都在自己的 Kubernetes Pod 中執(zhí)行,因此,默認(rèn)情況下,管道內(nèi)的任務(wù)不共享數(shù)據(jù)。要在 Tasks 之間共享數(shù)據(jù),你必須明確配置每個(gè) Task 以使其輸出可用于下一個(gè) Task 并獲取先前執(zhí)行的 Task 的輸出作為其輸入。
示例
使用 Tekton 后你的 CI/CD 工作流中的每個(gè)操作都變成了一個(gè) Step,使用指定的容器鏡像來(lái)執(zhí)行。Steps 然后組織在 Tasks 中,它在集群中作為 Kubernetes Pod 運(yùn)行,還可以進(jìn)一步組織 Tasks 變成成 Pipelines,還可以控制幾個(gè) Tasks 的執(zhí)行順序。
在這里我們使用一個(gè)簡(jiǎn)單的 Golang 應(yīng)用,可以在倉(cāng)庫(kù) https://github.com/cnych/tekton-demo 下面獲取應(yīng)用程序代碼,測(cè)試以及 Dockerfile 文件。
首先第一個(gè)任務(wù)就是 Clone 應(yīng)用程序代碼進(jìn)行測(cè)試,要?jiǎng)?chuàng)建一個(gè) Task 任務(wù),就需要使用到 Kubernetes 中定義的 Task 這個(gè) CRD 對(duì)象,這里我們創(chuàng)建一個(gè)如下所示的資源文件,內(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 一個(gè) Git 倉(cāng)庫(kù)作為 go test 命令的輸入,目前支持 git、pullRequest、image、cluster、storage、cloudevent 等資源。
Tekton 內(nèi)置的 git 資源類型,它會(huì)自動(dòng)將代碼倉(cāng)庫(kù) Clone 到 /workspace/$input_name 目錄中,由于我們這里輸入被命名成 repo,所以代碼會(huì)被 Clone 到 /workspace/repo 目錄下面。
然后下面的 steps 就是來(lái)定義執(zhí)行運(yùn)行測(cè)試命令的步驟,這里我們直接在代碼的根目錄中運(yùn)行 go test 命令即可,需要注意的是命令和參數(shù)需要分別定義。
定義完成后直接使用 kubectl 創(chuàng)建該任務(wù):
$ kubectl apply -f task-test.yaml task.tekton.dev/test created現(xiàn)在我們定義完成了一個(gè)新建的 Task 任務(wù),但是該任務(wù)并不會(huì)立即執(zhí)行,我們必須創(chuàng)建一個(gè) TaskRun 引用它并提供所有必需輸入的數(shù)據(jù)才行。當(dāng)然我們也可以直接使用 tkn 命令來(lái)啟動(dòng)這個(gè) Task 任務(wù),我們可以通過(guò)如下所示的命令來(lái)獲取啟動(dòng) Task 所需的資源對(duì)象:
$ 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ù)需要一個(gè) git 代碼倉(cāng)庫(kù)作為輸入,所以需要一個(gè) PipelineResource 對(duì)象來(lái)定義輸入信息,上面的命令會(huì)自動(dòng)創(chuàng)建一個(gè)名為 demo-git 的 PipelineResource 資源對(duì)象,如下所示:
$ 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 的時(shí)候我們就可以參考上面的方式來(lái)創(chuàng)建,當(dāng)然最后還需要?jiǎng)?chuàng)建 TaskRun 對(duì)象才可以真正執(zhí)行這個(gè) Task 任務(wù),上面的 tkn task start 命令也為我們打印出對(duì)應(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 倉(cāng)庫(kù)作為輸入,resourceRef 也是引用上面定義的 PipelineResource 資源對(duì)象?,F(xiàn)在我們創(chuàng)建這個(gè)資源對(duì)象過(guò)后,就會(huì)開(kāi)始運(yùn)行了:
$ kubectl apply -f taskrun.yaml taskrun.tekton.dev/testrun createdTekton 現(xiàn)在將開(kāi)始運(yùn)行您的 Task, 要查看最后一個(gè) TaskRun 的日志,可以使用以下 tkn命令:
tkn taskrun logs --last -f此外我們還可以通過(guò)查看 TaskRun 資源對(duì)象的狀態(tài)來(lá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我們可以通過(guò) kubectl describe 命令來(lái)查看任務(wù)運(yùn)行的過(guò)程,首先會(huì)通過(guò) tekton-git-init 拉取代碼,然后會(huì)使用我們定義的 Task 任務(wù)中的 Steps 鏡像來(lái)執(zhí)行任務(wù)。當(dāng)任務(wù)執(zhí)行完成后, Pod 就會(huì)變成 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我們可以查看容器的日志信息來(lái)了解任務(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我們可以看到我們的測(cè)試已經(jīng)通過(guò)了。
Docker Hub 配置
為了能夠構(gòu)建 Docker 鏡像,一般來(lái)說(shuō)我們需要使用 Docker 來(lái)進(jìn)行,我們這里是容器,所以可以使用 Docker In Docker 模式,這種模式安全性不高,除了這種方式之外,我們還可以使用 Google 推出的 Kaniko 工具來(lái)進(jìn)行構(gòu)建,該工具可以在 Kubernetes 集群中構(gòu)建 Docker 鏡像而無(wú)需依賴 Docker 守護(hù)進(jìn)程,之前我們已經(jīng)介紹過(guò) kaniko 這種形式,這里我們就介紹 DIND 這種模式。
使用 Kaniko 構(gòu)建鏡像和 Docker 命令基本上一致,所以我們可以提前設(shè)置下 Docker Hub 的登錄憑證,方便后續(xù)將鏡像推送到鏡像倉(cāng)庫(kù)。登錄憑證可以保存到 Kubernetes 的 Secret 資源對(duì)象中,創(chuàng)建一個(gè)名為 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 倉(cāng)庫(kù)登錄憑證。
我們這里在 Secret 對(duì)象中添加了一個(gè) tekton.dev/docker-0 的 annotation,該注解信息是用來(lái)告訴 Tekton 這些認(rèn)證信息所屬的 Docker 鏡像倉(cāng)庫(kù)。
然后創(chuàng)建一個(gè) ServiceAccount 對(duì)象來(lái)使用上面的 docker-auth 這個(gè) Secret 對(duì)象,創(chuàng)建一個(gè)名為 sa.yaml 的文件,內(nèi)容如下所示:
# sa.yaml apiVersion: v1 kind: ServiceAccount metadata: name: build-sa secrets: - name: harbor-auth然后直接創(chuàng)建上面兩個(gè)資源對(duì)象即可:
$ 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ù)或者流水線的時(shí)候使用上面的 build-sa 這個(gè) ServiceAccount 對(duì)象來(lái)進(jìn)行 Docker Hub 的登錄認(rèn)證了。
創(chuàng)建鏡像任務(wù)
現(xiàn)在我們創(chuàng)建一個(gè) Task 任務(wù)來(lái)構(gòu)建并推送 Docker 鏡像,我們這里使用的示例應(yīng)用根目錄下面已經(jīng)包含了一個(gè) 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)建一個(gè)名為 task-build-push.yaml 的文件,文件內(nèi)容如下所示:
apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: build-and-push spec: resources: inputs: # 定義輸入資源 - name: repo #輸入資源,就是github的那個(gè)倉(cāng)庫(kù) type: git outputs: # 定義輸出資源 - name: builtImage # 輸出鏡像名字 type: image params: - name: pathToDockerfile #指明 dockerfile 在倉(cāng)庫(kù)中的哪個(gè)位置 type: string default: /workspace/repo/Dockerfile # repo資源的路徑 description: dockerfile path - name: pathToContext #指明 dockerfile 在倉(cāng)庫(kù)中的哪個(gè)位置 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)來(lái),使用宿主機(jī)docker daemon 構(gòu)建鏡像 mountPath: /var/run/docker.sock volumes: - name: dockersock hostPath: path: /var/run/docker.sock和前面的測(cè)試任務(wù)類似,這里我們同樣將 git 作為輸入資源,此外還定義了一個(gè) dockerfile-path 的參數(shù),用來(lái)指定 Dockerfile 的路徑,此外還定義了一個(gè)名為 builtImage 的鏡像輸出資源,用來(lái)定義 Docker 鏡像的相關(guān)參數(shù)。然后定義了一個(gè)名為 build-and-push 的步驟,這里我們使用 DIND 的方式,將宿主機(jī)的 /var/run/docker.sock 文件掛載到 docker:stable 的容器中,然后執(zhí)行 script 下面的 Docker 鏡像構(gòu)建推送的操作。同樣直接創(chuàng)建上面的資源對(duì)象即可:
$ kubectl apply -f task-build-push.yaml task.tekton.dev/build-and-push created創(chuàng)建了 Task 任務(wù)過(guò)后,要想真正去執(zhí)行這個(gè)任務(wù),我們就需要?jiǎng)?chuàng)建一個(gè)對(duì)應(yīng)的 TaskRun 資源對(duì)象。
執(zhí)行任務(wù)
和前面一樣,現(xiàn)在我們來(lái)創(chuàng)建一個(gè) TaskRun 對(duì)象來(lái)觸發(fā)任務(wù),不同之處在于我們需要指定 Task 時(shí)需要的 ServiceAccount 對(duì)象。創(chuàng)建一個(gè)名為 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 # 指定輸入的倉(cāng)庫(kù)資源 resourceRef: name: demo-git outputs: # 指定輸出的鏡像資源 - name: builtImage resourceRef: name: harbor-image注意這里我們通過(guò) serviceAccountName 屬性指定了 Docker 認(rèn)證信息的 ServiceAccount對(duì)象,然后通過(guò) taskRef 引用我們的任務(wù),以及下面的 resourceRef 關(guān)聯(lián)第一部分我們聲明的輸入資源,此外還需要定義一個(gè)關(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)建這個(gè)資源對(duì)象即可:
$ 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)建完成后就會(huì)觸發(fā)任務(wù)執(zhí)行了,我們可以通過(guò)查看 Pod 對(duì)象狀態(tài)來(lá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,隔一會(huì)兒正常構(gòu)建就會(huì)成功了,我們可以查看構(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í)行成功了。這個(gè)時(shí)候其實(shí)我們可以在 Harbor 上找到我們的鏡像了,當(dāng)然也可以直接使用這個(gè)鏡像進(jìn)行測(cè)試:
創(chuàng)建流水線
到這里前面我們的兩個(gè)任務(wù) test 和 build-and-push 都已經(jīng)完成了,我們還可以創(chuàng)建一個(gè)流水線來(lái)將這兩個(gè)任務(wù)組織起來(lái),首先運(yùn)行 test 任務(wù),如果通過(guò)了再執(zhí)行后面的 build-and-push 這個(gè)任務(wù)。
創(chuàng)建一個(gè)名為 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)用測(cè)試 - 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 # 測(cè)試任務(wù)執(zhí)行之后 resources: inputs: - name: repo # Task 輸入名稱 resource: repo # Pipeline 資源名稱首先我們需要定義流水線需要哪些資源,可以是輸入或者輸出的資源,在這里我們只有一個(gè)輸入,那就是命名為 repo 的應(yīng)用程序源碼的 GitHub 倉(cāng)庫(kù)。接下來(lái)定義任務(wù),每個(gè)任務(wù)都通過(guò) taskRef 進(jìn)行引用,并傳遞任務(wù)需要的輸入?yún)?shù)。
同樣直接創(chuàng)建這個(gè)資源對(duì)象即可:
$ kubectl apply -f pipeline.yaml pipeline.tekton.dev/test-build-push created前面我們提到過(guò)和通過(guò)創(chuàng)建 TaskRun 去觸發(fā) Task 任務(wù)類似,我們可以通過(guò)創(chuàng)建一個(gè) PipelineRun 對(duì)象來(lái)運(yùn)行流水線。這里我們創(chuàng)建一個(gè)名為 pipelinerun.yaml 的 PipelineRun 對(duì)象來(lái)運(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 幾乎一樣,通過(guò) serviceAccountName 屬性指定 ServiceAccount 對(duì)象,pipelineRef 關(guān)聯(lián)流水線對(duì)象。同樣直接創(chuàng)建這個(gè)資源,創(chuàng)建后就會(huì)觸發(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 集群上,定義了一個(gè) Task,并通過(guò) YAML 清單和 Tekton CLI 創(chuàng)建 TaskRun 對(duì)其進(jìn)行了測(cè)試。我們創(chuàng)建了由兩個(gè)任務(wù)組成的 Tektok 流水線,第一個(gè)任務(wù)是從 GitHub 克隆代碼并運(yùn)行應(yīng)用程序測(cè)試,第二個(gè)任務(wù)是構(gòu)建一個(gè) Docker 鏡像并將其推送到 Docker Hub 上。到這里我們就完成了使用 Tekton 創(chuàng)建 CI/CD 流水線的一個(gè)簡(jiǎn)單示例,不過(guò)這個(gè)示例還比較簡(jiǎn)單,接下來(lái)我們?cè)偻ㄟ^(guò)一個(gè)稍微復(fù)雜點(diǎn)的應(yīng)用來(lái)完成我們的流水線。
網(wǎng)頁(yè)名稱:云原生CI/CD框架Tekton初體驗(yàn)
鏈接URL:http://www.rwnh.cn/news/202606.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、做網(wǎng)站、云服務(wù)器、品牌網(wǎng)站建設(shè)、企業(yè)建站、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容