Knative 初體驗:CICD 極速入門
Knative 社群很早就在討論用 Tekton 替換 Build 模組的事宜。Knative Build 官方已經正式說明不再建議使用 Knative Build 了。
如果你知道 Knative Build 是什麼相信你理解起 Tekton 就是很容易的一件事了。
Knative Build 對自己的一句話概述是:
A Kubernetes-native Build resource.
Tekton 對自己的一句話概述是:
A K8s-native Pipeline resource. https://tekton.dev
可以看到兩者的定位非常相近,而且在功能上 Tekton 的設計更加的豐富、完整,這也是社群最終採用 Tekton 的原因。接下來我們就看一下 Tekton 的核心概念。
Tekton 極速入門
Tekton 主要由如下五個核心概念組成:
Task
TaskRun
Pipeline
PipelineRun
PipelineResource
這五個概念每一個都是以 CRD 的形式提供服務的,下面分別簡述一下這五個概念的含義。
Task
Task 就是一個任務執行模板,之所以說 Task 是一個模板是因為 Task 定義中可以包含變數,Task 在真正執行的時候需要給定變數的具體值。Tekton 的 Task 很類似於一個函式的定義,Task 透過 inputs.params 定義需要哪些入參,並且每一個入參還可以指定預設值。Task 的 steps 欄位表示當前 Task 是有哪些子步驟組成的。每一個步驟具體就是一個映象的執行,映象的啟動引數可以透過 Task 的入參使用模板語法進行配置。
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}"]
TaskRun
Task 定義好以後是不能執行的,就像一個函式定義好以後需要呼叫才能執行一樣。所以需要再定義一個 TaskRun 去執行 Task。TaskRun 主要是負責設定 Task 需要的引數,並透過 taskRef 欄位引用要執行的 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: ""
Pipeline
一個 TaskRun 只能執行一個 Task,當需要編排多個 Task 的時候就需要 Pipeline 出馬了。Pipeline 是一個編排 Task 的模板。Pipeline 的 params 宣告瞭執行時需要的入參。 Pipeline 的 spec.tasks 定義了需要編排的 Task。Tasks 是一個陣列,陣列中的 task 並不是透過陣列宣告的順序去執行的,而是透過 runAfter 來宣告 task 執行的順序。Tekton controller 在解析 CRD 的時候會解析 Task 的順序,然後依據設定的順序依次去執行。Pipeline 在編排 Task 的時候需要給每一個 Task 傳入必須的引數,這些引數的值可以來自 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}"
PipelineRun
和 Task 一樣 Pipeline 定義完成以後也是不能直接執行的,需要 PipelineRun 才能執行 Pipeline。PipelineRun 的主要作用是給 Pipeline 設定必要的入參,並執行 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"
PipelineResource
前面已經介紹了 Tekton 的四個核心概念。現在我們已經知道怎麼定義 task、執行 task 以及編排 task 了。但可能你還想在 Task 之間共享資源,這就是 PipelineResource 的作用。比如我們可以把 git 倉庫資訊放在 PipelineResource 中。這樣所有 Pipeline 就可以共享這份資料了。
piVersion: tekton.dev/v1alpha1 kind: PipelineResource metadata: name: wizzbang-git namespace: default spec: type: git params: - name: url value: - name: revision value: master
授權資訊
git 倉庫、映象倉庫這些都是需要鑑權才能使用的。所以還需要一種設定鑑權資訊的機制。Tekton 本身是 Kubernetes 原生的編排系統。所以可以直接使用 Kubernetes 的 ServiceAccount 機制實現鑑權。
例項如下:
定義一個儲存映象倉庫鑑權資訊的 secret
apiVersion: v1 kind: Secret metadata: name: ack-cr-push-secret annotations: tekton.dev/docker-0: type: kubernetes.io/basic-auth stringData: username: <cleartext non-encoded> password: <cleartext non-encoded>
定義 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
Hello World
這是一個完整的 Tekton 的 Helle World。下面我們一起體驗一下這個 Helle World。
在開始實戰之前你需要有一個 Kubernetes 叢集,並還需要安裝 Knative 和 Tekton。tekton-knative 中的 release-v0.5.2.yaml 直接提交到 Kubernetes 叢集即可完成 Tekton 的安裝。下面我們開始體驗使用 Tekton 從原始碼到構建再到部署的自動化過程。
clone 程式碼
clone 程式碼到本地。
git clone /tekton-knative
建立 PipelineResource
主要內容在 resources/picalc-git.yaml
檔案中。如下所示主要是把 儲存在 resource 中給其他資源使用。
apiVersion: tekton.dev/v1alpha1 kind: PipelineResource metadata: name: tekton-knative-git spec: type: git params: - name: revision value: master - name: url value: /tekton-knative
建立 task
建立 task,這個例子中我們建立兩個 task:source-to-image 和 deploy-using-kubectl
source-to-image
主要內容在tasks/source-to-image.yaml
檔案中。此 task 的主要功能是把原始碼編譯成映象。
主要是使用 kaniko 實現容器內編譯 Docker 映象的能力。此 Task 的引數主要是設定編譯上下文的一些資訊,比如:Dockerfile、ContextPath 以及目標映象 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
主要內容在tasks/deploy-using-kubectl.yaml
檔案中。
如下所示這個 Task 主要的作用是透過引數獲取到目標映象的資訊,然後執行一條 sed 命令把 Knative Service yaml 中的 __IMAGE__
替換成目標映象。再透過 kubectl 釋出到 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}"
定義 Pipeline
現在我們已經有兩個 Task 了,現在我們就用一個 PIpeline 來編排這兩個 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
鑑權資訊
如下所示,定義一個 Secret 和 ServiceAccount。並且給 ServiceAccount 繫結執行 Knative Service 的許可權。
首先建立一個 Secret 儲存映象倉庫的鑑權資訊,如下所示:
tekton.dev/docker-0 換成你要推送的映象倉庫的地址
username 換成映象倉庫鑑權的使用者名稱
password 環境映象倉庫鑑權的密碼
apiVersion: v1 kind: Secret metadata: name: ack-cr-push-secret annotations: tekton.dev/docker-0: type: kubernetes.io/basic-auth stringData: username: <cleartext non-encoded> password: <cleartext non-encoded>
下面這些資訊儲存到檔案中,然後使用 kubectl apply -f 指令提交到 Kubernetes
--- 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
定義 PIpelineRun
ServiceAccount 對應的鑑權資訊是透過和 PIpelineRun 繫結的方式執行的。參見 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
執行 HelloWorld
準備 PIpeline 的資源
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
執行 create 把 pipelieRun 提交到 Kubernetes 叢集。之所以這裡使用 create 而不是使用 apply 是因為 PIpelineRun 每次都會建立一個新的,kubectl 的 create 指令會基於 generateName 建立新的 PIpelineRun 資源。
kubectl create -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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/75/viewspace-2823471/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 從零入門 Serverless | Knative 帶來的極致 Serverless 體驗Server
- Mybatis極速入門MyBatis
- CMake極速入門
- Netty 入門初體驗Netty
- CICD 入門指北
- ES6極速入門
- Dagger 2 極速入門
- 極速體驗docker容器健康Docker
- 極速體驗SpringCloud GatewaySpringGCCloudGateway
- Knative 入門系列1:knative 概述
- 開箱即用,Knative 給您極致的容器 Serverless 體驗Server
- create-react-app+mobx入門初體驗ReactAPP
- 1 小時 SQL 極速入門(三)SQL
- 1 小時 SQL 極速入門(一)SQL
- 1 小時 SQL 極速入門(二)SQL
- vuex4 極速入門到上手Vue
- 小白入門微服務(1) - RPC 初體驗微服務RPC
- flex.css快速入門,極速佈局FlexCSS
- ArgoWorkflow 教程(一)--DevOps 另一選擇?雲原生 CICD 初體驗Godev
- Docker下,兩分鐘極速體驗NacosDocker
- Docker下,五分鐘極速體驗機器學習Docker機器學習
- Go 語言極速入門4 - 物件導向Go物件
- Kubernetes(K8s)極速入門K8S
- Serverless 極速搭建 Hexo 部落格(體驗有禮)ServerHexo
- 悅動圈極速版 APP體驗報告APP
- 10分鐘極速入門dash應用開發
- Docker下,兩分鐘極速體驗Nacos配置中心Docker
- 鴻蒙極速入門(四)-透過登入Demo瞭解ArkTS鴻蒙
- Spring Security系列之極速入門與實踐教程Spring
- 極速安裝和體驗k8s(Minikube)K8S
- 極速體驗|使用 Erda 微服務觀測接入 Jaeger Trace微服務
- 新手安裝Xentoo(Xen+Gentoo)的極速體驗(轉)
- AIGC入門體驗AIGC
- SpringBoot系列之Elasticsearch極速入門與實際教程Spring BootElasticsearch
- Flutter&Dart-非同步程式設計Future、Stream極速入門FlutterDart非同步程式設計
- 《Python黑客程式設計之極速入門》正式開課Python黑客程式設計
- 極速程式設計體驗:VsCode和webstorm插上ChatGPT程式設計VSCodeWebORMChatGPT
- 慕課網《Netty入門之WebSocket初體驗》學習總結NettyWeb