信也持续构建集群容器化改造之路

news2024/12/22 14:58:03

1. 前言

随着应用构建需求增加以及新构建场景引入,公司对构建系统的扩展性、稳定性要求日益提高。多语言构建(如Golang、Java、Python、Node.js 等)所依赖的环境,部署在同一台物理机上时,使构建机环境维护困难;并且多应用同时在一台机器上构建会相互影响;在传统的构建机主从模式下,单一的Master 构建节点会成为系统单点故障源,导致整个构建集群不可用。

通过行业方案调研,决定对构建节点进行容器化改造,实现构建任务隔离的同时,提升构建集群伸缩性。并且对构建集群进行去中心化架构改造,摆脱了对单Master构建节点依赖,使所有构建节点能独立完成构建任务,极大提高构建集群容灾能力。

2. 背景

2.1 现有问题

  1. 单点故障:Jenkins Master节点宕机会导致整个构建系统不可用。
  2. 性能瓶颈:Jenkins Master节点负责所有任务调度,负载过高时导致性能瓶颈。
  3. 构建配置复杂:单slave节点需要同时兼顾多种语言类型站点构建,导致机器配置复杂,维护成本高。
  4. 迁移难度大:物理机过保时,需要重新搭建构建节点,导致成本高且容易出现问题。
  5. 软件版本不一致:不同slave节点可能运行在不同操作系统上,需要确保系统版本、JDK、Maven、Python等构建环境版本一致,维护成本高。

3. 改造过程

改造过程主要包括以下步骤:

  1. 构建节点由master调度构建改造成能独立构建的容器节点
  2. 构建架构从Jenkins master调度改造成aladdin平台调度
  3. jenkins构建产物信息安全脱敏改造
  4. 灰度切换集群调度架构,平稳迁移构建节点

3.1 构建节点独立化、容器化改造

原有主从架构中,Jenkins Master节点负责完成构建任务配置,包括:插件,账号,环境变量等。实现可单独完成构建任务的节点,最快捷稳妥的方式是将Jenkins Master完整复制出来,放入容器中当作构建节点使用。

如何复制?

将现有Jenkins Master的JENKINS_HOME指向的安装目录完整复制放入容器中,在启动jenkins时指定JENKINS_HOME为该文件夹,打包镜像dockerfile如下:

FROM XXXXXXX/aladdin/base_os/centos8:v1.0

ENV LANG=en_US.UTF-8

# 复制 jenkins完整的安装目录到基准镜像中

COPY jenkins.war /

COPY jenkins /jenkins

# 复制jdk

COPY jdk-21.0.2 /usr/local/jdk-21.0.2

# 配置jdk环境变量

ENV JAVA_HOME /usr/local/jdk-21.0.2

ENV JRE_HOME=$JAVA_HOME/jre

ENV PATH=$JAVA_HOME/bin:$PATH:$JRE_HOME/bin

ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

# 启动jenkins时指定JENKINS_HOME/jenkinsjenkins启动后访问可发现和原jenkins master配置一致,无需重复配置

ENTRYPOINT java -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true -DJENKINS_HOME=/jenkins -jar /jenkins.war --httpPort=80

3.2 调度架构改造

完成jenkins构建节点容器化后,构建容器节点可独立完成构建任务,aladdin平台负责调度构建节点。aladdin持续集成平台本身就是集群部署的,有良好的容灾能力,完美解决原有构建集群单节点故障问题。

 

3.3 信息安全改造

jenkins在构建时会将项目源码下载到构建机上进行编译打包,项目源码和打包产物可直接在jenkins上查看、下载,且jenkins经常会报出各种漏洞,带来极大安全隐患。 基于上述安全问题,我们需要对jenkins进行访问限制。用户构建项目时需要查看构建日志和单测日志页面,所以,除这两个页面外,通过将jenkins端口办公网络访问权限回收,nginx代理的方式,将jenkins其他页面隐藏。只展示构建日志和单侧日志页面,实现限制直接查看项目源代码和产物,同时避免jenkins漏洞带来的安全隐患。

3.4 平稳迁移构建节点

为了平稳的完成构建集群的灰度切换,因此采用四步走策略:

  1. 实现影响较小的单元测试节点进行容器化
  2. 实现低风险业务线构建节点容器化
  3. 实现主营业务线站点构建容器化
  4. 实现其他站点构建容器化

 

4. 遇到的问题

4.1 docker中怎么调用 docker build打包镜像

原构建节点是在虚拟机上通过调用docker build命令完成站点镜像构建。构建节点容器化之后,如何在容器中调用docker build命令完成构建? 最开始尝试在容器中安装docker命令,但是失败了,会遇到各种奇怪的报错;后来想到可以调用远程docker构建机完成镜像的构建。 我们需要安装jenkins插件docker-plugin,配置好远程docker构建机,即可调用远程构建机构建镜像了,配置如下:

