k8s结合jenkins部署docker项目
jenkins的可伸缩部署方式,一种是基于Docker(或者docker-swarm 集群)的部署方式,另外一种是基于kubernetes的部署方式。
由于基于kubernetes也是基于docker的,都需要用到docker进行通信和中转,因此使用同一的slave镜像将大大节省平台开发与维护成本,因此需要引入jenkins的另一个大插件pipeline。Pipeline也是jenkins 2.0以后的主要方向和升级。
jenkins介绍及传统部署遇到的问题
Jenkins 是开源的一套持续集成框架,可以进行大规模的编译、测试和发布的工作,给软件开发团队带来极大的便利性。
Jenkins 的持续集成环境可以是集群化的,主要的运行模式为master-slave模式。
Jenkins 的master为Jenkins系统的控制节点,slave节点负责具体的项目编译测试等工作。
由于大公司里面需要进行编译的工程或者对象非常庞大,因此需要大量的物理节点作为slave,而且这些环节相对固定,可能很难适应其他项目的编译测试,一旦salve节点遭到破坏,需要人为的进行修复甚至重建,非常麻烦。
Docker 来解决问题
Docker的问世,为我们提供了解决方案,使用docker作为jenkins slave节点可以解决slave节点遭到破坏后遇到的问题, 而且大量的工程不是每时每刻同时运行的因此可以在需要时吧docker拉起来进行编译测试,这样就节约了大量的物理节点, 解决了上述问题。
然而使用docker 同样需要集群,因此要用到集群管理工具, swarm 或者kubernetes。Swarm 一般用在小集群上,而且swarm和docker本身的接口完全一致, 因此这里就简单介绍单点docker节点作为slave。 Kubernetes作为大的docker 集群管理工具,当jenkins的工程数量非常大的时候可以用kubernetes, kubernetes的运维相对比docker 和swarm的门槛要高一点。
Jenkins master也可以使用docker来运行或者使用kubernetes来提供高可用的jenkins master。本文不对jenkins master的安装和docker运行做过多的说明。
kubernetes 管理Jenkins slave
Kubernetes 主要是用来进行docker 调度运行的,同样因为这一点通过kubernetes插件的配置,不需要管slave节点是否在线,因为kubernetes帮你负责创建和连接。这样就可以做到没有任务的时候没有任务slave节点在线,做到完全的按需启动slave和调度slave。
使用kubernetes 部署管理的jenkins slave如下:
Jenkins master 的部署
1)物理机上安装步骤见上篇随笔
2)使用docker安装运行
docker search jenkins docker pull jenkins/jenkins:lts docker images 查看拉取的镜像 mkdir /home/jenkins_home #创建一个jenkins目录 #启动jenkins容器 docker run -d --name jenkins_01 -p 8080:8080 -v /home/jenkins_01:/home/jenkins_01 jenkins/jenkins:lts ;
https://hub.docker.com/_/jenkins/ 可以下载到jenkins master镜像
jenkins系统初始化安装插件
首先配置涉及站点,默认的是 官方的:http://updates.jenkins-ci.org/update-center.json
也可以配置日本的或者俄罗斯的 http://mirror.esuni.jp/jenkins/updates/update-center.json
http://mirror.yandex.ru/mirrors/jenkins/updates/update-center.json
配置完以后必须点右下角的立即获取
也可以在可选插件哪个页面的下面点击获取。
我们这里需要找的是kubernetes的插件和docker的插件进行安装,如果安装过程中有些插件安装失败,则手动下载插 件然后再高级里面选择上传插件进行安装:
使用docker运行jenkins slave并连接到master
Jenkins master 连接slave 有两种模式,一直是master主动发起连接,主要通过ssh 来进行连接,另外一种是slave 主动连接master,使用的jnlp协议。
我们使用docker来运行jenkins slave 都可以,但是要做到没有任务在编译测试的时候没有slave在线 则只能通过 jnlp来进行连接而去必须使用kubernetes来调度。
我们这里讨论的是使用单独的或者几个slave长期在线,进行项目的编译测试,都是由master发起连接的。
https://hub.docker.com/u/jenkinsci/ slave镜像下载地址上
docker 运行jenkins slave (ssh 模式)
这种模式docker 运行一个slave 容器跟普通物理机使用完全一致,这里不做说明。
同样可以再在同一个slave节点(docker 容器)上绑定很多个工程或者任务。
docker jenkins slave (jnlp 模式)
Jnlp 模式的则相对应用的比较少,jnlp 是由jenkins slave节点(物理节点,虚机或者容器均可)发起连接的, 会根据配置的jenkins master的url , Jenkins连接的token和jenkins slave name( lable)来进行进行连接。
举个例子:
登录jenkins-->系统管理-->节点管理-->新建节点
那么slave 进行运行连接的时候4个参数是:
1. –url
3. 54cf091374806d8db7b9cd3977e23d080c955fa6fa33dd6c33dd594aa7b79350
4. jnlp_test
Jenkins-slave –url http://172.25.8.10:8090 54cf091374806d8db7b9cd3977e23d080c955fa6fa33dd6c33dd594aa7b79350 jnlp_test