Jenkins master位于k8s集群外,实现jenkins slave的动态构建
一、简述
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