利用 Kubernetes 内置 PodTemplate 管理 Jenkins 构建节点

KubeSphere北京
English
作者: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了。然后,你可以创建一个流水线来测试对应的节点。

参考资料

阅读 364

KubeSphere 是一个开源的以应用为中心的容器管理平台,支持部署在任何基础设施之上,并提供简单易用的 U...

98 声望
0 粉丝
0 条评论
推荐阅读
使用 KubeSphere 部署高可用 RocketMQ 集群
Spring Cloud Alibaba 全家桶之 RocketMQ 是一款典型的分布式架构下的消息中间件产品,使用异步通信方式和发布订阅的消息传输模型。

KubeSphere阅读 112

在 Kubernetes 中实现微服务应用监控
KubeSphere 平台本身提供了监控功能,包括节点状态、集群资源使用率、Etcd、API Server 等监控,不过缺少了应用级别的监控。

KubeSphere3阅读 398

大厂都在卷的云原生,对开发者意味着什么?
过去数年间,在企业数字化转型的大趋势下,云原生,凭借其敏捷、弹性、平滑的特征,不仅帮助大量企业实现降本增效,也大幅提升了开发过程中的生产力,成为当下最主流的技术发展方向之一。不过,对于开发者而言,...

MissD1阅读 432

# Serverless架构演进与实践
Serverless的全称是Serverless computing无服务器运算,又被称为函数即服务(Function-as-a-Service,缩写为 FaaS),是云计算的一种模型。以平台即服务(PaaS)为基础,无服务器运算提供一个微型的架构,终端客...

得物技术1阅读 634

封面图
KubeSphere 集群配置 NFS 存储解决方案
在正式阅读本文之前,先友情提醒一下:不建议您在生产环境中使用 NFS 存储(特别是 Kubernetes 1.20 或以上版本),原因如下:

KubeSphere2阅读 310

多云容器编排 Karmada-Operator 实践
Karmada作为开源的云原生多云容器编排项目,吸引了众多企业共同参与项目开发,并运行于生产环境中。同时多云也逐步成为数据中心建设的基础架构,多区域容灾与多活、大规模多集群管理、跨云弹性与迁移等场景推动云...

vivo互联网技术1阅读 389

9月微软技术课程,欢迎参与!
微软技术赋能阵地,集合了微软丰富技术课程的全新技术平台,内容上覆盖了软件开发、#云计算、#AI、大数据、#迁移上云、数据安全、协作办公、商业智能等众多热门话题,戳下图扫码报名↓

微软技术栈1阅读 491

KubeSphere 是一个开源的以应用为中心的容器管理平台,支持部署在任何基础设施之上,并提供简单易用的 U...

98 声望
40 粉丝
宣传栏