教程(四)pipeline与k8s集成
传统的Jenkins Slave方式存在的问题
传统的 Jenkins Slave 一主多从式会存在一些痛点。比如:
发生单点故障时,整个流程都不可用了
每个 Slave
的配置环境不一样,来完成不同语言的编译打包等操作,但是这些差异化的配置导致管理起来非常不方便,维护起来也是比较费劲;
资源分配不均衡,有的 Slave 要运行的 job 出现排队等待,而有的 Slave 处于空闲状态;
资源有浪费,每台 Slave 可能是实体机或者 VM,当 Slave 处于空闲状态时,也不会完全释放掉资源。
每台slave节点都需要安装jdk,配置ssh服务等,即便我只是想运行一个python任务。
这样使我们的dockerfile中增加了额外的步骤造成额外的维护成本,并且镜像制作速度也会下降。
解决方案
基于上面的问题我们当前的改造方式是把salve做成镜像部署到k8s中, 比如我们的UI自动化所需要的slave就是测试k8s集群中一个pod。
这样解决了我们上面说的第一个问题,就是如果节点出现故障,那么k8s会帮我们把这个pod迁移到其他可用节点,但是它无法解决其他4个问
题。 所以最终我们希望将jenkins和k8s进行整合。 达到如下的效果
上面是我再jenkins官网上下载的图。 抛开master节点的实现(我们的jenkins
mater没有部署在k8s中),在这里jenkins能调用k8s的接口,动态的在k8s中创建pod并作为slave运行我们的测试任务,
任务运行完毕后删除pod。 并且它充分利用了k8s的特性, 创建的pod中负责与jenkins
master连接的slave容器是jenkins团队发布的docker镜像 jenkins/jnlp-slave,
而且jenkins的k8s插件会自动帮助我们定义pod的配置,我们只需要定义一个基本的pod信息,jenkins会把我们的配置与它自己的配置进行m
erge。 比如, 在sage-sdk-test的pipeline中,我们是这么做的:
在agent部分跟以往不同的是我们提供了一个k8s的pod模板, 这样就是告诉jenkins我们这个job要跑在k8s上,
需要在k8s上运行这个pod然后当做slave节点,运行我们的job。
其他的pipeline配置跟以前基本一样,这里只是把slave容器从以前的方式变成了现在的动态创建pod的方式。