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...


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

查看所有标签

猜你喜欢:

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

数据结构与算法

数据结构与算法

卓滋德克 / 陈曙晖 / 清华大学出版社 / 2003-4-1 / 69.00

本书是一本介绍数据结构与算法的优秀书籍。 本书系统介绍了C++面向对象程序设计、算法复杂度、链表、栈、队列、递归、树、图、排序和查找算法、散列技术、数据压缩算法、内存管理等内容;尤其对递归算法进行了深入剖析。在附录中详细介绍了大O符号与标准模板库:在大多数章中提供了相应的实例分析和程序设计作业。 本书适合作为计算机软件专业或其他相关专业的教科书。对于需要参加计算机考试,......一起来看看 《数据结构与算法》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具