作者:Rick

Jenkins 可以很好地与 Kubernetes 集成,不管是控制器(controller)还是构建节点(agent),都能以 Pod 的形式运行在 Kubernetes 上。 熟悉 Jenkins 的用户,都知道 Jenkins 支持多种类型的构建节点,例如:固定配置、动态配置。而节点与控制器连接的方式, 又包括:JNLP、SSH 等。对于已经在全面拥抱容器技术的用户,大多数是通过连接 Kubernetes 集群并动态启动、销毁 Pod 的方式来使用构建节点。 而随着构建节点的种类、数量增多后,如何更有效地维护这些基于 Kubernetes 的节点,则逐渐成为一个问题。而在这篇文章中, 我将会介绍一种基于配置即代码的方案来管理、维护构建节点。

配置即代码(Configuration as Code,简称为:CasC),是一个非常赞的思路,它使得 Jenkins 用户不需要再一次次地打开 UI 界面去修改系统配置。 通过 UI 修改配置的优点是:借助页面上配置项的描述信息,可以相对容易地理解其含义。但相对应的缺点也是非常明显的:难以复用, 即便是完全相同的配置,也需要手动地在其他环境上再次操作;无法追踪修改过程;发生错误时无法快速回滚。借助 CasC 的能力, 我们可以把 Jenkins 的系统配置保存到一个 Git 代码仓库中,以及 GitOps 工具(例如:Argo CD),最终使得修改 Jenkins 系统配置, 成为一件可控、便捷的工作

不过,当 Jenkins 的变得配置复杂以后,对应的 YAML 配置文件也可能会变得越来越大,难以维护。

回归到我们希望解决的核心问题上来,预期的方案是:只需要单独维护 PodTemplate 即可实现对 Jenkins 构建节点的维护。为了解决该问题, 我们需要搞定 Jenkins 配置中的 PodTemplate 与 Kubernetes 中内置 PodTemplate 不一致的问题;以及如何动态加载 Jenkins 配置的问题。

为了解决上述的几个问题点,只需要部署一个 Deployment 即可。这个组件负责监听 Kubernetes 内置的 PodTemplate, 把其加载到 Jenkins 的系统配置(CasC YAML 文件)中,再调用 Jenkins API 重新加载配置。为了充分地利用到 Kubernetes 的优势, 我们把 CasC 配置存储为 ConfigMap,并以卷(Volume)的形式挂载到 Jenkins 中。

以下是实验步骤(本文提供的是核心思路和关键步骤,每个具体的文件都可以在文末提供的代码仓库地址中找到):

准备一个 Kubernetes 集群,确保有足够的访问权限,确保不会影响到集群已有业务。推荐使用诸如:MiniKube、Kind、K3s 等便于开发、测试的轻型集群。

首先,把 Jenkins 的系统配置以 CasC YAML 格式存放到 ConfigMap 中,例如:

apiVersion: v1
data:
jenkins_user.yaml: |
jenkins:
mode: EXCLUSIVE
numExecutors: 0
scmCheckoutRetryCount: 2
disableRememberMe: true
clouds:
- kubernetes:
name: "kubernetes"
serverUrl: "https://kubernetes.default"
skipTlsVerify: true
kind: ConfigMap
metadata:
name: jenkins-casc-config
namespace: kubesphere-devops-system

然后,把上面的 ConfigMap 挂载到 Jenkins 工作负载中。需要注意的是, 实验中使用的 Jenkins 必须安装的插件有:kubernetes kubernetes-credentials-provider configuration-as-code。参考如下:

spec:
template:
spec:
containers:
- image: ghcr.io/linuxsuren/jenkins:lts
env:
- name: CASC_JENKINS_CONFIG
value: "/var/jenkins_home/casc_configs/" # loading config file from a directory that was mount from a ConfigMap
volumeMounts:
- mountPath: /var/jenkins_home/casc_configs
name: casc-config # mount from a volume
volumes:
- configMap:
defaultMode: 420
name: jenkins-casc-config # clamin a ConfigMap volume, all the CasC YAML content will be here
name: casc-config

接下来,便是核心的 Kubernetes 控制器了。请参考如下配置创建对应的 Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins-agent
namespace: kubesphere-devops-system
spec:
template:
spec:
containers:
- image: kubespheredev/devops-controller:dev-v3.2.1-rc.3-6726130
name: controller
args:
- --enabled-controllers
- all=false,jenkinsagent=true,jenkinsconfig=true # only enable the necessary features of this controller

该控制器会监听所有带有标签 jenkins.agent.pod 的 PodTemplate 资源,并把它转化为 Jenkins 风格的 PodTemplate 后加载到系统配置中。 通常情况下,这可能会有 3~5 秒的延迟。

当你完成以上所有步骤,确保相关组件都正确启动后,就可以尝试添加一个 Kubernetes 内置的 PodTemplate了。然后,你可以创建一个流水线来测试对应的节点。

参考资料

本文由博客一文多发平台 OpenWrite 发布!

