jenkins slave分布式环境- docker agent

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上执行的!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容