基於Kubernetes的CI/CD&Pipeline流水線解決方案

Pipeline 介紹

要實現在 Jenkins 中的構建工作,可以有多種方式,我們這裏採用比較常用的 Pipeline 這種方式。Pipeline,簡單來說,就是一套運行在 Jenkins 上的工作流框架,將原來獨立運行於單個或者多個節點的任務連接起來,實現單個任務難以完成的複雜流程編排和可視化的工作。

總體架構

在開始我們的工作之前,讓我們花一點時間分析開始使用Jenkins使用Kubernetes容器所需的工作流。Kubernetes對於開發者來說是一個驚人的開源容器編排引擎。Kubernetes是由Google發起的,這使Kubernetes在使用多個開源容器項目方面有一個驚人的優勢。默認情況下,Docker更受Kubernetes的使用者支持和青睞。使用Docker容器的工作流程如下圖所示:

基於Kubernetes的CI/CD&Pipeline流水線解決方案

k8s Jenkins構建持續集成流程

基於Kubernetes的CI/CD&Pipeline流水線解決方案

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章