利用 Kubernetes 内置 PodTemplate 管理 Jenkins 构建节点的更多相关文章

  1. 【Android】18.1 利用安卓内置的定位服务实现位置跟踪

    分类:C#.Android.VS2015: 创建日期:2016-03-04 一.安卓内置的定位服务简介 通常将各种不同的定位技术称为位置服务或定位服务.这种服务是通过电信运营商的无线电通信网络(如GS ...

  2. SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)

    SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅 ...

  3. 如何利用.Net内置类,解析未知复杂Json对象

    如何利用.Net内置类,解析未知复杂Json对象 如果你乐意,当然可以使用强大的第三方类库Json.Net中的JObject类解析复杂Json字串 . 我不太希望引入第三方类库,所以在.Net内置类J ...

  4. python 练习题:请利用Python内置的hex()函数把一个整数转换成十六进制表示的字符串

    # -*- coding: utf-8 -*- # 请利用Python内置的hex()函数把一个整数转换成十六进制表示的字符串 n1 = 255 n2 = 1000 print(hex(n1)) pr ...

  5. 利用Windows内置工具winsat测试硬盘速度(SSD&机械盘对比)

    利用Windows内置工具winsat测试硬盘速度(SSD&机械盘对比) 以下是红色内容是在命令行运行: C:\Users\Administrator>winsat diskWindow ...

  6. 利用Java内置的API开发JMX功能

    一.什么是JMX JMS是一种Java规范,定义了如何管理一个软件系统(或应用程序)的规范. 对于一个简单的应用程序,该程序本身不需要被管理.但如果是开发的一个复杂系统(如一个电商平台.一个企业内部管 ...

  7. 使用Java内置的Http Server构建Web应用

    一.概述 使用Java技术构建Web应用时, 我们通常离不开tomcat和jetty之类的servlet容器,这些Web服务器功能强大,性能强劲,深受欢迎,是运行大型Web应用的必备神器. 虽然Jav ...

  8. golang内置包管理工具go mod简明教程

    go mod go buildin package manager. go mod是go语言内置的包管理工具,集成在go tool中,安装好go就可以使用. 要求: go version >= ...

  9. 利用jQuery内置的data()方法存储数据

    jQuery提供了内置的data()方法,与DOM元素不同的是,它可以用来存储key/value类型的数据.数据的存储是很容易的: $('#myDiv').data('currentState', ' ...

  10. Qt给应用程序添加版本信息(对rc文件的设置,可利用QT内置变量)

    作者:daodaoliang 时间:2016年7月11日16:12:09 版本:V 0.0.4 邮箱:daodaoliang@yeah.net 0. 环境说明 系统环境: win10 64位 Qt环境 ...

随机推荐

  1. Hessian Free Optimization——外国网友分享的“共轭梯度”的推导

    外国网友分享的"共轭梯度"的推导: https://andrew.gibiansky.com/blog/machine-learning/hessian-free-optimiza ...

  2. 如何将Linux的NIC 名称更改为 eth0 而不是 enps33 或 enp0s25,只要几秒钟

    概述 我们使用Linux系统,网卡名称通常都是eth0,但是有一些新的linux发行版,网卡名字 enps33 或 enp0s25. peng@ubuntu:~$ ifconfig ens33 Lin ...

  3. STM32开发踩大坑(技术总监出马救场)

    代码中线进行spi初始化,再进行st7789的初始化.在st7789的初始化中,把spi初始化的配置信息pb15和pb13覆盖了,故数据传输不过去.当时st7789是直接拿样例代码过来用的,模拟spi ...

  4. IE中在线预览PDF文件

    今天在项目中偶然遇到一个需要在线查看pdf的需求.在查阅一些资料之后使用了最简单的写法(需要在客户端安装AdbeRdr11000_zh_CN_11.0.0.379.exe软件). 还有其他方法可以实现 ...

  5. Mac 右键菜单中出现多个 Edge 版本解决方法

    cd "/Applications/Microsoft Edge.app/Contents/Frameworks/Microsoft Edge Framework.framework/Ver ...

  6. 浅触go中的单元测试

    对于一个写好的功能模块,我们还需要对其进行单元测试,确保该模块不会出现其他bug,或者输出不是期望结果 对于一个go程序,主要设计以下命令: 执行测试 go test -v / go test 执行某 ...

  7. Consider defining a bean of type 'xxxxxx' in your configuration.

    解决: 在Application类上新增@EnableConfigurationProperties({ xxxxxx.class})

  8. 通过C#在Word中插入或删除分节符

    在Word中,分节符是一种强大的工具,用于将文档分成不同的部分,每个部分可以有独立的页面设置,如页边距.纸张方向.页眉和页脚等.正确使用分节符可以极大地提升文档的组织性和专业性,特别是在长文档中,需要 ...

  9. Node.js开发博客项目笔记-初始化路由(博客列表、新增、更新、删除、详情、登录)(3)

    工程目录 如图所示,工程目录如下: 我们在工程下新建src的目录,src目录下新建三个文件夹: controller:交互数据放到该目录下: model:model类放到该目录下: router:路由 ...

  10. JavaScript – Temporal API & Date

    前言 Temporal API 是 JS 的新东西,用来取代 Date.虽然现在 (12-09-2024) 依然没有任何游览器支持 Temporal API,但它已经是 stage 3 了,而且有完整 ...