首页 > 其他分享 >利用 Kubernetes 内置 PodTemplate 管理 Jenkins 构建节点

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

时间:2022-10-10 12:11:26浏览次数:55  
标签:name Kubernetes PodTemplate jenkins Jenkins 节点


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

利用 Kubernetes 内置 PodTemplate 管理 Jenkins 构建节点_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了。然后,你可以创建一个流水线来测试对应的节点。

参考资料

  • 示例配置文件 https://github.com/devops-ws/learn-kustomization/tree/main/jenkins
  • 核心控制器 https://github.com/kubesphere/ks-devops
  • 英文版本 https://www.jenkins.io/blog/2022/08/05/manage-jenkins-agents-with-podtemplate/

标签:name,Kubernetes,PodTemplate,jenkins,Jenkins,节点
From: https://blog.51cto.com/suren/5743065

相关文章

  • 【 云原生 | kubernetes】- 资源调度
    调度是指将Pod放置到合适的Node上,然后对应Node上的Kubelet才能够运行这些pod。调度概览调度器通过kubernetes的监测(Watch)机制来发现集群中新创建且尚未被调......
  • jenkins 流水线任务初体验
     1.选创建一个流水线任务。  2.运行helloworld    3.可以看到运行后的效果图。  4.pipeline语法解析//所有脚本命令都放在pipeline中pipeline{......
  • 一文理清pycharm+git+jenkins项目持续集成和自动化构建流程(Windows)
    最近得空,整理了一下pycharm+git+jenkins实现python项目持续集成和自动化构建的配置流程,包括软件包、所需插件的安装配置。1、安装和配置git    1.1安装git:官网下......
  • Docker 安装 Jenkins 并实现项目自动化部署
    Jenkins是一款开源的持续集成(DI)工具,广泛用于项目开发,能提供自动构建,测试,部署等功能。作为领先的开源自动化服务器,Jenkins提供了数百个插件来支持构建、部署和自动化任何......
  • @Devops jenkins安装jenkins的项目构建详解
    文章目录​​Devops​​​​一、jenkins安装步骤​​​​1、安装jdk​​​​2、获取安装包​​​​3、安装​​​​4、配置文件修改​​​​5、启动jenkins​​​​6、浏览......
  • Jenkins——在流水线管道中使用指定的JDK
    前言如题,在流水线管道中使用指定的JDK内容通过在tools下来指定JDKstage('Build'){tools{jdk"JDK8u231"}steps{sh'/var/jenkin......
  • k8s部署Jenkins
    kind:DeploymentapiVersion:apps/v1metadata:labels:k8s-app:jenkinsname:jenkinsnamespace:devopsspec:replicas:1revisionHistoryLimit:10selecto......
  • docker jenkins升级以及失败处理
    一、概述jenkins是由docker安装的,目前的jenkins版本为2.356。然后jenkins右上角提示版本升级 点击了升级,升级完成后,需要重启一下。然后就芭比Q了,访问jenkins出现504......
  • kubernetes Tcp流量可视化
    kubernetesTcp流量可视化使用k8spacket和grafana的nodegraph插件可以查看kubernetespod的TCP相关信息,如connection、bytes、和duration。下面是接收和响应的字节数信息......
  • Kubernetes14-Helm:Kubernetes应用包管理
    1、Helm概述1.1、Helm介绍随着容器技术逐渐被企业接受,在Kubernetes上已经能便捷地部署简单的应用了。但对于复杂的应用中间件,在Kubernetes上进行容器化部署并非易事,通常......