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

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

《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-ce
********                        *****                       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用户运行,包含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

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

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

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

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

回到首页运行该构建任务

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

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

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

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

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

   查看控制台输出

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

五、总结

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

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

[1].Jenkins系列一:安装和简单配置

[2].Docker 三剑客之 Docker Swarm

    原文作者:BD_绿豆冰
    原文地址: https://www.jianshu.com/p/d869095306f6
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