基於Kubernetes的CI/CD&Pipeline流水線解決方案
要實現在 Jenkins 中的構建工作,可以有多種方式,我們這裏采用比較常用的 Pipeline 這種方式。Pipeline,簡單來說,就是一套運行在 Jenkins 上的工作流框架,將原來獨立運行於單個或者多個節點的任務連接起來,實現單個任務難以完成的復雜流程編排和可視化的工作。
總體架構
在開始我們的工作之前,讓我們花一點時間分析開始使用Jenkins使用Kubernetes容器所需的工作流。Kubernetes對於開發者來說是一個驚人的開源容器編排引擎。Kubernetes是由Google發起的,這使Kubernetes在使用多個開源容器項目方面有一個驚人的優勢。默認情況下,Docker更受Kubernetes的使用者支持和青睞。使用Docker容器的工作流程如下圖所示:
k8s Jenkins構建持續集成流程
Docker技術這些應用場景
參考文檔:https://blog.csdn.net/xiegh2014/article/details/80456486
部署準備
gogs代碼管理 git服務器安裝參考:https://blog.csdn.net/xiegh2014/article/details/81434421 Harbor鏡像管理 持久化存儲 NFS安裝 1、使用yum源安裝 yum -y install nfs-utils -y vim /etc/exports /data/qas *(rw,no_root_squash) 2、啟動nfs服務 開機啟動 systemctl enable rpcbind.service systemctl enable nfs-server.service 啟動nfs服務 systemctl start rpcbind.service systemctl start nfs-server.service 3、檢查 NFS 服務器端是否有目錄共享 showmount -e 192.168.58.110 GlusterFS集群安裝參考文檔:
安裝步驟
創建namespace命名空間:
kubectl create namespace kube-jenkins
創建PVC對象:
kubectl create -f jenkins-pvc.yaml
創建rbac相關的資源對象:
kubectl create -f jenkins-rbac.yaml
創建Jenkins服務:
kubectl create -f jenkins.yaml
測試
node { stage(‘ git倉庫拉代碼‘) { // for display purposes sh "echo ‘git checkout‘" } stage(‘構建代碼‘) { sh "echo ‘Build...‘" } stage(‘自動化測試‘) { sh "echo ‘deploy...‘" } stage(‘發布代碼K8S‘) { sh "echo ‘deploy...‘" } }
離線包下載
鏈接:https://share.weiyun.com/5pCfEWm 密碼:kq3dwn
鏈接:https://share.weiyun.com/5pf0e0G 密碼:pejdye
鏈接:https://share.weiyun.com/5m4ADMk 密碼:x4uh4c
鏈接:https://share.weiyun.com/5FFbM3B 密碼:y4fcff
openssl pkcs12 -export -out admin.pfx -inkey admin-key.pem -in admin.pem -certfile ca.pem
傳統CICD存在的問題
Jenkins 安裝完成了,接下來我們不用急著就去使用,我們要了解下在 Kubernetes 環境下面使用 Jenkins 有什麽好處。
我們知道持續構建與發布是我們日常工作中必不可少的一個步驟,目前大多公司都采用 Jenkins 集群來搭建符合需求的 CI/CD 流程,然而傳統的 Jenkins Slave 一主多從方式會存在一些痛點,比如:
- 主 Master 發生單點故障時,整個流程都不可用了
- 每個 Slave 的配置環境不一樣,來完成不同語言的編譯打包等操作,但是這些差異化的配置導致管理起來非常不方便,維護起來也是比較費勁
- 資源分配不均衡,有的 Slave 要運行的 job 出現排隊等待,而有的 Slave 處於空閑狀態
- 資源有浪費,每臺 Slave 可能是物理機或者虛擬機,當 Slave 處於空閑狀態時,也不會完全釋放掉資源。
Pipeline&CICD優點
正因為上面的這些種種痛點,我們渴望一種更高效更可靠的方式來完成這個 CI/CD 流程,而 Docker 虛擬化容器技術能很好的解決這個痛點,又特別是在 Kubernetes 集群環境下面能夠更好來解決上面的問題,下圖是基於 Kubernetes 搭建 Jenkins 集群的簡單示意圖:
- 服務高可用,當 Jenkins Master 出現故障時,Kubernetes 會自動創建一個新的 Jenkins Master 容器,並且將 Volume 分配給新創建的容器,保證數據不丟失,從而達到集群服務高可用。
- 動態伸縮,合理使用資源,每次運行 Job 時,會自動創建一個 Jenkins Slave,Job 完成後,Slave 自動註銷並刪除容器,資源自動釋放,而且 Kubernetes 會根據每個資源的使用情況,動態分配 Slave 到空閑的節點上創建,降低出現因某節點資源利用率高,還排隊等待在該節點的情況。
- 擴展性好,當 Kubernetes 集群的資源嚴重不足而導致 Job 排隊等待時,可以很容易的添加一個 Kubernetes Node 到集群中,從而實現擴展。
缺點
jnlp-slave pod 無法刪除
如果 jnlp-slave pod創建失敗,它會不斷的嘗試創建新的pod,並試圖連接jenkins,一段時間後,就會創造很多失敗的jnlp-slave pod。如果遇到這種情況,需 要盡早中斷任務並刪除失敗的pod。(需要手動刪除jnlp-slave pod)
GIT地址
https://github.com/xgh2016/k8s-CICD-Pipeline
基於Kubernetes的CI/CD&Pipeline流水線解決方案