1987WEB视界-分享互联网热门产品和行业

您现在的位置是:首页 > WEB开发 > 正文

WEB开发

基于K8s云原生Jenkins高可用设计思路(下)

1987web2023-10-06WEB开发163
一、回顾上篇主要概括地说了一下如何实现基于K8s云原生架构下Jenkins如何实现高可用的

一、回顾

上篇主要概括地说了一下如何实现基于K8s云原生架构下Jenkins如何实现高可用的设计思路,从阅读量来看大家还是挺喜欢的。本文内容主要介绍的是实现思路请您仔细阅读

本文由一个话题代入,在做一件事之前,多问问自己为什么要去做。

二、几个思考

为什么我把思考题放在最前面来说呢?因为我认为一位成熟而稳健的架构师,一定具备的素质就是"懂得取舍"

希望您在仔细阅读以下几个思考后,再重新思考下我到底是否真正需要马上动手实现它。

当然了,如果您抱着一份学习技术的心态来阅读这篇文章,那么您可以直接跳过这几个问题。

1. 场景思考

  • 我们的公司中,是否有业务场景真的需要用到这样的云原生复杂架构?不用行不行?
  • 我们技术团队规模较小(10人左右),每天的构建次数也就是十几次或者几十次,有必要么?
  • 我们即将搭建的这套架构要应对未来哪些场景?

2. 价值思考

  • 实现这套架构后,直接给我们团队(开发、测试、运维)带来什么样的交付价值?
  • 这些价值是老板关心的么?老板/上级关心什么样的价值?
  • 交付价值是否可以在我们团队中长期存在?从而产生更多的价值?

3. 选型思考

  • 我们团队是否采用K8s云原生搭建Jenkins? 是否有同事具备K8s的实施经验
  • 直接Docker容器化部署不香么?
  • 实现这套架构是否会涉及到多种技术栈?技术栈多了,自然坑就多,坑多了不填,技术债就多。
  • 我们团队的整体技术水平能够支撑整套架构的后续运维和迭代升级?

4. 实现思考

  • 我们具备哪些外部资源支撑? 服务器/虚机资源够么?测试运维团队是否配合?
  • 我们的交付时间Deadline定了么?在整体交付周期中,我们是否可以如期完工?
  • 既然是高可用架构,那么后期的数据迁移、横向扩容、宕机处理等 是否有所考虑?
  • 遇到技术难题或者人员流失情况该如何持续推进?

以上这几个思考,不都是针对本文的内容来的,细心的朋友会发现其实它是一套通用方法论,能够使用各种项目开发之前的准备工作。

当你把这几个问题真正都能思考明白的时候,我觉得基本上团队里的大部分同事和上级都不会拒绝你的思路了 。

三、Kubernetes Plugin

1. 插件介绍

https://github.com/jenkinsci/kubernetes-plugin

https://github.com/jenkinsci/kubernetes-plugin/blob/master/README_zh.md

搞K8s的朋友应该都不会陌生这个插件,它是基于Kubernetes原生的Client Api,依赖Jenkins的核心hudson类库,编写的一套适用于Jenkins 调用 K8s的 插件,且可以作为插件直接安装到Jenkins上。目前版本的Readme中文翻译地比较完善了。

这套插件功能比较强大,一般的K8s企业级集群架构应用场景都是可以满足的。具体功能自己看文档。当然了,如果您这边决定不考虑Jenkins和k8s集群进行交互,可以跳过本节。

2. 为什么要使用它?

上文提到,Jenkins动态Slave的通信工作原理,看图说话。

上图中,不难发现,我们这里的Jenkins Master是大脑,控制分配任务,3个Slave扮演的是Worker的角色,分布在不同的Node节点的Pod内。

那么回到我们这个话题上来,上图中,使用Jenkins的K8s插件为了就是要实现上图的分布式Slave通信机制。下图中,清晰地描述了这个思路,细心的朋友能发现纹身这波操作可以帮助我们节约不少服务器资源。

This is why we should use k8s plugin to implement dynamic M-S architecture of Jenkins.

3. 使用方法

