全面解析 Jenkins 部署架构:高效持续集成的最佳实践
1、Jenkins是什么
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson,主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。
Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。Jenkins可以很好的支持各种语言的项目构建,也完全兼容Maven、Ant、Gradle等多种第三方构建工具,同时跟SVN、GIT等常用的版本控制工具无缝集成,也支持直接对接GitHub等源代码托管网站。
2、Jenkins部署架构概述
Jenkins部署分为以下两种模式:
一种是直接使用单Master安装Jenkins,直接进行任务管理和业务构建发布,但可能存在一定的生产安全风险。
一种是Master加Agent模式。Master节点主要是处理调度构建作业,把构建分发到Agent实际执行,监视Agent的状态。业务构建发布的工作交给Agent进行,即执行Master分配的任务,并返回任务的进度和结果。
Jenkins的Master和Agent均可安装在虚拟机或容器中,且组合形式可多样。
3、Jenkins部署架构详解
3.1 单节点架构(单Master)
单Master安装Jenkins,直接进行任务管理和业务构建发布。虚拟机单Master安装Jenkins可以参考《Centos7下安装配置最新版本Jenkins(2.452.3)》这篇博文。
对于某些特定场景,单节点不足以满足需求:
如果所有执行程序都忙于处理构建任务,则作业(Job)必须等待。
当项目的数量或负载增加时,很可能会耗尽资源。
为了恢复并运行Jenkins基础设施,需要通过增加内存、CPU等来增强服务器,而这不具备可扩展性,必须根据需求维护和升级服务器。
在维护升级过程中,构建环境将被关闭,作业不得不停止,整个Jenkins基础设施将不可用。
这种单节点架构会造成系统经常处于idle状态,分配给Jenkins环境的资源在这种状态下也没法被充分利用。
单节点架构还会引入安全问题,因为Jenkins用户对所有资源和工作空间都拥有完全的权限。
由于这些原因,Jenkins支持分布式架构,其中构建项目的工作负载被委托给多个Jenkins代理。
3.2 分布式架构(Master加Agent)
Master节点主要是处理调度构建作业,把构建分发到Agent实际执行,监视Agent的状态。业务构建发布的工作交给Agent进行,即执行Master分配的任务,并返回任务的进度和结果。
Jenkins的Master和Agent均可安装在虚拟机或容器中,您可根据自身需求选择其中一种方案执行。
3.2.1 Agent类别
3.2.1.1 固定Agent
Agent一直运行,任务构建完成后不会销毁,创建完成后将一直占用集群资源,配置过程较简单。每个Agent可以存在多个Executor,具体的数量应该根据Agent所在主机的系统资源来设定。
Linux Jenkins(常用);
Windows Jenkins;
容器化方式。
注意 1:很多的构建步骤,有可能会通过运行shell命令进行,于是此时要确保在虚拟机或Container内部有可用的命令,比如流水线中需要执行mvn命令,需要在虚拟机或Container镜像内安装配置好maven工具。
3.2.1.2 动态Agent
构建任务时动态创建Agent容器,并在任务构建完成后销毁容器,可实现资源动态分配,资源利用率高,但是配置过程较为复杂。可以把每个Agent视作一个动态的Executor。
依赖的环境:云,通过Jenkins Controller(即Jenkins主服务器)与云环境进行交互以管理这些动态Agent。Jenkins Controller通过API(依赖插件)与云提供商的服务进行通信,发送请求以创建新的资源(如虚拟机或容器)、配置这些资源以作为Jenkins Agent运行,以及在Job完成后销毁这些资源。这些API调用允许Jenkins Controller自动化整个流程,从资源的创建到销毁,从而实现了Agent的动态管理。
Docker Plugin,基于配置的Docker Host,按需要创建容器运行Agent,需要事先配置好容器模板;
Kubernetes Plugin(常用),基于配置的Kubernetes,按需要创建Pod运行Agent,需要事先配置Pod模板。
注意 1:Controller自身既可以部署在K8s上,也完全可以运行在K8s外。
下面以动态Agent(K8s集群)Jenkins分布式结构图为例展示下Jenkins分布式架构。
3.2.2 Jenkins分布式结构特点
主节点负责(也叫Controller节点):
调度构建作业。
将构建作业分发给代理实际执行。
监视从节点(Slave),并根据需要停止其工作。
Jenkins代理负责(也叫Slave节点):
从主节点接收请求或工作,代理的工作就是按命令行事。
可以将工作配置为始终在特定代理上执行。
主节点将利用其资源来处理HTTP请求和管理构建环境,构建的实际执行将委托给代理。
通过这种配置,可以横向扩展Jenkins架构,其中Jenkins将安装在单个节点上。
链接:https://www.cnblogs.com/zhangmingcheng/p/18355463
(版权归原作者所有,侵删)
微信扫码关注该文公众号作者