简介
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分布式构建。
(中间过程很曲折,坑特别多,花了我好几天时间才搭建完毕)