说明
Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。
无论我们是出于什么原因使用jenkins,如果不了解它的运行架构,那么想在jenkins的基础上做一些复杂的工作会十分困难。
运行架构介绍
jenkins的运行架构在我看来分成4种,或者说我接触过的有以下四种。
1.单机策略
在这种模式下,只有一个 Jenkins 服务器负责所有的构建任务并使用 TCP 连接部署到远程服务器上。
这是最简单的一种方式,我们完全不需要担心其他可变因素。
2.主从策略
采用单机模式运行 Jenkins 有一些弊端。
尽管单机模式无需考虑多服务器和节点,但当大量的构建任务在同一时间运行时,服务器可能会负荷过重。这时我们可能会考虑增加节点可并发执行的构建任务数量,但是很快就会遇到性能瓶颈。
为了解决这个问题,我们可以将部分任务分发到其他的机器上去,即 Jenkins 从节点。Jenkins 从节点会运行一段程序与主节点进行通信,判断是够有可执行的构建任务。一旦 Jenkins 主节点调度安排好构建任务,就将其分发至相应的从节点。
3.扩展docker策略
我们进一步来探索 Jenkins 的运行方式。当你的团队中还未建立 CI 时,你可能无需多台静态服务器来执行 Jenkins 任务。
当你无需 7*24 运行时,你的服务器可能会空闲,这时就产生资源浪费了。
但如果你正在使用容器技术如 docker,你可以让 Jenkins 的运行架构变得高级起来。简单的说,就是让主节点处理调度构建任务,把任务分发任务到从节点进行执行,但是你并不需要事先就生成相应的从节点——当从节点需要使用时,会立刻应运而生。
这种运行架构可以解决下面的问题:
- Jenkins 服务器性能得到优化
当你将 Jenkins 运行在 docker上时,Jenkins 可以根据集群资源使用情况调节并启动。因为很多应用都共享一个宿主机,这样就能有效的节约资源——这种情况下 Jenkins 并不会运行在一个资源使用顶峰时候。 - 并行运行构建任务
你无需再仔细考虑同一时间并发执行的任务数目,Jenkins 会准备好一个从节点以便于运行相关的任务。 - 自我修复
如果你的构建任务或者从节点突然遇到问题了,这个时候你完全不用担心,Jenkins 会自动移除有问题的从节点并启动一个新的从节点。
这样会节省大量的故障排查时间,因为每个从节点不是必须存在的,如果某个从节点遇到障碍,Jenkins 会请求 Kubernetes 移除它并启动一个全新的从节点。就是这么简单。
4.扩展k8s策略
如果你正在使用容器技术如 Kubernetes,你可以让 Jenkins 的运行架构变得更加高级。简单的说,就是让主节点处理调度构建任务,把任务分发任务到从节点进行执行,但是你并不需要事先就生成相应的从节点——当从节点需要使用时,会立刻应运而生。
这种运行架构可以解决下面的问题:
- Jenkins 服务器性能不再是问题
当你将 Jenkins 运行在 Kubernetes 集群中时,Jenkins 可以根据集群资源使用情况调节并启动。因为很多应用都共享一个集群,这样就能有效的节约资源——这种情况下 Jenkins 并不会运行在一个资源使用顶峰时候。
如果你将集群部署在云端,如 Google Cloud Platform,Jenkins 的运行将会变得更加轻松灵活。GKE 不仅仅可以根据容器的情况自我调节,还可以根据集群的负载情况添加或移除节点,如此一来就有了无限扩展的能力。 - 并行运行构建任务
你无需再仔细考虑同一时间并发执行的任务数目,Jenkins 会准备好一个从节点以便于运行相关的任务。 - 负载均衡
Kubernetes 可以很好的实现负载均衡,它会让 Jenkins 从节点运行在最适合的服务器上,正因如此,构建任务的运行会更快且更有效率。 - 自我修复
如果你的构建任务或者从节点突然遇到问题了,这个时候你完全不用担心,Jenkins 会自动移除有问题的从节点并启动一个新的从节点。
这样会节省大量的故障排查时间,因为每个从节点不是必须存在的,如果某个从节点遇到障碍,Jenkins 会请求 Kubernetes 移除它并启动一个全新的从节点。就是这么简单。
调度策略分析
基于以上四种运行架构,jenkins内部会有不同的调度策略,但细分起来是大同小异的,我的具体分析如下:
- 无论是哪种策略,一个job每运行一次都只对应一个workspace。
- 主从策略,如果不指定,那每次会自动选择一个空闲的执行机
- 各节点是否空闲、是否可用 可以在配置里头配置
- 扩展docker,是把任务调度权利给了一个或者说是一组docker宿主机。如果是一组宿主机,那么具体分配给哪个宿主机,可以参照主从策略;分配好宿主机后jenkins的工作就完成了,调度的任务就给了宿主机,这个具体怎么实现,这里就不再赘述了。
- 扩展k8s,是把任务调度权利给了一个或者说是一组k8s集群。他的调度策略与扩展k8s很像,但不同的是,k8s集群的功能远远比一个宿主机强大。
- 如果是复杂的情况需要多台机器调度,可以通过设置label来实现。
- 云节点(docker或者k8s)的workspace在运行完一次后会被销毁,所以如果结果有用,务必生成相关的制品保存下来。
转载/参考内容
英文原文链接:https://medium.com/better-programming/how-we-scaled-jenkins-in-less-than-a-day-ccbcada8e4a4
中文社区链接:https://jenkins-zh.cn/wechat/articles/2020/04/2020-04-22-scale-your-jenkins-agents-using-kubernetes/