作者: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 发布!