51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2567|回复: 1
打印 上一主题 下一主题

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

[复制链接]
  • TA的每日心情
    擦汗
    1 小时前
  • 签到天数: 1047 天

    连续签到: 5 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-9-17 11:15:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    背景介绍
      目前我厂 Jenkins CI 采用的是 Master-Slave 架构, Master 和 Slave 都是物理机搭建。主要用于跑单测,集成测试等。由于早期没有专人来管理 Jenkins ,随着业务的发展 Jenkins Job 越来越多,也带来了如下问题:
      当 Job 越来越多时需要通过增加 Slave 机器来解决,新增 Slave 上的软件得重新安装。
      资源分配不均衡有浪费,有的 Slave 上运行的 Job 出现排队等待,而有的 Slave 处于空闲状态。 并且当 Slave 处于空闲状态时,也不会完全释放掉资源。
      每个 Slave 总有点差异维护起来比较麻烦。
      当 Master 有故障时,整个流程都不可用。

      整体方案设计
      为了解决以上问题,减少 Jenkins 维护成本降低机器成本等。我们决定采用现下比较流行的 kubernetes Jenkins CI/CD [url=]技术[/url],将 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 也是必不可少的,用于代码[url=]质量管理[/url]等。由于 Sonarqube 有一些规则等配置需要在启动时加载好,所以需要重新制作镜像。这里镜像制作分为 2 部分:
      第一部分:Mysql 镜像制作,包含 Sonar [url=]数据库[/url]和 Sonar 用户创建,导入 Sonarqube 初始化数据,启动 Mysql。
      第二部分:基于上面的 Mysql 镜像再制作 Sonarqube 镜像。
      这里我们是把 Mysql 和 Sonarqube 集成在一个镜像里,当然也可以分开。下面是制作 Mysql 镜像的部分 Dockerfile:
    1. FROM mysql:5.7  
    2. #设置免密登录
    3. ENV MYSQL_ALLOW_EMPTY_PASSWORD yes

    4. #将所需文件放到容器中
    5. COPY mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf  
    6. COPY setup.sh /mysql/setup.sh  
    7. COPY privileges.sql /mysql/privileges.sql  
    8. COPY sonar.sql /mysql/sonar.sql  
    9. COPY init_sonar.sql /mysql/init_sonar.sql  
    10. COPY run-entrypoint.sh /mysql/run-entrypoint.sh  
    11. COPY start.sh /mysql/start.sh  
    12. ........
    13. #设置容器启动时执行的命令
    14. 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 、[url=]Python[/url] Slave 制作和 Java Slave 类似,网上也有资料这里就不详细介绍了。
      制作完的镜像需推送到镜像仓库中保存, 下面是构建和推送镜像的命令:



    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-15 10:58 , Processed in 0.068475 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表