作者: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: v1data: jenkins_user.yaml: |   jenkins:     mode: EXCLUSIVE     numExecutors: 0     scmCheckoutRetryCount: 2     disableRememberMe: true     clouds:       - kubernetes:           name: "kubernetes"           serverUrl: "https://kubernetes.default"           skipTlsVerify: truekind: ConfigMapmetadata: 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/v1kind: Deploymentmetadata: name: jenkins-agent namespace: kubesphere-devops-systemspec: 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 公布!