Tekton CICD Demo
這是一個演示 Tekton CICD 的 demo。下面我們將從搭建本地 k8s 集群開始,同步鏡像至國內并部署 Tekton,一步一步實現一個 CICD 流水線。實現更新代碼自動觸發流水線,構建鏡像推送到目標倉庫,并更新 deployment 鏡像滾動更新應用,最后釘釘機器人通知到群聊。
源碼:https://github.com/win5do/tekton-cicd-demo
[TOC]
前言
我心目中理想的CICD工具應該包含以下特性:
- 聲明式配置,新增配置不需要在UI上操作,便于遷移,可使用git版本控制
- 配置與項目代碼解耦,統一集中管理
- 靈活易擴展
Gitlab 和 Github 的 CICD 都是在當前 repo 中存放配置,對于開源項目一般就一個 repo 倒也沒什么,但是在公司內部往往有很多服務很多 repo,配置散落在各個 repo 中,不方便統籌管理。
Jenkins 雖然可以將 Jenkinsfile 腳本集中管理,但針對每個項目還需要在 UI 上配置。Jenkins 也有相關插件 configuration-as-code-plugin,沒用過就不評價了。
而 Tekton 所有配置都是以 k8s 詩 Yaml 文件形式存在,即使換了一個集群,只需要應用 Yaml 配置即可無縫遷移。
執行步驟
閱讀須知
- 完成以下步驟需要 k8s 基礎使用能力
- k8s server version >= v1.15
- 以下命令中 alias kc=kubectl
- Tekton 的一些概念和資源在此不再贅述,請查閱官方文檔:https://tekton.dev/docs/pipelines/
- 以下步驟在 macOS 10.15 上測試通過,一些命令在 windows 上可能沒有。
- registry.cn-huhehaote.aliyuncs.com/feng-566/ 旗下鏡像均可公開訪問,但是推送鏡像需要認證。所以需要一個鏡像倉庫用于推送制品鏡像,推薦阿里云鏡像倉庫注冊賬號即可免費使用。
- 接收 github webhook 需要一個擁有公網 IP 的服務器。如果沒有,可使用 pull 模式替代。
- 出現問題請先查看 問題排查
創建 kind 本地集群
使用 kind 創建測試集群。如果你已有 k8s 集群可跳過此步。
cat <<EOF >kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
EOF
kind create cluster --config ./kind-config.yaml
復制代碼
安裝 Tekton
同步鏡像
由于 Tekton 鏡像都是在 gcr.io 上,需要 VPN 才能拉取,所以第一步需要將鏡像同步至國內。這里我寫了腳本(./script/sync.go)將鏡像都同步至阿里云鏡像倉庫,并設為公開訪問,如無必要可跳過此步。
make sync
復制代碼
部署 Tekton
部署 pipeline、trigger、dashboard 三個組件。
kc Apply -f ./src/sync/dst
復制代碼
check:
kc get po
復制代碼
部署 demo app
測試 demo,用于后面流水線滾動更新。
kc apply -f ./demo/go-echo/deploy/deploy.yaml
復制代碼
配置 pipeline
創建 Task 和 Pipeline 資源,每個 Task 為一個獨立任務,Pipeline 則是將多個 Task 串成流水線。
更多 Task 例子可以在官方倉庫找到:https://github.com/tektoncd/catalog
配置 github 和 鏡像倉庫 access token
./manifests/pipeline/sercret.yaml 配置 github 和 Docker registry。
將其中url, username, password 修改為你自己的 access token。
配置目標集群 kubeconfig
./manifests/resource/cluster-kind.yaml 配置部署時 kubectl 使用的配置*。
將其修改為你本地 kind 集群的 kubeconfig。
配置機器人通知
./manifests/pipeline/notify.yaml 配置執行成功后聊天機器人通知地址,可接入釘釘或企業微信。
釘釘機器人文檔:https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
大家可自行創建團隊測試機器人,不需要真實企業認證。
成功后釘釘會收到機器人通知:
應用 pipeline 配置
kc apply -f ./manifests/pipeline
kc apply -f ./manifests/resource
復制代碼
test pipeline run
手動執行 PipelineRun,測試 pipeline 流程。
kc apply -f ./manifests/test/pipeline-run-demo.yaml
復制代碼
check:
kc get pr
復制代碼
Tekton dashboard
通過 dashboard 我們可以查看流水線執行狀態。由于 kind 網絡隔離的原因,此處我們使用 kc port-forward 將端口暴露出來。
kc port-forward svc/tekton-dashboard 9097
# new terminal session
# 打開瀏覽器
open http://localhost:9097/#/namespaces/tekton-pipelines/pipelineruns
復制代碼
流水線執行成功實例:
[Option 1: push 模式] 配置 Tekton triggers
前面的步驟中,我們用手動的方式執行了 pipeline,下面我們配置 Tekton triggers,通過 webhok 的方式自動執行。
Tekton trigger 組件是用來接收 webhook,做一些 校驗,過濾,參數綁定等前處理,然后幫你自動創建 PipelineRun 等資源執行流水線。
kc apply -f ./manifests/triggers
復制代碼
config webhook in github repo
接收 webhook 需要一個擁有公網 ip 的服務器,首先在 github repo 中配置 webhook。
webhook 地址為 http://<your-remote-host>:9080/tekton-el,勾選 Pull requests,Pushs events,token 為 ./manifests/triggers/webhook-token.yaml中的值。
webhook 配置參考文檔: docs.github.com/en/free-pro…
webhook playload 數據結構: docs.github.com/en/free-pro…
利用 ssh 將 webhook 轉發到本地
將 kind 中 eventLister 端口暴露出來:
kc port-forward svc/el-demo-listener 9080:8080
復制代碼
服務端監聽 0.0.0.0 需要 sshd 配置中包含 GatewayPorts clientspecified,詳見: serverfault.com/questions/8…
將服務器 9080 端口轉發到本地 9080 端口:
ssh -N -R 0.0.0.0:9080:localhost:9080 <user>@<your-remote-host> -p 22
復制代碼
check port connected:
nc -v <your-remote-host> 9080
復制代碼
debug webhook
部署成功后參考 測試 CICD 中步驟進行測試。
可通過查看 eventLister 日志進行 debug:
kc logs -l eventlistener=demo-listener
復制代碼
./manifests/triggers/print.yaml print task 將 webhook head 及 body 打印出來。
[Option 2: pull 模式] 配置 CronJob
Tekton 官方并沒有提供類似 Jenkins 那種輪詢 pull 檢測 git repo,有新的 commit 則觸發構建。理由是 pull 模式會對 git 造成較大壓力。
但借助 k8s CronJob,自己實現 pull 模式。./src/pull 我實現了一個簡單的 pull 程序,定期檢查對應倉庫和分支有沒有新的 commit,自動創建 PipelineRun。
./src/pull/deploy/configmap.yaml 為 PipelineRun 模板,修改 params 部分目標 IMAGE,NAME 等參數。
./src/pull/deploy/cronJob.yaml 為 Pull 腳本定時任務, 修改 args 部分需監聽的 repo,branch 等參數。
應用:
kc apply -f ./src/pull/deploy
復制代碼
部署成功后參考 測試 CICD 中步驟進行測試。
測試 CICD
提交 commit 進行測試:
git commit -a -m "build commit" --allow-empty && git push
復制代碼
后記
問題排查
build-image 卡主
build-image 使用 kaniko,不依賴 docker daemon,所以 Dockerfile 中如果使用 golang:1.14 等體積很大的 dockerhub 鏡像,因網絡問題下載很慢甚至失敗,會導致 build 超時,最好將鏡像同步至內網。
git clone auth err
檢查 secret git-auth 是否配置正確。
push image auth err
檢查 secret docker-auth 是否配置正確。pipeline 中推送鏡像地址是否改為你個人鏡像倉庫地址。
run on openshift
部分任務配置了 securityContext.runAsUser: 0,在 openshift 運行需要配置 scc=anyuid。 參考: docs.openshift.com/container-p…
TODO
- pipeline 中途失敗無法發送機器人通知
作者:win5do
鏈接:https://juejin.im/post/6893701305173442567
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。