这里我就简单说几个步骤,具体的如何去配置K8s插件的问题,百度上有很多帖子,这里就不浪费大家时间了。

  • Jenkins安装插件
  • K8s集群远程连接配置Kubernetes 地址Kubernetes 服务证书 key凭据Jenkins 地址Jenkins 通道
  • Pod Templates 配置名称标签列表Container Template工作空间卷
  • 验证远程连接

四、Jenkins并行构建

1. 并行构建是个什么玩意?

Jenkins构建项目工程的时候,往往一般我们会采用以下几个基本步骤。

  • 拉代码
  • 编译项目
  • 代码质量检查
  • 单元测试
  • 集成测试
  • 生成项目镜像
  • 上传镜像仓库

这些步骤,在Jenkins世界中,广义上定义为Stage,假设一个工程进入到构建任务队列后,那么Jenkins就要从第一个Stage执行到最后一个,把以上的阶段全部线性执行后才会结束。当然,中途发生失败也会立即结束。那么问题来了,我们用Jenkins构建项目的时候,往往遇到的问题是工程项目多的时候,会导致单次构建任务的构建速度很慢

为了应对这个问题,Jenkins也内置了多线程执行Job的方法,同时向上层的脚本也暴露了Api,供开发者使用。你可以简单理解并行构建,其实就是Jenkins的一个Job内的多线程执行

2. 为什么要使用它?

从上面两张图中不难发现,使用Jenkins并行构建的时候,可以在同一个Stage内进行多个工程模块的构建。从而加快整体构建速度。

3. 如何使用?

在Pipeline脚本中使用Jenkins官方文档提供的Api即可。本文只讲实现思路。

官方文档https://jenkins.io/doc/book/pipeline/syntax/parallel

parallel{"branch1":{dosomething closure},"branch2":{dosomething }
...
}

五、Shared Libary 使用

1. 概念介绍

当我们在一个公司/团队中尝试搭建一条CI/CD 标准化流水线的时候,那么成熟的架构师就会考虑到其通用性和兼容性,也就是我们经常说到的"求同存异",这个道理在多开发团队的情况下也会说的通。因为每个开发团队使用的编程语言、依赖库、三方组件都不尽相同,那么我们设计高可用的Pipeline也要考虑到这个重要因素。

同时,你当然也希望设计好一条高可用的CI/CI流水线后,能够适用于更多场景。

2. 为什么要使用它?

不同的团队可能都要去打造更适合自己CI/CD流程的流水线,难道我们要为每条流水线都重头写一遍代码么?Jenkins 团队其实早就发现了这个问题,并在初期设计的时候增加了共享库功能。这个功能帮助我们可以把一些通用的Groovy功能函数脚本封装到远程代码库中(Gitlab),方便在Pipeline中直接调用。提高代码复用性

3. 使用方法

  • Jenkins 的系统设置中找到相应位置并进行设置(建议配置SCM)Manage Jenkins -> Configure System -> Global Pipeline Libraries
  • 配置共享库工程目录
(root)
+- srcGroovy source files| +- org
|+- foo| +- Bar.groovyfororg.foo.Barclass+- vars
|+- foo.groovyfor global foo variable| +- foo.txt 				 helpforfoo variable
+- resources 				 resource files (external libraries only)
|+- org| +- foo
|+- bar.jsonstatic helper data for org.foo.Bar

上述几个目录的个人理解

  • src

存放的是共享库的源码目录,可以是Java或Groovy等JVM可解释执行的源码。这个目录会在Jenkins执行Pipeline的时候自动被添加到Classpath中。

  • vars

Jenkins在使用共享库时规定的全局变量目录,里面可以定义一些常用的工具类,举个例子,上面的 "foo.groovy" 可以理解为Pipeline在加载时,自动会把 foo.groovy 装载为一个闭包函数来供整个Pipeline使用。 vars中可以定义各种工具或者程序入口类,供全局调用。

  • resources

Jenkins规定的的资源文件目录,Pipeline中可通过libraryResource函数来进行访问,用于存储一些资源文件,像一些配置文件、静态资源等。

  • jenkinsfile

配置好以后,可通过Jenkins项目的入口文件jenkinsfile加载相关类库到Pipeline中。

