Kubernetes 建立 pipeline
Last updated
Was this helpful?
Last updated
Was this helpful?
當初使用 Rancher2.0 時,發現有pipeline功能,於是抱著嘗試的心態玩看看,發現也太神奇了吧,然後就看看Rancher2.0是怎麼建立pipeline的流程,於是就參考他所有的架構,仿造出一個pipeline。
以下範例使用Jenkins、gitlab和私有docker registry。
也就是當 git 有新的 commit,就會自動打包成 docker images,並上傳到私有docker registry, 然後再用 k8s 佈署所做好的 images 至 pod。
建立流程如下:
簡單的說就是開發者只需要 commit程式到 git,你的程式就會自動佈署到指定的環境,不要再去管其他事情啦
請先建立好 k8s,此篇不說明如何安裝 k8s
此篇的 k8s 和 OpenStack 介接,使用 cinder 的 StorageClass 來動態產生儲存區,如果沒有和OpenStack 介接,請自行使用 PV 和 PVC 建立儲存區
與 OpenStack 介接,需在/etc/kubernetes/cloud-config裡設定OpenStack
這裡使用已有的 Gitlab,先自行建立新的 project,再將範例裡所有的檔案複製到剛剛新增的專案
檔案結構如下:
Dockerfile: jenkins 根據 Dockerfile,將目錄下的檔案包成 docekr images。
Jenkinsfile: jenkins 根據 jenkinsfile,執行 pipeline 流程。
deployment.yml: kubernetes 佈署此應用程式所需。
複製完後 push 回 gitlab
請自行建立 container registry,本範例是用 Harbor
這裡利用 k8s 的 helm來啟動jenkins,首先安裝helm
初始化helm
檢查 Tiller Server 是否建立成功
jenkins需要永久儲存區,這裡設定 cinder 為預設的 storage class,新增 storage.yml
建立 storage class
設定 jenkins 參數,設定密碼以及安裝 gitlab plugin
啟動 jenkins
取得 jenkins UI IP
建立 jenkins admin權限
serviceaccount: 冒號左邊為namespace,右邊是serviceaccount,由於預設k8s會有一個初始的default的serviceaccount,然後我們又是在default namespace,所以都填default
登入UI 帳號: admin 密碼: openstack
jenkins 需要 slave 做事,而 k8s 的 jenkins slave 是動態產生的,只有進行工作時才會建立,由於我們需要讓 jenkins-slave 可以幫我們打包 docker images,再佈署至 k8s 上,所以 slave 需要有 docker 和kubectl 指令,預設的 slave 沒有這兩這指令,所以要修改 image 來源
點選左方管理jenkins → 右方設定系統 → 找到 Kubernetes 的 images
修改 Pod Template,修改 name 為 jenkins-slave (比較好辨認)和 images 為 bash8989/jnlp-slave-docker:3.26-1 ,(此 image 去docker hub上隨意找的,實際上應該要自己打包比較安全)
這裡要修改一下記憶體限制,預設只能使用 256MB,但是在打包的時候記憶體會不夠用,所以請點選下方的進階,然後修改記憶體為 512MB (或是更大)
後再點選下方的 Add Container,再新增一個 container,是可以使用kubectl指令的container, 名稱為 jenkins-slave-kubectl,image 是使用 lachlanevenson/k8s-kubectl:v1.10.12
接下來新增 volume
Host path Volume: 需要將 host 上的 docker 行程 mount 至 slave,這樣 slave 的 docker 指令才能正常運作。 路徑為 /var/run/docker.sock
Secret volume: 新增 docker registry 的 CA 認證,由於 slave 跟 docker registry 只能走 https, 因此需要 CA 證書,這裡的 Secret name 先填入 registry,稍後會在 k8s 裡新增 secret, 至於 Mount path,根據你的 docker registry 的 IP 修改就好,路徑為 /etc/docker/certs.d/10.40.1.175/
Secret volume: 新增 kubeconfig,讓 kubectl 可以幫你佈署程式至你的 k8s ,Secret name 先填入 kubeconfig,稍後會在 k8s 新增,Mount path 為 /home/jenkins/.kube,
新增 docker registry CA 證書,證書請自行產生,kubernetes 的 secret 要先用 base64 加密,新增 secret.yml
內容如下:
新增 kubeconfig ,請先將 kubeconfig 內容用 base64 加密,再新增至 secretkube.yml 的 config 處
由於需要知道 docker registry 的帳號密碼,所以要新增認證
點選左側Credentials → 右方global → 左側 Add Credentials,選擇username and password, 然後填入你的 registry 帳號密碼,ID 可以自行填入好記的名稱,如果不填他會隨機產生 ID
修改 gitlab 上的 Jenkinsfile,修改認證ID,此範例原先沒有自行填入ID,所以是使用隨機的ID,因此需修改,將 ID 改為 新增 docker registry 帳密 步驟的 ID ,上圖範例 ID 是 registry
可以根據應用程式佈署在哪個 k8s 的 namespace,此篇是用預設 default ,所以請將這行 -n jenkins移除
改完後請commit and push
點選左側新增作業 → Multibranch Pipeline,名稱自取。
在 branch source 填入 git project 網址,然後儲存
新增完成後,應該會看到 master 的 branch ,然後 jenkins 會掃描 git project 裡的 Jenkinsfile,然後根據 Jenkinsfile 進行 pipeline
假如沒有掃描,可以點選 master → 左方的馬上建置
開始建置後,可以看到左下方的slave 被建立
可以使用 kubectl get pod 看到 slave
建置中可以點選 master,點選後左側有建置次數,以及建置的 stage
點選左方的某次的建置,進入後點選 console output,可以看見建置過程的 output,可以用來查看建置失敗原因
pipeline流程成功後,可以查看範例程式 hello-world 是否成功佈署
根據你 k8s 節點 IP,在瀏覽器輸入 IP:port(這裡是32464),即看到應用程式
當 gitlab 有新的 commit 時,會自動觸發 pipeline 流程,需要建立 webhook token 點選 master,左側檢視設定 → Build Triggers → 右下方進階 → Secret token → generate
回到 gitlab 的專案,選擇左下 settings → Intergrations,填入 webhook 和 token,可以勾選你想觸發的方式,下方 SSL 請不要打勾 ,完成後按 add webhook
修改 git project 的 main.go,將文字改成 Hello OpenStack World
存檔然後 commit 和 push ,就會看到 jenkins 自己開始建置了,
建置完成後,可以看到應用程式已更新
jenkins 可以透過兩種方法撰寫 pipeline 流程
Jenkinsfile: 範例的 Jenkinsfile 裡面有:
建立映像檔: 使用 docker build 指令和 tag,這裡 tag 版號是用 jenkins 建置第幾次為版號
放置映像檔: 使用 docker push 指令
佈署: 先用 sed 取代 deployment.yml 裡面的 images 的版號,然後使用 kubectl 佈署程式
pipeline script: 使用 Groovy 撰寫
docker registry: 可以查看 jenkins 是否有 push images 到 registry,有的話應該會如下圖,沒有的話可以看 console output 處理錯誤
範例程式:
複製 token,以及 上面紅框 webhook URL: , 但是要注意 webhook 的網址要根據你如何存取 jenkins 服務做修改,這裡是用 Loadbalancer 的方式,所以 webhook 應該是: