美文网首页
jenkins slave分布式环境- docker agent

jenkins slave分布式环境- docker agent

作者: heichong | 来源:发表于2022-12-26 09:11 被阅读0次

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

  1. 安装Docker插件
    进入 系统管理-系统配置-插件管理-可选插件 ,搜索“云提供商”,找到Docker 插件,如下图

    image.png
    点击install without restart安装插件
  2. 配置节点
    进入 系统管理-系统配置-节点管理-可选插件

image.png image.png image.png
  • Docker Host URI 为slave地址,2375是docker默认端口
  • 点击Test Connection按钮,测试能否联通slave docker
Docker Agent Template
  • 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/
image.png
  • Connect method:注意下,这里选择Attach Docker container,这个跟上面的 Docker Image有关系。
image.png

按以上步骤配置完即可。

测试

我们新建一个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上执行的!

相关文章

网友评论

      本文标题:jenkins slave分布式环境- docker agent

      本文链接:https://www.haomeiwen.com/subject/dvtxfdtx.html