簡介

Jenkins的Master-Slave分布式構建,就是通過將構建過程分配到從屬Slave節點上,從而減輕Master節點的壓力,而且同時可以構建多個,有點類似負載均衡的概念。
k8s+Docker+Jenkins持續集成架構圖:

環境介紹
安裝環境說明
| ip | 角色 | 內存 | 軟件 |
|---|---|---|---|
| 192.168.1.50 | 代碼托管服務器 | 8G | Gitlab |
| 192.168.1.52 | Docker倉庫 | 8G | Harbor |
| 192.168.1.36 | k8s-master | 8G | k8s,docker,NFS |
| 192.168.1.37 | k8s-node1 | 8G | k8s,docker,NFS |
| 192.168.1.38 | k8s-node2 | 8G | k8s,docker,NFS |
k8s安裝這里就不具體介紹了
安裝配置NFS
所有節點都需要執行:
yum install -y nfs-utils
master執行:創建共享目錄:
mkdir -p /opt/nfs/jenkins
#編寫NFS的共享配置
vi /etc/exports
/opt/nfs/jenkins *(rw,no_root_squash)
開啟服務:
#開機啟動
systemctl enable nfs
#啟動
systemctl start nfs
查看NFS共享目錄
showmount -e 192.168.1.36

k8s安裝Jenkins-Master
下文所有yaml在https://gitee.com/wj204811/wj204811/tree/master/k8s-jenkins中
cd nfs-client/
kubectl create -f .
kubectl get pods

cd ../jenkins-master/
kubectl create namespace kube-ops
kubectl create -f .
kubectl get pods --namespace kube-ops
kubectl get svc --namespace kube-ops
kubectl get pod --namespace kube-ops -o wide

瀏覽器直接訪問暴露出來的端口:http://192.168.1.36:32138/,可以訪問jenkins
至於具體的k8s_jenkins_jenkins-0_kube-ops后面字符是什么,要自己去看了。
docker logs k8s_jenkins_jenkins-0_kube-ops_d572ec37-07dd-4fe3-b212-3df5ceec121d_0

選擇插件來安裝
開始使用jenkins:進入我們熟悉的頁面
Jenkins-Master基本插件安裝
cd /opt/nfs/jenkins/kube-ops-jenkins-home-jenkins-0-pvc-a3a4e5c6-1ba0-41d1-a438-e6029a45b834
cd updates
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
這個頁面:
Update Site需要改成清華的url
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
點擊提交。
訪問:http://192.168.1.36:32138/restart 把jenkins重新啟動,等待一段時間,重啟完成后,安裝一些插件。




安裝k8s插件
安裝完成后,進入系統配置

點擊那行下划線,點擊add a new cloud,選擇k8s

配置集群,k8s地址固定:https://kubernetes.default.svc.cluster.local/
名稱空間填寫:kube-ops
點擊連接測試,看能否連接上
jenkins連接地址:http://jenkins.kube-ops.svc.cluster.local:8080
點擊save apply,然后重啟jenkins
構建jenkins-slave自定義鏡像
Jenkins-Master在構建Job的時候,Kubernetes會創建Jenkins-Slave的Pod來完成Job的構建。我們選擇 運行Jenkins-Slave的鏡像為官方推薦鏡像:jenkins/jnlp-slave:latest,但是這個鏡像里面並沒有Maven 環境,為了方便使用,我們需要自定義一個新的鏡像:
所有文件已經上傳到碼雲了:https://gitee.com/wj204811/wj204811/tree/master/k8s-jenkins-slave
mkdir jenkins-slave
上傳所有文件到jenkins-slave文件夾下

構建鏡像:
docker build -t jenkins-slave-maven:lasted .
等待鏡像構建,構建成功后,我們需要把鏡像上傳到harbor中

docker tag jenkins-slave-maven:lasted 192.168.1.52:85/library/jenkins-slave-maven:lasted
#登陸harbor,如果登陸失敗,看我這篇博客 https://www.cnblogs.com/wwjj4811/p/14220541.html
docker login -u admin -p Harbor12345 192.168.1.52:85
docker push 192.168.1.52:85/library/jenkins-slave-maven:lasted


jenkins-slave創建
創建jenkins流水線

創建憑證:


設置流水線腳本:
def git_address ="http://192.168.1.50:82/root/tensquare_back.git"
def git_auth = "070a1a0f-6f41-4b47-8b4e-9621087df6fd"
//創建一個Pod的模板,label為jenkins-slave
podTemplate(label: 'jenkins-slave', cloud: 'kubernetes', containers: [
containerTemplate(
name: 'jnlp',
image: "192.168.1.52:85/library/jenkins-slave-maven:lasted"
)
]
)
{
//引用jenkins-slave的pod模塊來構建Jenkins-Slave的pod
node("jenkins-slave"){
// 第一步
stage('拉取代碼'){
checkout([$class: 'GitSCM', branches: [[name: 'master']],userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
}
}
}

點擊保存,出來構建該流水線進行測試
在節點管理中,可以看到k8s為我們動態創建了一個節點

等待構建結束后,slave會被動態回收

構建成功。

至此:k8s實現了jenkins的Master-Slave分布式構建。
(中間過程很曲折,坑特別多,花了我好幾天時間才搭建完畢)
