jenkins通過Docker plugin部署slave

Jenkis分佈式預熱

Jenkins是Master-Slave架構,Master節點提供Web GUI 和API來管理、分配、運行構建任務;Slave節點只是用來運行Master節點分配的構建任務;因此Slave可以有效減輕Master的工作負載,這也意味着Slave節點可以分佈在不同平臺並且無需安裝jenkins的完整包。

Master和Slave通信方式:

  1. Master->Slave,最常用的方式,在網絡聯通情況下,Master通過ssh主動與agent進行通信;
  2. Slave->Master,在Slave不可訪問的情況下,通過Java Web Start(JNLP)由Slave訪問Master;

Jenkins Master節點將基於以上兩種方式,自動完成剩下的自動部署工作,如複製Slave所需的二進制文件以及啓動/停止Slave等操作。

當然Jenkins還提供更靈活的部署方式,即基於ssh通過腳本來登錄Slave節點。過程如下:

  1. 通過"http://yourserver:port/jnlpJars/agent.jar"下載Slave節點所需的最小運行包;
  2. 通過“java -jar agent.jar”啓動Slave節點並配合腳本管理;

當Slave建立好後,只需在Master上根據"node label"將任務分配到指定的節點上運行。

動態創建Docker slave

通常情況下Slave在完成分配的構建任務後處於空閒狀態,在後臺一直運行而不會自動銷燬釋放資源。在docker項目中,我們藉助Docker plugin實現動態創建Docker slave,執行完構建任務後自行銷燬。

準備

組件 功能
Docker plugin jenkins插件
jenkins/ssh-slave 提供ssh協議的基礎鏡像,配合Docker plugin使用
10.10.2.33 提供docker環境的宿主機,用於運行slave節點

正如文章開頭部分"Jenkins分佈式預熱"中提到的,我們需要通過ssh協議使master和slave進行通信,因此使用 jenkins/ssh-slave提供ssh協議的基礎鏡像。而Docker plugin 會根據配置參數通過ssh協議創建一個jenkins slave的鏡像,用來執行master分配的任務了。

Docker plugin具體處理流程如下:
在這裏插入圖片描述

具體實現

slave宿主機配置

#在宿主機上安裝docker環境,在此不做介紹
#拉取提供ssh協議的基礎鏡像
docker pull jenkins/ssh-slave
#進入鏡像生成ssh 祕鑰
docker run -it jenkins/ssh-slave /bin/bash 
#生成祕鑰
ssh-keygen
#開放22端口,提供訪問docker plugin訪問
root@4adf0e68a94b:/home/jenkins# cd /root/.ssh
root@4adf0e68a94b:~/.ssh# ls
id_rsa  id_rsa.pub
root@4adf0e68a94b:~/.ssh# cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCdxQWjtd3uskQDB+h1cJ+IHWuNi5xoAtWhrlIWOR37SgfbHyIFhOc+M1OxgBd+i/OWNPcQKsVTyijSMpTWjn6j0CAI4NG+k30TRZ3iocQ/1B0Ivemil3u2vxeXn0sP0hPjThQuNlOG/2tsCJxY82LskmxJ7xXA5lnmfqhvrWZW7Vn5WSbLinyEPxlkMkwOwlnjphtqQbCEYVqTs3CmFGF/TPLIZ9vTzyc6kDaeUmGXMTIbBdcb1kWQNvmdt+bnXiHMRmec5fMOwnxfgs+7MwwVbYpIhFdgJgkWhpUPrAmm6assLDTf8y0psOvXmn/UMvWrJkPTcJpD3259u+VlkK7 root@4adf0e68a94b
#啓動鏡像
#啓動格式如下:
#docker run jenkins/ssh-slave "<public key>"
docker run -d -p 22:22 --name jenkins-slave jenkins/ssh-slave "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCdxQWjtd3uskQDB+h1cJ+IHWuNi5xoAtWhrlIWOR37SgfbHyIFhOc+M1OxgBd+i/OWNPcQKsVTyijSMpTWjn6j0CAI4NG+k30TRZ3iocQ/1B0Ivemil3u2vxeXn0sP0hPjThQuNlOG/2tsCJxY82LskmxJ7xXA5lnmfqhvrWZW7Vn5WSbLinyEPxlkMkwOwlnjphtqQbCEYVqTs3CmFGF/TPLIZ9vTzyc6kDaeUmGXMTIbBdcb1kWQNvmdt+bnXiHMRmec5fMOwnxfgs+7MwwVbYpIhFdgJgkWhpUPrAmm6assLDTf8y0psOvXmn/UMvWrJkPTcJpD3259u+VlkK7 root@4adf0e68a94b"

jenkins配置

1.安裝Docker plugin插件

2.配置插件
“Manage Jenkins”-“Configure System”-“Cloud”
在這裏插入圖片描述
3.配置docker cloud
在這裏插入圖片描述”Docker Host URI" 是slave宿主機的tcp socket,master的docker plugin通過這個tcp連接對宿主的docker環境進行操作。

4.Docker Agent template配置
在這裏插入圖片描述Lables 是master綁定某個slave的標籤;
Name 是新建容器的名稱;
Docker Image是容器運行的鏡像;
Volumes 是外部掛載,默認情況下都是使用容器內部提供的工具,我們需要根據實際情況使用掛載外部資源;
在這裏插入圖片描述/home/jenkins是jenkins slave的運行目錄,我們通過Volumes已經掛載外部資源;
JavaPath是容器內自帶的java,我們可以通過下面步驟進行修改爲項目中使用的工具;
在這裏插入圖片描述Docker Agent tempaltes的環境變量用於定義ssh登錄的祕鑰;
Tool Locations 是根據Volumes掛載,修改爲我們項目中使用的工具;

測試

新建mvn項目配置

1.通過lable expression綁定至對應Lable 標籤的jenkins docker slave 節點。
在這裏插入圖片描述2.mvn 構建
在這裏插入圖片描述3.構建過程
在這裏插入圖片描述通過jenkins master/slave實現spring boot+docker的一個持續交付過程。

注意:由於spring boot 環境需要打包、構建、上傳私有庫,因此需要jenkins slave節點對宿主機的docker engine有操作權限,因此在docker 設置時通過"/var/run/docker.sock:/var/run/docker.sock"及容器屬主的進行映射。
權限問題可參考:從socket權限問題重新認識docker架構

總結

雖然我們通過jenkins docker slave在一定程度上可以爲master減負,在實際項目中可能出現slave的資源分配不均,是否支持負載均衡等問題,是我們在後續項目不斷增多的情況下考慮提高交付效率可能需要考慮的。

參考:
Jenkins Distributed builds
Docker plugin

PS:如果你對博文感興趣,請關注我的公衆號“木訥大叔愛運維”,與你分享運維路上的點滴。

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