今天給大家介紹一下Knative中CICD該怎么入門(mén)。文章的內(nèi)容小編覺(jué)得不錯(cuò),現(xiàn)在給大家分享一下,覺(jué)得有需要的朋友可以了解一下,希望對(duì)大家有所幫助,下面跟著小編的思路一起來(lái)閱讀吧。
創(chuàng)新互聯(lián)公司長(zhǎng)期為上千多家客戶(hù)提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為婺城企業(yè)提供專(zhuān)業(yè)的網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì),婺城網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
Knative 社區(qū)很早就在討論用 Tekton 替換 Build 模塊的相關(guān)事宜。Knative Build 官方已經(jīng)正式說(shuō)明不再建議使用 Knative Build 了。
如果你知道 Knative Build 是什么,相信你理解起 Tekton 就是一件很容易的事兒了。
Knative Build 對(duì)自己的一句話(huà)概述是:A Kubernetes-native Build resource.
Tekton 對(duì)自己的一句話(huà)概述是: A K8s-native Pipeline resource. https://tekton.dev
可以看到兩者的定位非常相近,但在功能上 Tekton 的設(shè)計(jì)更加豐富、完整,這也是社區(qū)最終采用 Tekton 的原因。接下來(lái)我們就看一下 Tekton 的核心概念。
Tekton 主要由以下五個(gè)核心概念組成:
Task
TaskRun
Pipeline
PipelineRun
PipelineResource
以上五個(gè)概念,每一個(gè)都是以 CRD 的形式提供服務(wù)的。下面分別簡(jiǎn)述一下這五個(gè)概念的含義。
Task 就是一個(gè)任務(wù)執(zhí)行模板,之所以說(shuō) Task 是一個(gè)模板是因?yàn)?Task 定義中可以包含變量,Task 在真正執(zhí)行的時(shí)候需要給定變量的具體值。Tekton 的 Task 很類(lèi)似于一個(gè)函數(shù)的定義,Task 通過(guò) inputs.params 定義需要哪些入?yún)?,并且每一個(gè)入?yún)⑦€可以指定默認(rèn)值。Task 的 steps 字段表示當(dāng)前 Task 是有哪些子步驟組成的。每一個(gè)步驟具體就是一個(gè)鏡像的執(zhí)行,鏡像的啟動(dòng)參數(shù)可以通過(guò) Task 的入?yún)⑹褂媚0逭Z(yǔ)法進(jìn)行配置。
apiVersion: tekton.dev/v1alpha1 kind: Task metadata: name: task-with-parameters spec: inputs: params: - name: flags type: array - name: someURL type: string steps: - name: build image: registry.cn-hangzhou.aliyuncs.com/knative-sample/alpine:3.9 command: ["sh", "-c"] args: [ "echo ${inputs.params.flags} ; echo ${someURL}"]
Task 定義好以后是不能執(zhí)行的,就像一個(gè)函數(shù)定義好以后需要調(diào)用才能執(zhí)行一樣。所以需要再定義一個(gè) TaskRun 去執(zhí)行 Task。TaskRun 主要是負(fù)責(zé)設(shè)置 Task 需要的參數(shù),并通過(guò) taskRef 字段引用要執(zhí)行的 Task。
apiVersion: tekton.dev/v1alpha1 kind: TaskRun metadata: name: run-with-parameters spec: taskRef: name: task-with-parameters inputs: params: - name: flags value: "--set" - name: someURL value: "https://github.com/knative-sample"
一個(gè) TaskRun 只能執(zhí)行一個(gè) Task,當(dāng)需要編排多個(gè) Task 的時(shí)候就需要 Pipeline 出馬了。Pipeline 是一個(gè)編排 Task 的模板。Pipeline 的 params 聲明了執(zhí)行時(shí)需要的入?yún)ⅰ?Pipeline 的 spec.tasks 定義了需要編排的 Task。Tasks 是一個(gè)數(shù)組,數(shù)組中的 task 并不是通過(guò)數(shù)組聲明的順序去執(zhí)行的,而是通過(guò) runAfter 來(lái)聲明 task 執(zhí)行的順序。Tekton controller 在解析 CRD 的時(shí)候會(huì)解析 Task 的順序,然后根據(jù)設(shè)定的順序依次去執(zhí)行。Pipeline 在編排 Task 的時(shí)候需要給每一個(gè) Task 傳入必需的參數(shù),這些參數(shù)的值可以來(lái)自 Pipeline 自身的 params。
apiVersion: tekton.dev/v1alpha1 kind: Pipeline metadata: name: pipeline-with-parameters spec: params: - name: context type: string description: Path to context default: /some/where/or/other tasks: - name: task-1 taskRef: name: build params: - name: pathToDockerFile value: Dockerfile - name: pathToContext value: "${params.context}" - name: task-2 taskRef: name: build-push runAfter: - source-to-image params: - name: pathToDockerFile value: Dockerfile - name: pathToContext value: "${params.context}"
和 Task 一樣, Pipeline 定義完成以后也是不能直接執(zhí)行的,需要 PipelineRun 才能執(zhí)行 Pipeline。PipelineRun 的主要作用是給 Pipeline 設(shè)定必要的入?yún)?,并?zhí)行 Pipeline。
apiVersion: tekton.dev/v1alpha1 kind: PipelineRun metadata: name: pipelinerun-with-parameters spec: pipelineRef: name: pipeline-with-parameters params: - name: "context" value: "/workspace/examples/microservices/leeroy-web"
前面已經(jīng)介紹了 Tekton 的四個(gè)核心概念?,F(xiàn)在我們已經(jīng)知道怎么定義 task、執(zhí)行 task 以及編排 task 了。但可能你還想在 Task 之間共享資源,這就是 PipelineResource 的作用。比如我們可以把 git 倉(cāng)庫(kù)信息放在 PipelineResource 中。這樣所有 Task 就可以共享這份數(shù)據(jù)了。
piVersion: tekton.dev/v1alpha1 kind: PipelineResource metadata: name: wizzbang-git namespace: default spec: type: git params: - name: url value: https://github.com/wizzbangcorp/wizzbang.git - name: revision value: master
git 倉(cāng)庫(kù)、鏡像倉(cāng)庫(kù)這些都是需要鑒權(quán)才能使用的。所以還需要一種設(shè)定鑒權(quán)信息的機(jī)制。Tekton 本身是 Kubernetes 原生的編排系統(tǒng)。所以可以直接使用 Kubernetes 的 ServiceAccount 機(jī)制實(shí)現(xiàn)鑒權(quán)。 實(shí)例如下:
定義一個(gè)保存鏡像倉(cāng)庫(kù)鑒權(quán)信息的 secret
apiVersion: v1 kind: Secret metadata: name: ack-cr-push-secret annotations: tekton.dev/docker-0: https://registry.cn-hangzhou.aliyuncs.com type: kubernetes.io/basic-auth stringData: username:password:
定義 ServiceAccount ,并且使用上面的 secret
apiVersion: v1 kind: ServiceAccount metadata: name: pipeline-account secrets: - name: ack-cr-push-secret
PipelineRun 中引用 ServiceAccount
apiVersion: tekton.dev/v1alpha1 kind: PipelineRun metadata: generateName: tekton-kn-sample- spec: pipelineRef: name: build-and-deploy-pipeline ... ... serviceAccount: pipeline-account
https://github.com/knative-sample/tekton-knative 這是一個(gè)完整的 Tekton 的 Hello World。下面我們一起體驗(yàn)一下這個(gè) Hello World。
在開(kāi)始實(shí)戰(zhàn)之前,你需要有一個(gè) Kubernetes 集群,并且還需要安裝 Knative 和 Tekton。tekton-knative 中的 release-v0.5.2.yaml 直接提交到 Kubernetes 集群即可完成 Tekton 的安裝。下面我們開(kāi)始體驗(yàn)使用 Tekton 從源碼到構(gòu)建再到部署的自動(dòng)化過(guò)程。
clone 代碼到本地。
git clone https://github.com/knative-sample/tekton-knative
主要內(nèi)容在 resources/picalc-git.yaml
文件中。如下所示主要是把 https://github.com/knative-sample/tekton-knative 保存在 resource 中給其他資源使用。
apiVersion: tekton.dev/v1alpha1 kind: PipelineResource metadata: name: tekton-knative-git spec: type: git params: - name: revision value: master - name: url value: https://github.com/knative-sample/tekton-knative
創(chuàng)建 task,這個(gè)例子中我們創(chuàng)建兩個(gè) task:source-to-image 和 deploy-using-kubectl
source-to-image 主要內(nèi)容在 tasks/source-to-image.yaml
文件中。此 task 的主要功能是把源代碼編譯成鏡像。 主要是使用 kaniko 實(shí)現(xiàn)容器內(nèi)編譯 Docker 鏡像的能力。此 Task 的參數(shù)主要是設(shè)置編譯上下文的一些信息,比如:Dockerfile、ContextPath 以及目標(biāo)鏡像 tag 等。
apiVersion: tekton.dev/v1alpha1 kind: Task metadata: name: source-to-image spec: inputs: resources: - name: git-source type: git params: - name: pathToContext description: The path to the build context, used by Kaniko - within the workspace default: . - name: pathToDockerFile description: The path to the dockerfile to build (relative to the context) default: Dockerfile - name: imageUrl description: Url of image repository - name: imageTag description: Tag to apply to the built image default: "latest" steps: - name: build-and-push image: registry.cn-hangzhou.aliyuncs.com/knative-sample/kaniko-project-executor:v0.10.0 command: - /kaniko/executor args: - --dockerfile=${inputs.params.pathToDockerFile} - --destination=${inputs.params.imageUrl}:${inputs.params.imageTag} - --context=/workspace/git-source/${inputs.params.pathToContext} env: - name: DOCKER_CONFIG value: /builder/home/.docker
deploy-using-kubectl 主要內(nèi)容在 tasks/deploy-using-kubectl.yaml
文件中。 如下所示這個(gè) Task 主要的作用是通過(guò)參數(shù)獲取到目標(biāo)鏡像的信息,然后執(zhí)行一條 sed 命令把 Knative Service yaml 中的 __IMAGE__
替換成目標(biāo)鏡像。再通過(guò) kubectl 發(fā)布到 Kubernetes 中。
apiVersion: tekton.dev/v1alpha1 kind: Task metadata: name: deploy-using-kubectl spec: inputs: resources: - name: git-source type: git params: - name: pathToYamlFile description: The path to the yaml file to deploy within the git source - name: imageUrl description: Url of image repository - name: imageTag description: Tag of the images to be used. default: "latest" steps: - name: update-yaml image: alpine command: ["sed"] args: - "-i" - "-e" - "s;__IMAGE__;${inputs.params.imageUrl}:${inputs.params.imageTag};g" - "/workspace/git-source/${inputs.params.pathToYamlFile}" - name: run-kubectl image: registry.cn-hangzhou.aliyuncs.com/knative-sample/kubectl:v0.5.0 command: ["kubectl"] args: - "apply" - "-f" - "/workspace/git-source/${inputs.params.pathToYamlFile}"
我們已經(jīng)有兩個(gè) Task 了,現(xiàn)在我們就用一個(gè) PIpeline 來(lái)編排這兩個(gè) Task:
apiVersion: tekton.dev/v1alpha1 kind: Pipeline metadata: name: build-and-deploy-pipeline spec: resources: - name: git-source type: git params: - name: pathToContext description: The path to the build context, used by Kaniko - within the workspace default: src - name: pathToYamlFile description: The path to the yaml file to deploy within the git source - name: imageUrl description: Url of image repository - name: imageTag description: Tag to apply to the built image tasks: - name: source-to-image taskRef: name: source-to-image params: - name: pathToContext value: "${params.pathToContext}" - name: imageUrl value: "${params.imageUrl}" - name: imageTag value: "${params.imageTag}" resources: inputs: - name: git-source resource: git-source - name: deploy-to-cluster taskRef: name: deploy-using-kubectl runAfter: - source-to-image params: - name: pathToYamlFile value: "${params.pathToYamlFile}" - name: imageUrl value: "${params.imageUrl}" - name: imageTag value: "${params.imageTag}" resources: inputs: - name: git-source resource: git-source
如下所示,定義一個(gè) Secret 和 ServiceAccount。并且授予 ServiceAccount 綁定執(zhí)行 Knative Service 的權(quán)限。
apiVersion: v1 kind: Secret metadata: name: ack-cr-push-secret annotations: tekton.dev/docker-0: https://registry.cn-hangzhou.aliyuncs.com type: kubernetes.io/basic-auth stringData: username:password: --- apiVersion: v1 kind: ServiceAccount metadata: name: pipeline-account secrets: - name: ack-cr-push-secret --- apiVersion: v1 kind: Secret metadata: name: kube-api-secret annotations: kubernetes.io/service-account.name: pipeline-account type: kubernetes.io/service-account-token --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pipeline-role rules: - apiGroups: ["serving.knative.dev"] resources: ["services"] verbs: ["get", "create", "update", "patch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: pipeline-role-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: pipeline-role subjects: - kind: ServiceAccount name: pipeline-account
ServiceAccount 對(duì)應(yīng)的鑒權(quán)信息是通過(guò)和 PIpelineRun 綁定的方式來(lái)執(zhí)行的。參見(jiàn) run/picalc-pipeline-run.yaml
文件
apiVersion: tekton.dev/v1alpha1 kind: PipelineRun metadata: generateName: tekton-kn-sample- spec: pipelineRef: name: build-and-deploy-pipeline resources: - name: git-source resourceRef: name: tekton-knative-git params: - name: pathToContext value: "src" - name: pathToYamlFile value: "knative/helloworld-go.yaml" - name: imageUrl value: "registry.cn-hangzhou.aliyuncs.com/knative-sample/tekton-knative-helloworld" - name: imageTag value: "1.0" trigger: type: manual serviceAccount: pipeline-account
kubectl apply -f tasks/source-to-image.yaml -f tasks/deploy-using-kubectl.yaml -f resources/picalc-git.yaml -f image-secret.yaml -f pipeline-account.yaml -f pipeline/build-and-deploy-pipeline.yaml -f run/picalc-pipeline-run.yaml
查看一下 pod 信息,可能是下面這樣:
└─# kubectl get pod NAME READY STATUS RESTARTS AGE tekton-kn-sample-45d84-deploy-to-cluster-wfrzx-pod-f093ef 0/3 Completed 0 8h tekton-kn-sample-45d84-source-to-image-7zpqn-pod-c2d20c 0/2 Completed 0 8h
以上就是Knative中CICD該怎么入門(mén)的全部?jī)?nèi)容了,更多與Knative中CICD該怎么入門(mén)相關(guān)的內(nèi)容可以搜索創(chuàng)新互聯(lián)之前的文章或者瀏覽下面的文章進(jìn)行學(xué)習(xí)哈!相信小編會(huì)給大家增添更多知識(shí),希望大家能夠支持一下創(chuàng)新互聯(lián)!