Jenkins利用k8s集群实现动态Slave并发构建

环境

Jenkins Master采用war包直接jar -jar jenkins.war本地服务器运行
Jenkins安装Kubernetes Plugin插件
K8S集群

正常设置Jenkins -> Configure System -> “云” -> kubernetes相关配置。

问题

不能并发创建Slave Pod进行并发构建

触发多个Maven项目Job构建时,前一个Job正常分配1个Slave Pod,后一个Job在“构建队列”一直处于“Waiting for next available executor”状态几分钟。偶尔Jenkins会分配1个新Slave Pod,大部分时候会等待前一个Job完成后重用Slave Pod。无法满足并发创建Slave Pod进行并发构建的需求。

不能并发创建Slave Pod进行并发构建,是Jenkins的调度策略问题

默认情况下,Jenkins创建Slave Pod很保守。假设当前有2个Job等待执行,Jenkins会先创建1个Slave Pod执行第一个Job,然后等待这个Slave Pod执行完Job,等待一定时间如果这个Slave Pod还未空闲,则再创建1个Slave Pod执行第二个Job。Jenkins调度策略尝试最大化利用每个Slave Pod。

可以通过调整一些参数来改变Jenkins的默认调度策略:
-Dhudson.model.LoadStatistics.clock=2
-Dhudson.slaves.NodeProvisioner.initialDelay=0
-Dhudson.slaves.NodeProvisioner.MARGIN_DECAY=0.1
-Dhudson.slaves.NodeProvisioner.MARGIN=50
-Dhudson.slaves.NodeProvisioner.MARGIN0=0.85

如上参数设置可以加快Jenkins调度Slave Pod,提高效率。

具体Jenkins调度策略这里没有深究,感兴趣可以查看Jenkins源码

jar命令运行,
java -jar -Dhudson.model.LoadStatistics.clock=2 -Dhudson.slaves.NodeProvisioner.initialDelay=0 -Dhudson.slaves.NodeProvisioner.MARGIN_DECAY=0.1 -Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85 jenkins.war

参考资料

Jenkins K8S Slave 调度效率优化

Kubernetes Jenkins Plugin concurrent slaves not working

Logo

开源、云原生的融合云平台

更多推荐