注意: 调用远程docker构建机时,默认会将dockerfile文件所在目录中的文件传送到远程构建机上,需要控制传输文件目录的大小

4.2 容器化后,磁盘占用翻倍

构建节点容器化之后,上线一段时间,服务器突然磁盘容量告警了! 平台有定时job会清理构建任务,只保留3天的构建量数据,而且构建量也没有明显增加,磁盘怎么突然不够了呢,经过检查发现,/var/lib/docker/overlay2 目录占用了大量的磁盘空间,这显然是docker引起的。

经过排查,是启动容器时,容器内jenkins workspace目录未挂载到宿主机上导致的。

docker 中有两个重要的文件夹:

  • diff 文件夹: diff文件夹包含了Docker镜像的变更内容。当对容器进行修改或添加文件时,这些变更会被记录在 diff 文件夹中。用于存储与基础镜像的差异。
  • merged 文件夹: merged 文件夹由基础镜像和 diff 文件夹合并而成的。在容器中对文件进行修改或添加新文件,这些修改将存储在 merged 文件夹中。

未配置容器内jenkins workspace目录挂载到宿主机上,导致容器内有大量写的操作发生,从而产生更多的diff和merged文件,占用了大量磁盘空间。

# 原则上如果容器内服务有写文件的行为,应该将文件目录挂载到宿主机上,而不是直接往容器里写。
# 启动容器时,挂载jenkins workspace目录到宿主机上
docker run -itd --name build_jdk8_01 -p 4010:80 -v /jenkins/workspace:/jenkins/workspace jenkins_server/build_jdk8:v1.6

构建节点改造完成

  1. 构建环境隔离:构建节点容器化后,每个构建任务都在单独构建服务上构建,互不影响,显著提高构建成功率,构建成功率保持97%左右。
  2. 容灾能力增强:从单一主节点架构转变为多主节点架构,每个构建节点独立执行任务,大大提高容灾能力。
  3. 环境一致性保障:通过构建节点容器化确保构建环境的一致性,减少环境配置问题,提升构建稳定性。
  4. 构建节点快速搭建:容器化使节点搭建和迁移变得便捷。
  5. 节省资源:无需Master节点来调度和管理任务,降低系统复杂度的同时节省物理机资源。

 

未来规划

  1. 探索新的构建工具和技术,提升构建效率和构建质量。
  2. 接入新的构建方式,支持模块化部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2106840.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch Mapping 详解

1 概述 映射的基本概念 Mapping 也称之为映射,定义了 ES 的索引结构、字段类型、分词器等属性,是索引必不可少的组成部分。 ES 中的 mapping 有点类似与DB中“表结构”的概念,在 MySQL 中,表结构里包含了字段名称,字…

【gtokentool】元宇宙nft区块链是什么

元宇宙 元宇宙的定义 元宇宙(Metaverse)这个词起源于Neal Stephenson在1992年出版的小说《雪崩》,Metaverse由Meta(意即“超越”、“元”)和verse(意即“宇宙universe”)两个词构成。元宇宙是整…

安卓13带有系统签名的应用不能正常使用webview 调用webview失败 系统应用app apk

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.彩蛋1.前言 android版本高一些的平台,经常会遇到一些权限安全问题,像客户的应用如果带有系统签名,会导致不能正常使用webview问题。 2.问题分析 我们log信息,可以发现下面的提示: Fo…

权威解读|2024固定网国内数据传送业务办理指南

一、固定网国内数据传送业务是什么? 固定网国内数据传送业务,是指互联网数据传送业务以外的,在固定网中以有线方式提供的国内端到端数据传送业务。主要包括基于IP承载网、ATM网、X.25分组交换网、DDN网、帧中继网络的数据传送业务等。 根据…

佰朔资本:股票的买卖点有哪些?如何判断?

1、根据均线找买卖点 当股价跌破5日均线时,投资者可以将其作为卖点;股价向下跌触碰5日均线之后,出现反弹向上运转的痕迹,投资者可以将其作为买点。 2、根据MACD方针和KDJ方针找买卖点 当MACD方针或许KDJ 方针出现高位死叉时&am…

AI绘画神器 Fooocus 2.0 来啦!出图质量升级+新增4大实用功能!低配电脑必用的AI绘画工具教程

大家好,我是灵魂画师向阳 之前为大家推荐过一款融合了 midjourney 和 stable diffusion 优点的 AI 绘画工具 Fooocus,它用的是开源的 SDXL 1.0 模型,可以免费生成高质量的图像,同时操作界面又如 Midjourney 般简单,受…

三菱机器人手柄维修示教器维修手操器面板等

机器人手柄维修(示教器维修)故障现象包括:黑屏、指示灯无任何显示, 上电蓝屏、白屏,通电几分钟后屏幕变为蓝屏,主板故障,通讯时有时无, 触摸失灵,有时白屏,触…

