美文网首页
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