实例学习:持续集成容器化设计实践之方案设计及部署

发表于:2021-9-13 09:34

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:yuxia    来源:有赞技术

  背景介绍
  目前我厂 Jenkins CI 采用的是 Master-Slave 架构, Master 和 Slave 都是物理机搭建。主要用于跑单测,集成测试等。由于早期没有专人来管理 Jenkins ,随着业务的发展 Jenkins Job 越来越多,也带来了如下问题:
  当 Job 越来越多时需要通过增加 Slave 机器来解决,新增 Slave 上的软件得重新安装。
  资源分配不均衡有浪费,有的 Slave 上运行的 Job 出现排队等待,而有的 Slave 处于空闲状态。 并且当 Slave 处于空闲状态时,也不会完全释放掉资源。
  每个 Slave 总有点差异维护起来比较麻烦。
  当 Master 有故障时,整个流程都不可用。

  整体方案设计
  为了解决以上问题,减少 Jenkins 维护成本降低机器成本等。我们决定采用现下比较流行的 kubernetes Jenkins CI/CD 技术,将 Jenkins Master 和 Slave 交给 k8s 动态调度。 下图是基于 K8s 搭建 Jenkins 集群的简单示意图:

  从上图中可以看到 Jenkins Master 和 Jenkins Slave 以 Pod 形式运行在 K8s 集群的 Node 上,Master 运行在其中一个节点,Slave 运行在各个节点上,Slave 的运行将按照需求去动态创建。
  工作流程: 当调用 Jenkins Master API 发起构建请求时,Jenkins k8s plugin 会根据 Job 配置的 Label 动态创建一个运行在 Pod 中的 Jenkins Slave 并注册到 Master 上,当 Job 结束后,这个 Slave 会被注销并且这个 Pod 也会自动删除,恢复到最初状态,这样集群资源得到充分的利用。
  使用容器化和 K8s 动态创建 Slave 优势:
  Master 服务高可用,当 Jenkins Master 出现故障时,K8s 会自动创建一个新的 Jenkins Master 容器。
  动态伸缩合理使用资源,每次构建 Job 时,会根据配置自动创建一个 Jenkins Slave,Job 完成后,Slave 自动注销并删除容器,资源自动释放,而且 K8s 会根据每个资源的使用情况,动态分配 Slave 到空闲的节点上创建,降低出现因某节点资源利用率高,还在该节点排队等待的情况。
  扩展性好,当 K8s 集群的资源严重不足而导致 Job 排队等待时,可以很容易的添加一个 Kubernetes Node 到集群中,从而实现扩展。

  部署 Jenkins Master、Sonarqube
  Jenkins Master 部署
  由于我们采用 K8s 集群部署,首先得制作 Jenkins Master 镜像。当然也可以使用 Jenkins 官网的上镜像 jenkins/jenkins:lts,因为我们有一些需求,所以需要自己制作。下面是制作镜像中个人认为需要注意的地方:
  需要 EXPOSE 2个端口,Jenkins Web 访问端口和 JNLP 代理协议的 TCP 端口( jnlp-slave 连接 Master 使用的端口)。
  JNLP 代理协议的 TCP 端口: 由于 Jenkins-Master 是在容器中启动的,所以一定要将这个端口暴露到外部,不然 Jenkins-Master 不知道 Slave 是否已经启动,会反复去创建 Pod 直到超过重试次数。
  Jenkins Master 若要动态创建 Slave 需要安装配置 Kubernetes Plugin,这里可以在网上找资料。

  Sonarqube 部署
  CI/CD 中 Sonarqube 也是必不可少的,用于代码质量管理等。由于 Sonarqube 有一些规则等配置需要在启动时加载好,所以需要重新制作镜像。这里镜像制作分为 2 部分:
  第一部分:Mysql 镜像制作,包含 Sonar 数据库和 Sonar 用户创建,导入 Sonarqube 初始化数据,启动 Mysql。
  第二部分:基于上面的 Mysql 镜像再制作 Sonarqube 镜像。
  这里我们是把 Mysql 和 Sonarqube 集成在一个镜像里,当然也可以分开。下面是制作 Mysql 镜像的部分 Dockerfile:
FROM mysql:5.7  
#设置免密登录
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes

#将所需文件放到容器中
COPY mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf  
COPY setup.sh /mysql/setup.sh  
COPY privileges.sql /mysql/privileges.sql  
COPY sonar.sql /mysql/sonar.sql  
COPY init_sonar.sql /mysql/init_sonar.sql  
COPY run-entrypoint.sh /mysql/run-entrypoint.sh  
COPY start.sh /mysql/start.sh  
........
#设置容器启动时执行的命令
ENTRYPOINT ["/mysql/run-entrypoint.sh", "/mysql/setup.sh"]  

  privileges.sql 创建 sonar 数据库,配置 SonarQube Server 访问数据库用户的权限。
  sonar.sql sonarqube 初始化配置的数据库表和数据。
  init_sonar.sql 将 sonar 数据库表和数据导入 sonar 数据库。
  start.sh 启动 mysql 并执行以上 sql 文本。

  Jenkins Slave 制作
  Jenkins Java Slave 我们参考的官网制作并添加了一些我们自己包(官方提供的 jenkins/ssh-slave,官方文档中有说明,这个镜像安装了 JDK 和 sshd,有兴趣的同学也可以自己制作),其中 Nodejs 、Python Slave 制作和 Java Slave 类似,网上也有资料这里就不详细介绍了。
  制作完的镜像需推送到镜像仓库中保存, 下面是构建和推送镜像的命令:
docker build -t [IMAGE:TAG] .  
docker tag SOURCE_IMAGE[:TAG] harbor.xxx.com/xxx/IMAGE[:TAG]  
docker push harbor.xxx.com/xxx/IMAGE[:TAG]  

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号