【苍穹外卖】Day 6 HttpClient、wx小程序

1 HttpClient HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议 HttpClient 是一个用于发送 HTTP 请求并接收响应的类或库,在…

昵称重复怎么办?一招教你轻松搞定!

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hi,大家好!我是你们的技术分享小助手——小米,29岁,活泼好动,最喜欢分享各种实用的技术知识啦!今天我们要聊的主题是“个人项目篇:如何管理昵称重…

Knife4J + Springdoc + SpringBoot2美化Swagger文档

前言 我们知道利用Swagger-UI结合Swagger提供的注解,在SpringBoot项目上可以将接口以HTML形式(swagger-ui.html)呈现出来,并且可以在线调试。但是老外的审美和使用习惯可能不太符合中国开发者的喜好。于是Knife4J(htt…

搜维尔科技:特斯拉人形机器人采用Manus VR数据手套来捕捉手指动作的特点和优势

1.高保真手指追踪:能够提供精确的手指动作捕捉,包括手指的弯曲、伸展、旋转等动作,并且不受遮挡限制。这种高保真的手指追踪能力对于机器人准确模拟人类手部动作至关重要。 2.触觉反馈系统:部分型号的数据手套可能具备触觉反馈功能…

【Python】超详细基础语法总结

Python大礼包:【2024年最新Python全套学习资料包】免费领取! 1.字面量 字面量:在代码中,被写下来的固定的值 1.1Python常用的6种值(数据)的类型 1.2代码练习(输出字面量) > p…

蓝牙技术|超高精度蓝牙位置服务将成为蓝牙定位产品发展方向

随着市场需求的变化,精确的距离测量成为提升安全性和用户体验的重要因素。预计未来五年蓝牙位置服务设备的年均增长率为22%,到2028年出货量将达到5.63亿台。 为了满足这一需求,SIG即将在2024年下半年推出一项新功能——蓝牙信道探测(Blueto…

C语言6大常用标准库 -- 1.<stdio.h>

目录 引言 1.<stdio.h>&#xff08;标准输入输出库&#xff09; 1.1 简介 1.2 库变量 1.3 库宏 1.4 库函数 &#x1f308;你好呀&#xff01;我是 程序猿 &#x1f30c; 2024感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;挖掘无限可能&am…

电影票API接口对接全攻略,让你轻松对接API

电影票API接口对接是指将第三方电影票销售平台的服务集成到自己的应用程序或网站中&#xff0c;使用户能够直接购买电影票。这种集成通常通过API&#xff08;应用程序编程接口&#xff09;实现。以下是电影票API接口对接的一般步骤和注意事项&#xff1a; 一般步骤&#xff1a…

Trm理论 2(Word2Vec)

神经网络模型&#xff08;NNLM&#xff09;和Word2Vec NNLM模型是上次说过的模型&#xff0c;其目的是为了预测下一个词。 softmax(w2tanh(w1x b1)b2) 会得到一个副产品词向量 而Word2Vue就是专门求词向量的模型 softmax(w2*(w1*x b1)b2) Word2Vec softmax(w2*(w1*x b1)b…

期权虚值和实值的投资风险有什么不同?

今天带你了解期权虚值和实值的投资风险有什么不同&#xff1f;首先虚值期权与实值期权在本质上有一定的区别&#xff0c;两者并不是一个概念。 期权虚值合约 虚值期权又称价外期权&#xff0c;是指不具有内在价值的期权&#xff0c;即行权价高于标的现价的认购期权或行权价低…

stm32之外部flash下载算法

文章目录 下载算法下载到芯片的核心思想算法程序中擦除操作执行流程擦除操作大致流程&#xff1a;算法程序中编程操作执行流程算法程序中校验操作执行流程 创建MDK下载算法通用流程第1步&#xff0c;使用MDK提供好的程序模板第2步&#xff0c;修改工程名第3步&#xff0c;修改使…

【unity小技巧】使用Unity的Animation Layer和Avatar Mask把多个不同动画组合使用,实现人物不同部位播放不同的动画

文章目录 前言如何使用Unity的Animation Layer和Avatar Mask把多个动画组合使用游戏角色的疲劳感是如何制作的&#xff1f;利用Animation Layers中的additive模式把多个动画混合在一起如何制作角色的受伤状态&#xff1f;Unity动画层级&#xff08;Animation Layer&#xff09;…

在stable diffussion中控制生成图片的光线

在摄影中&#xff0c;光线起着至关重要的作用&#xff0c;它对图像的整体质量和氛围有着显著的影响。您可以使用光线来增强主题&#xff0c;创造深度和维度&#xff0c;传达情感&#xff0c;以及突出重要细节。 在这篇文章中&#xff0c;我会告诉你如何在stable diffussion中控…