乐趣区

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

一、相关概念
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-c
* ** 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、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

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

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

回到首页运行该构建任务

镜像最小的至少 800M,这是最大的缺点,但是除了第一次启动耗费时间很长,其他还是很快的
除去下载镜像的时间,大概一到两分钟之后,slave 节点启动

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

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

查看控制台输出

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

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

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

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

退出移动版