在以往的部署方式中,Jenkins一般都是分離與k8s單獨的安裝集群,但是這種方式存在一些不足的地方:
- 當job比較少的時候有部分slave節點處于空閑狀態,導致資源浪費。
- 當job比較多的時候slave節點可能會出現不夠用的情況,將導致部分job處于等待狀態。
- 當master節點出現問題之后,不能快速恢復,導致后續工作無法進行。
鑒于以上存在的問題,采用k8s的方式來部署Jenkins集群可以很好的解決,在k8s中只部署master節點,并通過pv對所用的job進行持久化存儲,通過k8s-Jenkins插件實現slave節點的動態創建,當job比較多的時候新建slave節點,并且在job執行完之后進行銷毀,并且即使master節點出現問題之后,也可以快速的通過deployment來快速的創建新的master并掛載到之前的pv上。從而達到master的高可用,也避免資源的浪費。
準備
1、插件安裝
在前一篇文章中簡單介紹了k8s插件的安裝,本節中先對其安裝和配置作詳細介紹。登陸Jenkins之后再插件管理中搜索kubernetes,點擊安裝即可。
2、插件配置
點擊進入Jenkins的系統配置,點擊添加cloud,選擇kubernets即可添加對k8s的集群的支持。
-
配置jenkins登陸k8s集群的密鑰
點擊進去Jenkins的憑證管理,添加憑證,類別選擇Kubernetes service Acount,點擊ok即可。
-
配置基本信息
這里主要配置k8s的url地址和用于認證的密鑰
-
配置k8s的pod模板,主要用于生成slave節點。
在Jenkins中提供了兩種方式來添加agent,一種是通過ssh(由master連接到slave來執行任務),另一種是使用JNLP(Java 網絡啟動協議(JNLP) 是一種允許客戶端啟動托管在遠程Web服務器上的應用程序的協議)。這里主要采用第二種方式(由slave去鏈接master節點),結合docker鏡像。
這里主要配置了jnlp協議所對應使用的容器鏡像,同時也可以再添加多個容器,比如:用于進行maven構建的maven容器等。
3、測試
- 創建項目
在Jenkins中創建一個Freestyle類型的項目,取名為test。 - 項目配置
-
添加構建參數
-
現在項目運行的地方(只在slave中運行)
-
打印參數
-
- 執行構建,查看是否動態生成slave
返回創建好的項目,點擊Build with Parameters,輸入參數值,點擊build??梢钥吹焦濣c先有pending(等待pod的創建)再轉換為執行構建
CI
在上一節中對kubernetes插件進行了簡單的應用,這一節將使用github+aliyun+Jenkins來實現項目的自動構建并將生成的鏡像上傳到aliyun鏡像倉庫
- 配置阿里云鏡像倉庫
關于阿里云鏡像倉庫的使用請參照官方文檔,這里新建一個叫jks的倉庫。 -
配置阿里云鏡像倉庫密鑰
點擊進去Jenkins的憑證管理,添加憑證。
- 新建項目
在GitHub上新建一個項目,并將本地的maven項目推送到倉庫中。這里以及準備好了一個項目,當然讀者也可以自行創建自己的項目。https://github.com/tlhhup/tlhhup.git - 新建Jenkins項目
創建一個流水線類型的項目,取名為tlhhup
-
添加構建參數
-
配置流水線
podTemplate(containers: [#聲明使用到的容器 containerTemplate(name: 'maven', image: 'maven:3.5-jdk-8', ttyEnabled: true, command: 'cat'), containerTemplate(name: 'docker', image: 'docker:latest', ttyEnabled: true, command: 'cat') ], serviceAccount:'jenkins',#使用的賬號,在部署Jenkins時創建的 volumes: [ nfsVolume(mountPath: '/root/.m2', serverAddress: '192.168.241.144', serverPath: '/nfs-share'), # 配置nfs服務器的信息,注意必須為真是有效的 hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock') ] ) { node(POD_LABEL) { stage('Get a Maven project') { git 'https://github.com/tlhhup/tlhhup.git' container('maven') { stage('Build a Maven project') { sh 'mvn -DskipTests=true clean package' } } } stage('Build Docker Image'){ container('docker'){# 在docker容器中執行鏡像構建 sh ''' mkdir context cp target/tlhhup-1.0-SNAPSHOT.jar context cp doc/Dockerfile context ''' sh 'docker build -t registry.cn-hangzhou.aliyuncs.com/gitlabci/jks:${BUILD_NUMBER} context' } } stage('Push Docker Image'){ container('docker'){ sh 'echo Push Docker Image' withCredentials([usernamePassword(credentialsId: 'dd', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {#引用配置的密鑰 sh ''' docker login registry.cn-hangzhou.aliyuncs.com -u ${dockerHubUser} -p ${dockerHubPassword} docker push registry.cn-hangzhou.aliyuncs.com/gitlabci/jks:${BUILD_NUMBER} ''' } } } stage('Deploy'){ input "Does the staging environment look ok?" } } }
執行構建