一、簡述
Jenkins基於"kubernetes plugin"與k8s集成,可以使Jenkins slave以pod的形式在k8s集群內部動態構建、運行、銷毀等。
通過 jenkinsci/kubernetes-plugin 了解到,Jenkins master既可以運行在k8s集群內,也可運行在k8s集群外,但是Jenkins slave的整個生命周期都是在k8s集群內,並且通過JNLP與Jenkins master連接。
要想Jenkins master在k8s運行,我們必須提前創建StatefulSet、Service、Ingress、ServiceAccount等系列yaml文件進行部署;而實際Jenkins master在生產中先於k8s使用並已獨立運行,如果再次在K8S內部部署,那么我們還需進行遷移,增加了工作量。既然"kubernetes plugin"支持Jenkins master在k8s集群外部,那么就不必要再在k8s中創建了
。
下面我們就來詳細介紹下jenkins master位於k8s集群外,實現jenkins slave的動態構建,其中有很多細節問題牽扯到docker、k8s的使用問題,我們一一講解。
二、前期准備
1、搭建k8s
利用kubeadm搭建k8s集群環境,參考鏈接:https://www.cnblogs.com/deny/p/12242755.html
2、搭建外部Jenkins
1)安裝Jenkins master
參考鏈接:https://www.cnblogs.com/deny/p/10121001.html
三、配置 Jenkins master
1 、安裝 kubernetes plugin 插件
2 、kubernetes plugin與k8s連接配置
1)添加kubernetes雲
Manager Jenkins-----Manage Nodes and Clouds -------Configure Clouds -----Add a new cloud
這里連接k8s認證方式有兩種,請參考鏈接:https://www.cnblogs.com/deny/p/13848781.html
3、配置jenkins master
- Jenkins 地址:Jenkins master的地址。
- Jenkins 通道:Jenkins slave通過此通道與Jenkins master連接,注意此為
tcp連接
,不要加上http
。
4、創建slave掛載PV和pvc
我們在master創建nfs主目錄,但是在主目錄下通過子目錄對k8s中的服務提供存儲,這樣可以通過子目錄對所有服務的資源進行隔離。這里我們主要創建workspace和m2目錄,分別用作於Jenkins slave的workspace以及maven插件目錄
在master創建目錄,並配置nfs。(nfs的搭建方式請參考:https://www.cnblogs.com/deny/p/10254093.html)
[root@k8s-master data]# mkdir -p /data/nfs/{workspace,m2} [root@k8s-master data]# cat /etc/exports /data/nfs *(rw,no_root_squash,no_all_squash,sync) [root@k8s-master data]# service nfs start Redirecting to /bin/systemctl start nfs.service [root@k8s-master data]# exportfs -rv exporting *:/data/nfs
創建pv和pvc
[root@k8s-master yaml]# cat jenkins-slave-workspace-pv.yaml --- apiVersion: v1 kind: PersistentVolume metadata: name: jenkins-slave-workspace spec: persistentVolumeReclaimPolicy: Recycle capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: server: 192.168.0.211 path: /data/nfs/workspace --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: jenkins-slave-workspace spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi
[root@k8s-master yaml]# cat jenkins-slave-m2-pv.yaml --- apiVersion: v1 kind: PersistentVolume metadata: name: jenkins-slave-m2 spec: persistentVolumeReclaimPolicy: Recycle capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: server: 192.168.0.211 path: /data/nfs/m2 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: jenkins-slave-m2 spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi
[root@k8s-master yaml]# kubectl create -f jenkins-slave-workspace-pv.yaml
persistentvolume/jenkins-slave-workspace created
persistentvolumeclaim/jenkins-slave-workspace created
[root@k8s-master yaml]# kubectl create -f jenkins-slave-m2-pv.yaml
persistentvolume/jenkins-slave-m2 created
persistentvolumeclaim/jenkins-slave-m2 created
5、配置 pod template 和 container template
k8s中最小單元為pod,在此我們定義Jenkins slave所在pod的信息。
- 名稱:pod名稱,在k8s中實際名稱為jenkins-slave-隨機值。
- 標簽列表:此處標簽即標識Jenkins agent的,如流水線中agent定義調度在哪個slave上運行。當然此處我們也可不配置,kubernetes plugin將會默認使用
jenkins/jnlp-slave:alpine
鏡像創建。但是kubernetes-plugin官方已停止維護
此鏡像,而統一使用jenkins/inbound-agent
。因此我們需要進行重新設置。 名稱:pod中容器的名稱,注意此處必須設置為jnlp,才能對鏡像重寫使用jenkins/inbound-agent
,否則將會出現以下問題:k8s同時拉取jenkins/inbound-agent
和jenkins/jnlp-slave:alpine
兩個鏡像,第一個為重寫后的實際使用鏡像,第二個為默認鏡像,導致jenkins-slave無法正常運行,不斷重復構建。 - Docker鏡像:當名稱設置為jnlp后,
jenkins/inbound-agent
即為重寫后的鏡像,否則默認使用jenkins/jnlp-slave:alpine
。 - 工作目錄:Jenkins slave的默認工作目錄,構建時將會在此目錄下創建workspace。
- 運行的命令和命令參數: 其中運行的命令必須要留空,否則會重寫鏡像的默認entrypoint,導致agent 無法連接到master,下面我們會進行演示說明。
- 資源限制:默認的容器是沒有資源限制的,我們在此添加了cpu和memory限制,大家可根據實際情況進行修改。
四、使用Jenkins slave構建mave項目
1、重構Jenkins-slave鏡像
這里重新構建jenkins/inbound-agent鏡像,添加maven,並修改插件源為華為源,Dockerfile如下:
先修改maven的插件源
[root@192 jenkins]# tar -xf apache-maven-3.6.3-bin.tar.gz [root@192 jenkins]# cd apache-maven-3.6.3/ [root@192 apache-maven-3.6.3]# ls bin boot conf lib LICENSE NOTICE README.txt [root@192 apache-maven-3.6.3]#
conf/settings.xml文件中的mirrors節點中添加如下內容:
<mirror> <id>huaweicloud</id> <mirrorOf>*</mirrorOf> <url>https://mirrors.huaweicloud.com/repository/maven/</url> </mirror>
修改后重命名目錄,並重新打成tar包
[root@192 jenkins]# mv apache-maven-3.6.3 maven3.6 [root@192 jenkins]# tar -czf maven3.6.tar.gz maven3.6/ [root@192 jenkins]# ls apache-maven-3.6.3-bin.tar.gz maven3.6 maven3.6.tar.gz
Dockerfile如下:
FROM 192.168.0.217:5000/library/inbound-agent:latest USER root ADD maven3.6.tar.gz /usr/local RUN ln -s /usr/local/maven3.6/bin/mvn /usr/local/bin USER jenkins