一、相关概念
Jenkins简单介绍[1]
Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
使用目的:
持续、自动地构建/测试软件项目。
监控一些定时执行的任务。
Jenkins拥有的特性包括:
1.易于安装-只要把jenkins.war部署到servlet容器,不需要数据库支持。
2.易于配置-所有配置都是通过其提供的web界面实现。有些配置如MAVEN_HOME和Email,只需要配置一次,所有的项目就都能用。当然也可以通过修改XML进行配置。
3.集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知。
4.生成JUnit/TestNG测试报告。
5.分布式构建支持Jenkins能够让多台计算机一起构建/测试。
6.文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。
7.插件支持:支持扩展插件,你可以开发适合自己团队使用的工具。
8.测试报告聚合,所有模块的测试报告都被聚合在一起,结果一目了然,使用其他CI,这几乎是件不可能完成的任务。
9.构件指纹(artifact fingerprint),每次build的结果构件都被很好的自动管理,无需任何配置就可以方便的浏览下载。
DockerSwarm简单介绍[2]
Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。目前,Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。
Docker Swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具。用户可以把集群中所有 Docker Engine 整合进一个「虚拟 Engine」的资源池,通过执行命令与单一的主 Swarm 进行沟通,而不必分别和每个 Docker Engine 沟通。在灵活的调度策略下,IT 团队可以更好地管理可用的主机资源,保证应用容器的高效运行。
DockerSwarm拥有的特性包括:
1.任何规模都有高性能表现
对于企业级的 Docker Engine 集群和容器调度而言,可拓展性是关键。任何规模的公司——不论是拥有五个还是上千个服务器——都能在其环境下有效使用 Swarm。 经过测试,Swarm 可拓展性的极限是在 1000 个节点上运行 50000 个部署容器,每个容器的启动时间为亚秒级,同时性能无减损。
2.灵活的容器调度
Swarm 帮助 IT 运维团队在有限条件下将性能表现和资源利用最优化。Swarm 的内置调度器(scheduler)支持多种过滤器,包括:节点标签,亲和性和多种容器部策略如 binpack、spread、random 等等。
3.服务的持续可用性
Docker Swarm 由 Swarm Manager 提供高可用性,通过创建多个 Swarm master 节点和制定主 master 节点宕机时的备选策略。如果一个 master 节点宕机,那么一个 slave 节点就会被升格为 master 节点,直到原来的 master 节点恢复正常。 此外,如果某个节点无法加入集群,Swarm 会继续尝试加入,并提供错误警报和日志。在节点出错时,Swarm 现在可以尝试把容器重新调度到正常的节点上去。
和 Docker API 及整合支持的兼容性Swarm 对 Docker API 完全支持,这意味着它能为使用不同 Docker 工具(如 Docker CLI,Compose,Trusted Registry,Hub 和 UCP)的用户提供无缝衔接的使用体验。
Docker Swarm 为 Docker 化应用的核心功能(诸如多主机网络和存储卷管理)提供原生支持。开发的 Compose 文件能(通过 docker stack deploy )轻易地部署到测试服务器或 Swarm 集群上。Docker Swarm 还可以从 Docker Trusted Registry 或 Hub 里 pull 并 run 镜像。
综上所述,Docker Swarm 提供了一套高可用 Docker 集群管理的解决方案,完全支持标准的 Docker API,方便管理调度集群 Docker 容器,合理充分利用集群主机资源。并非所有服务都应该部署在Swarm集群内。数据库以及其它有状态服务就不适合部署在Swarm集群内。
Jenkins与Swarm相结合,Jenkins主节点保持在线,子节点运行在Swarm集群上,主节点负责对子节点进行调度,使整个Jenkins保持最低要求节点数在线,实现弹性伸缩持续集成。
二、准备
1.环境简介
本次实践的机器为一年多以来积攒的几台云服务器,也可以在本地采用虚拟机或在局域网中实践。
2.Jenkins安装
参照 官方文档 安装
设置运行用户为root
vi /etc/sysconfig/jenkins
...
JENKINS_USER="root"
...
防火墙开放端口8080(Jenkins默认端口)、8081(后面说明)
3.Swarm准备
在几台服务器安装Docker,安装方式参考Centos7上安装docker
所有节点防火墙开放端口2377,主节点与备选主节点防火墙额外开放端口9999
开启主节点与备选主节点上docker的远程调用端口
查看配置文件路径
systemctl show --property=FragmentPath docker // FragmentPath=/usr/lib/systemd/system/docker.service编辑配置文件内容
vi /usr/lib/systemd/system/docker.service修改对应项
ExecStart=/usr/bin/dockerd => ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:9999重新加载配置文件,重启docker
systemctl daemon-reload
systemctl restart docker
在master1上初始化Swarm集群
docker swarm init
docker swarm join-token manager
docker swarm join-token worker
将上面第二条指令输出的提示中的 docker swarm join --token ... 在 master2 上执行
将上面第三条指令输出的提示中的 docker swarm join --token ... 在 slave1、slave2 上执行
在master1上执行 docker node ls 查看集群状态
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
******** ***** Ready Active 18.06.0-ce
******** ***** Ready Active Leader 18.09.0
******** ***** Ready Active Reachable 18.06.1-ce
******** ***** Ready Active 18.06.0-ce
三、设置Jenkins
【系统管理】-【插件管理】-【可选插件】安装 Docker Swarm Plugin 插件
【系统管理】-【全局安全配置】-【代理】
防火墙没有开放所有端口,这里只能指定端口8081,否者jenkins master节点与运行在 Swarm 上的slave节点无法通信
【系统管理】-【系统设置】-【云】
其中Docker swarm api url 为master1的网络地址和之前设置的docker的远程调用端口
由于没有配置调用校验,所以不能使用默认的2375端口,改用不常用的端口9999,否则会被恶意调用,将其用来运行挖矿等恶意程序
Docker Agent template 为jenkins slave节点的模板
模板可以配置多个,其中Label为标签
在进行构建的时候指定运行节点为 SWARM-NODE-NODEJS 即可通过 Image 指定的镜像启动slave节点
Env 为环境变量
格式为 "key1=value1 key2=value2"
Host Binds 为文件映射配置
配置 /var/run/docker.sock:/var/run/docker.sock 使容器中的docker client 与 宿主机上的 docker server正确通信
镜像介绍
基础镜像均为 jenkinsci/jnlp-slave
zhouzhi3859/jenkins-jnlp-slave-root
tag 描述
latest root用户运行,包含python2.7、gcc、make
docker root用户运行,包含docker、python2.7、gcc、makezhouzhi3859/jenkins-jnlp-slave-nodejs
tag 描述
latest root用户运行,包含python2.7、gcc、make、node10
docker root用户运行, 包含python2.7、gcc、make、node10、docker-client
node-10-docker root用户运行, 包含python2.7、gcc、make、node10、docker-client
node-10 root用户运行, 包含python2.7、gcc、make、node10
node-8-docker root用户运行, 包含python2.7、gcc、make、node8、docker-client
node-8 root用户运行, 包含python2.7、gcc、make、node8
四、使用示例
新建一个自由风格的任务,取名test,勾选 限制项目运行的节点,输入上面的Label SWARM-NODE-NODEJS:DOCKER
在下面构建步骤中勾选执行shell,输入 "node -v" "docker version" 方便查看运行效果
最后点击【应用】【保存】
回到首页运行该构建任务
镜像最小的至少800M,这是最大的缺点,但是除了第一次启动耗费时间很长,其他还是很快的
除去下载镜像的时间,大概一到两分钟之后,slave节点启动
在master1上查看Swarm中的任务状态,可以看见一个jenkins slave运行
同样jenkin也开始显示构建状态
查看控制台输出
五、总结
这里所介绍的只是整个持续集成中的弹性伸缩,如果需要完成完整的持续集成流程,需要继续配置webhook与构建后操作,实现自动测试编译发布,这里不作详述。
没有构建任务时,只需要保存主节点在线。一旦构建的webhook被触发,主节点会去Swarm里面启动子节点,构建任务完成后,子节点被删掉,只保持最少的节点在线,灵活使用资源。
[1].Jenkins系列一:安装和简单配置
[2].Docker 三剑客之 Docker Swarm