【DevOps工具篇】Jenkins的Master-Slave Agent(主从)架构
@TOC
推荐超级课程:
Jenkins拥有强大的主从架构功能,可以实现分布式构建。本文我们将学习如何在Ubuntu机器上建立从节点并与Jenkins主节点集成。
在Jenkins中配置主从设置的不同方法
- 永久代理(JNLP从机) 这是设置Jenkins从机的传统方法。代理通过Java Web Start(JNLP)从Jenkins主节点启动。它们与主节点建立连接,使主节点能够向它们发送构建作业。
- SSH代理 在这种配置中,Jenkins从机通过SSH连接到主节点。与JNLP从机相比,SSH代理提供了更安全的通信方式,因为连接是加密的。当需要增强安全性以及在不同网络间工作时,SSH代理非常有用。
- Docker代理
Docker容器可以用作Jenkins代理。可以根据需求启动每个容器来执行特定的构建作业,作业完成后销毁容器。
Jenkins主节点
您的主体Jenkins服务器是主节点。主节点的工作是处理:
- 调度构建作业。
- 将构建作业分派给从机实际执行。
- 监控从机(可能根据需要将它们上线或下线)。
- Jenkins的主节点实例也可以直接执行构建作业。
Jenkins从机
从机是一个在远程机器上运行的Java可执行程序。以下是Jenkins从机的特点:
- 它接收来自Jenkins主节点实例的请求。
- 从机可以在各种操作系统上运行。
- 从机的工作是按照指令执行,这涉及执行由主节点分派的构建作业。
- 您可以配置一个项目总是在特定的从机机器上运行,或者特定类型的从机机器上运行,或者简单地让Jenkins选择下一个可用的从机。
设置
先决条件
- 启动三个EC2实例——Jenkins主节点、从机1、从机2和Docker主机(对于Docker主机,您可以创建新的虚拟机或使用现有的)
- AMI——Ubuntu 20.04,实例类型——t2.micro,生成新的密钥对
- 网络设置——默认VPC,安全组——创建新的,并设置入站规则——打开所有流量(这不是最佳实践推荐的,但仅出于实际目的)
- 配置存储——15GB并启动
设置步骤
- 在所有机器安装Java
sudo su -
sudo apt update
sudo apt install openjdk-11-jdk
java --version
- 在主机中安装Jenkins
sudo apt-get update
sudo apt install openjdk-11-jdk
sudo wget -O /usr/share/keyrings/jenkins-keyring.asc https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get update
sudo apt-get install jenkins
Slave1节点配置启动方法 — SSH代理
- Maven安装
sudo apt install maven -y
- 以Jenkins用户创建用户
sudo useradd -m jenkins
sudo -u jenkins mkdir /home/jenkins/.ssh
现在登录到Jenkins主节点 通过执行以下命令创建SSH密钥:
ssh-keygen
# 将SSH密钥从主节点复制到从节点
# 在Jenkins主节点的EC2实例上执行以下命令。
sudo cat ~/.ssh/id_rsa.pub
# 复制上述命令的输出
# 现在登录到从节点并执行以下命令
sudo -u jenkins vi /home/jenkins/.ssh/authorized_keys
# 这将是一个空文件,现在将主节点的公钥复制到上述文件中。一旦你在从节点的上述文件中粘贴了公钥,
# 通过输入 :wq! 退出文件
现在回到主节点
ssh jenkins@slave_node_ip
# 这是为了确保主节点能够连接到从节点。
在Jenkins中注册从节点:
- 现在进入Jenkins主节点,管理Jenkins,管理节点。
- 点击新建节点。输入名称并勾选永久代理。
- 输入名称并将执行器数量设置为1。输入远程目录为 /home/jenkins。
- 选择启动方法为通过SSH启动从节点。
- 输入从节点IP地址作为主机。
- 点击凭据。输入用户名为jenkins。确保jenkins是小写的,如所示。
- 类型为带有私钥的SSH用户名。通过执行以下命令直接输入主节点的私钥:
sudo cat ~/.ssh/id_rsa
- 选择主机密钥验证策略为“手动信任的密钥验证策略”。
- 点击启动代理…确保它连接到代理节点
从节点配置 - 启动方法 - JNLP
- 在 Jenkins 仪表板 - 管理 Jenkins - 管理节点和云 - 新节点
- 将节点名称添加为永久代理
- 名称:在此 Jenkins 安装中唯一标识一个代理。描述:任何内容
- 执行器数量:2
- 远程根目录:/opt/build
- 标签:标签(或标签)用于将多个代理分组到一个逻辑组中。
- 使用情况:尽可能使用这个节点
- 启动方法:通过在控制器上执行命令来启动代理
- 自定义工作目录路径:如果您保留空白,它将自动引用根目录,将使用自定义 Remoting 工作目录而不是代理根目录
- 可用性:尽可能保持这个代理在线
- 保存上述配置后,您将获得应在代理中执行的命令。它包含 agent.jar、一个 secret-file 和一个 jnlp 文件
- 在执行以下命令之前更改 IP 地址 - 主机 IP 地址
- 连接后,您可以创建或编辑一个作业,在“限制此项目可以运行的位置”中选择这个选项
curl -sO http://54.84.175.179:8080/jnlpJars/agent.jar
java -jar agent.jar -jnlpUrl http://54.84.175.179:8080/computer/java%2Dnode/jenkins-agent.jnlp -secret 048ad980b94153362fedfb85123e72c0f0093f53b8fec44849f5848ddf29b2b0 -workDir "/opt/build"
Docker 从节点 - 动态从节点配置
- 更好的资源利用率
- 定制化代理,因为它可以运行不同的构建,如 Java 8、Java 11
- 可扩展性
- 安装 Docker:
sudo apt install docker.io -y sudo systemctl start docker sudo systemctl enable docker sudo systemctl status docker
- 使用远程 API 配置 Docker 主机
sudo vi /lib/systemd/system/docker.service 你可以用以下行替换: ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock sudo systemctl daemon-reload sudo service docker restart
- 通过执行以下 curl 命令验证 API
curl http://localhost:4243/version 从以下仓库下载 Dockerfile。 git clone https://github.com/akannan1087/jenkins-docker-slave; cd jenkins-docker-slave
- 构建 Docker 镜像
sudo docker build -t my-jenkins-slave . sudo docker images
- 使用 Docker 插件配置 Jenkins 服务器
- 现在登录到 Jenkins 主节点。确保你在 Jenkins 中安装了 Docker 插件
- 现在转到管理 Jenkins -> 配置节点和云
- 点击 Docker 云详情
- 输入 Docker 主机的 DNS 名称或 IP 地址
- tcp://docker_host_dns:4243
- 确保选中了“启用”
- 现在点击“测试连接”,以确保与 Docker 主机的连接正常工作。
- 配置 Docker 代理模板
- 现在点击 Docker 代理模板:
- 输入标签为“docker-slave”并给一个名称
- 点击“启用”
- 现在输入你之前在 Docker 主机上构建的 Docker 镜像的名称。
- 输入 /home/jenkins 作为远程文件系统根目录
- 选择“使用 SSH 连接”作为连接方法:
- 选择“从不拉取”作为拉取策略,因为我们已经在 Docker 主机上存储了镜像。
- 根据你的 Dockerfile 输入 SSH 凭据 — jenkins/password