Jenkins + DockerSwarm 实现弹性伸缩持续集成

栏目: 编程工具 · 发布时间: 5年前

内容简介:一、相关概念Jenkins简单介绍[1]使用目的:

一、相关概念

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.环境简介

本次实践的机器为一年多以来积攒的几台云服务器,也可以在本地采用虚拟机或在局域网中实践。

Jenkins + DockerSwarm 实现弹性伸缩持续集成

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-c
* * * Ready Active Leader 18.09.0
* * * Ready Active Reachable 18.06.1-ce
* * * Ready Active 18.06.0-ce

三、设置Jenkins

【系统管理】-【插件管理】-【可选插件】安装 Docker Swarm Plugin 插件

【系统管理】-【全局安全配置】-【代理】

Jenkins + DockerSwarm 实现弹性伸缩持续集成

防火墙没有开放所有端口,这里只能指定端口8081,否者jenkins master节点与运行在 Swarm 上的slave节点无法通信

【系统管理】-【系统设置】-【云】

Jenkins + DockerSwarm 实现弹性伸缩持续集成

Jenkins + DockerSwarm 实现弹性伸缩持续集成

其中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用户运行,包含 python 2.7、gcc、make
docker root用户运行,包含docker、python2.7、gcc、make

zhouzhi3859/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

Jenkins + DockerSwarm 实现弹性伸缩持续集成

在下面构建步骤中勾选执行shell,输入 "node -v" "docker version" 方便查看运行效果

最后点击【应用】【保存】

回到首页运行该构建任务

镜像最小的至少800M,这是最大的缺点,但是除了第一次启动耗费时间很长,其他还是很快的

除去下载镜像的时间,大概一到两分钟之后,slave节点启动

在master1上查看Swarm中的任务状态,可以看见一个jenkins slave运行

Jenkins + DockerSwarm 实现弹性伸缩持续集成

同样jenkin也开始显示构建状态

Jenkins + DockerSwarm 实现弹性伸缩持续集成

查看控制台输出

Jenkins + DockerSwarm 实现弹性伸缩持续集成

五、总结

这里所介绍的只是整个持续集成中的弹性伸缩,如果需要完成完整的持续集成流程,需要继续配置webhook与构建后操作,实现自动测试编译发布,这里不作详述。

没有构建任务时,只需要保存主节点在线。一旦构建的webhook被触发,主节点会去Swarm里面启动子节点,构建任务完成后,子节点被删掉,只保持最少的节点在线,灵活使用资源。

[[1].Jenkins系列一:安装和简单配置]( https://www.jianshu.com/p/422...

[[2].Docker 三剑客之 Docker Swarm]( https://www.jianshu.com/p/d7d...


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

分布式算法导论

分布式算法导论

泰尔 / 霍红卫 / 机械工业出版社 / 2004年09月 / 39.0

分布式算法20多年来一直是倍受关注的主流方向。本书第二版不仅给出了算法的最新进展,还深入探讨了与之相关的理论知识。这本教材适合本科高年级和研究生使用,同时,本书所覆盖的广度和深度也十分适合从事实际工作的工程师和研究人员参考。书中重点讨论了点对点消息传递模型上的算法,也包括计算机通信网络的实现算法。其他重点讨论的内容包括分布式应用的控制算法(如波算法、广播算法、选举算法、终止检测算法、匿名网络的随机......一起来看看 《分布式算法导论》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具