// 直接调用,使用共享库名字@Library(my-shared-library) _// 调用共享库同时选择版本号,版本号是@后面携带的,如果SCM管理的话,使用分支名@Library(my-shared-library@1.0) _

官方参考https://jenkins.io/doc/book/pipeline/shared-libraries/

六、底层存储选型思考

1. 为什么要选型存储?

  • 高可用尝试思考一个简单的场景。如果你的Jenkins Pipeline跑起来了,但是部署Jenkins的那块硬盘由于高I/O读写,出现了单点故障,坏了怎么办? 是否流水线就直接全部挂掉了?
  • 动态扩容当你把流水线顺利上线,并且成功跑起来你的团队中的所有项目的时候,在某一天磁盘跑满了怎么办? 用你的定时清理缓存脚本解决不了问题怎么办?
  • 监控告警有没有办法让你能够统一监控你的所有硬盘分区?实时检查健康状态。

2. 如何实现?

目前很多免费开源的分布式企业级存储产品是可以选型的,当然了如果你钱多也可以考虑企业级的商业存储产品。列出几个我之前调研过的存储产品。

  • HDFS
  • GlusterFS
  • Ceph

Rook Ceph

https://rook.io

Rook Ceph 是在Ceph的基础上,向上封装了一层框架,用于K8s集群对底层Ceph存储的自动化管理目前是开源的,使用起来还是挺稳定的,运维难度也不算高。本人比较推荐Rook Ceph,能够满足我这边一个中型团队的企业级支撑。针对Jenkins Pipeline的存储高可用设计,CephFS也够用了。Ceph这块儿的设计实现本文就不展开说了。大家可以根据自己团队正在使用的存储产品进行选型即可。附上 Rook Ceph的官方网站和架构图。

本人比较推荐Ceph,业内比较知名,基本能够满足我这边一个中型团队的企业级支撑。搭建Jenkins Pipeline的话,CephFS也够用了。本文我就不展开说了。大家可以根据自己团队正在使用的存储产品进行选型即可。

七、总结回顾

至此,基于K8s云原生的高可用Jenkins架构设计和实现思路就和大家分享到这里。最近很多IT公司都在打造属于自己的CICD流程,这套思想希望对你有所帮助。当然了,如果你能从这两篇文章中能深入的Get到一些技术点,那么我就更高兴了。

这两篇文章都没有过多地去讲解具体实现的方法,只是阐述了一些概念和设计实现思路。如果大家还想进一步深入了解哪一个步骤的实现细节,那么请给我私信/留言,我会第一时间回复你。同时,我也会根据大家的所关注的技术点,后续再把相应的技术点单独展开详细讲解。

再次感谢您对我的关注,喜欢的朋友请『点赞』『关注』『评论』『转发』

安装准备

通过 docker-compose.yml 方式安装部署,文件内容如下:

有些目录需要提前先创建好,​同时授予相关访问权限。

​然后执行 docker-compose ,这是一个Docker Compose命令,用于在后台启动和运行基于Compose文件定义的容器。

可以看到上面的指令执行后,有提示Container jenkins Started ,

docker-compose: 是用于管理多个Docker容器的工具,通过Compose文件定义了容器之间的关系和配置。

up: 是docker-compose命令的子命令,用于启动指定Compose文件中定义的服务。

-d: 是一个选项,表示以后台(守护进程)模式运行容器。这样可以使容器在后台持续运行,而不会阻塞命令行窗口。

使用docker-compose up -d命令时,Docker Compose将读取当前目录中名为docker-compose.yml 的Compose文件,并根据其中的定义启动相应的服务。Compose文件描述了要创建的服务、镜像、端口映射、环境变量、卷挂载等信息。

在运行docker-compose up -d命令后,Docker Compose将根据Compose文件中的定义,自动下载所需的镜像并启动对应的容器,我之前已经执行过了,定义的镜像也都​下载好了,这时候再次执行,就直接启动容器了。

访问系统

http://ip:port 就可以访问系统页面了

Docker安装Jenkins系统常用插件用途解析

  • 下一篇centos7环境搭建Jenkins平台

    centos7环境搭建Jenkins平台

    概述