Jenkins的Master-Slave分布式架构主要是为了解决Jenkins单点构建任务多、负载较高、性能不足的场景。
Master-Slave相当于Server和Agent的概念。Master提供web接口让用户来管理job和Slave,job可以运行在Master本机或者被分配到Slave上运行构建。
一个Master(Jenkins服务所在机器)可以关联多个Slave用来为不同的job或相同的job的不同配置来
实现Master-Slave分布式架构,重点就是管理配置Slave;Slave的配置方式有以下几种:
-
SSH agent
: 即把某个虚拟机或物理机作为agent来执行任务 -
Docker Agent
:在另外的一台虚拟机或物理机上,安装docker Agent,通过ssh或docker远程协议的方式,让agent来执行任务
这里来详细说说如何配置Docker Agent模式
准备
说明 | Description |
---|---|
10.3.23.191 | Jenkins Master,需提前安装好Jenkins |
10.3.23.207 | Slave,需提前安装好Docker环境 |
Docker版本 | 20.10.9 |
配置Slave
由于Master要通过docker 远程协议进行通信,所以需要把slave上docker的远程协议打开。
登录Slave机器
# 查询docker服务文件
systemctl status docker|grep Loaded|grep -Po '(?<=Loaded: loaded \()[^;]*'
/usr/lib/systemd/system/docker.service
# 查找启动参数
cat $(systemctl status docker|grep Loaded|grep -Po '(?<=Loaded: loaded \()[^;]*')|grep dockerd
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 先备份docker.service
SERVICE_FILE=$(systemctl status docker|grep Loaded|grep -Po '(?<=Loaded: loaded \()[^;]*') \
&& sudo cp ${SERVICE_FILE} ${SERVICE_FILE}.bak
# 删除dockerd的 -H参数
SERVICE_FILE=$(systemctl status docker|grep Loaded|grep -Po '(?<=Loaded: loaded \()[^;]*') \
&& sudo sed -i -e 's/ -H fd:\/\/ / /g' ${SERVICE_FILE}
# 再次查看验证
cat $(systemctl status docker|grep Loaded|grep -Po '(?<=Loaded: loaded \()[^;]*')|grep dockerd
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
vi /etc/docker/daemon.json (如果文件不存在,直接创建)
在文件内增加以下配置
"hosts":[
"fd://",
"tcp://0.0.0.0:2375"
]
我的配置后内容如下:
{
"exec-opts": ["native.cgroupdriver=systemd"],
"hosts":[
"fd://",
"tcp://0.0.0.0:2375"
]
}
然后重启docker
systemctl daemon-reload && systemctl restart docker && systemctl status docker
为验证结果是否正确,我们可以在另外一起机器上进行执行以下命令进行测试
# docker -H tcp://10.3.23.207:2375 version
Client: Docker Engine - Community
Version: 20.10.21
API version: 1.41
Go version: go1.18.7
Git commit: baeda1f
Built: Tue Oct 25 18:04:24 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.9
API version: 1.41 (minimum version 1.12)
Go version: go1.16.8
Git commit: 79ea9d3
Built: Mon Oct 4 16:06:37 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.9
GitCommit: 1c90a442489720eec95342e1789ee8a5e1b9536f
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
能正确显示Server的版本,说明Slave的Docker远程链接已打开
配置Master
登录Jenkins
-
安装Docker插件
image.png
进入 系统管理-系统配置-插件管理-可选插件 ,搜索“云提供商”,找到Docker
插件,如下图
点击install without restart
安装插件 -
配置节点
进入 系统管理-系统配置-节点管理-可选插件
-
Docker Host URI
为slave地址,2375是docker默认端口 - 点击
Test Connection
按钮,测试能否联通slave docker
-
Docker Image
是指运行在slave上、作为agent的docker镜像;这里选择Jenkins官方的jenkins/agent:latest
-
Remote File System Root
是指Docker Image
运行后,容器内的系统路径。注意:这是容器内的路径,并不是slave上的路径;针对容器jenkins/agent:latest
,这里要填写/home/jenkins/agent
,千万不要填写/home/jenkins
,否则可能会在slave容器内执行shell命令时,报错:process apparently never started in /home/jenkins/
-
Connect method
:注意下,这里选择Attach Docker container
,这个跟上面的Docker Image
有关系。
按以上步骤配置完即可。
测试
我们新建一个pipeline来测试这个docker agent是否可用
image.png编写pipeline
pipeline {
agent {
label 'docker-slave'
}
stages {
stage('Hello') {
steps {
echo 'Hello World'
sh 'pwd'
sh 'sleep 20'
echo 'Finish'
}
}
}
}
- 这里注意下, 要指定agent.label文件docker-slave,这个名字是上面配置master时的
Docker Agent templates
一致 - 这里sleep了20s,就是为了到slave上看看任务是否启动
构建之前,建议先去slave上把jenkins/agent:latest
镜像拉取下来
docker pull jenkins/agent:latest
开始构建后,先到slave上看看
[root@K8STest0001 ~]# docker ps | grep jenkins
7cc2da5531c2 jenkins/agent:latest "/bin/sh" 2 seconds ago Up 2 seconds blissful_euclid
可用看到,slave上已经运行了 jenkins/agent
查看jenkins执行日志:
image.png
从日志上看,说明此次执行是在docker agent上执行的!
网友评论