1. 概述

自动化是交付高质量应用的关键环节。Jenkins 是最流行的开源自动化服务器之一,广泛用于构建 CI/CD(持续集成/持续交付)流水线。当与 Kubernetes(一个用于容器编排的开源平台)结合使用时,Jenkins 的能力将更加强大,具备可扩展性、容错性和便捷的部署能力。

本教程将带你一步步完成在 Kubernetes 集群上部署 Jenkins 的全过程,涵盖从安装到运行示例流水线的各个环节。这种分步实施的方式将有助于确保两种技术的顺利集成和高效使用。

2. Jenkins 是什么?

Jenkins 是一个开源的自动化服务器,帮助开发者自动化软件开发的各个阶段,包括构建、测试和部署。通过丰富的插件支持,Jenkins 可以兼容多种技术栈,是一个高度灵活的开发工具。

3. 为什么要在 Kubernetes 上运行 Jenkins?

Kubernetes(常简称为 K8s)是一个用于管理容器化应用的强大平台。将 Jenkins 部署在 Kubernetes 上有以下优势:

  • 可扩展性:Kubernetes 可以轻松地通过增加更多 agent 节点来扩展 Jenkins 以应对更大负载。
  • 自愈能力:Kubernetes 会自动重启失败的 Jenkins Pod,确保最小的停机时间。
  • 负载均衡:Kubernetes 将负载均匀地分布在多个 Jenkins Pod 上,提高系统稳定性。

4. Kubernetes 上部署 Jenkins 的前提条件

开始部署前,请确保满足以下条件:

  • ✅ 一个正在运行的 Kubernetes 集群(本地或云环境,如 Minikube 或 GKE)
  • ✅ 已安装并配置好 kubectl,用于与 Kubernetes 集群交互
  • ✅ Helm(可选)用于更便捷地管理 Jenkins 的部署

5. 在 Kubernetes 上一步步部署 Jenkins

在 Kubernetes 上部署 Jenkins 需要考虑多个关键点,包括命名空间设置、持久化存储配置等。这些步骤对确保 CI/CD 流水线的可扩展性、稳定性和性能至关重要。

5.1. 为 Jenkins 创建命名空间

第一步是创建一个专属的命名空间。命名空间可以隔离资源,便于管理。

$ kubectl create namespace jenkins

该命令创建了一个名为 jenkins 的命名空间,确保所有与 Jenkins 相关的资源都集中在这个命名空间中。

5.2. 使用 YAML 配置文件部署 Jenkins

接下来,我们通过一个 YAML 文件定义 Jenkins 的部署配置。该文件指定了 Jenkins 镜像、副本数以及所需端口等信息。

以下是一个 Jenkins 部署的 YAML 示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      containers:
      - name: jenkins
        image: jenkins/jenkins:lts
        ports:
        - name: http
          containerPort: 8080
        - name: jnlp
          containerPort: 50000

使用 kubectl 应用该部署:

$ kubectl apply -f jenkins-deployment.yaml

5.3. 使用 NodePort 暴露 Jenkins 服务

为了让外部可以访问 Jenkins,我们需要暴露服务。可以通过创建一个 NodePort 类型的服务来实现。

创建一个名为 jenkins-service.yaml 的文件,内容如下:

apiVersion: v1
kind: Service
metadata:
  name: jenkins
  namespace: jenkins
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30000
  selector:
    app: jenkins

然后应用该服务配置:

$ kubectl apply -f jenkins-service.yaml

该服务将 Jenkins 暴露在 30000 端口,可以通过节点的外部 IP 访问。

6. 配置 Jenkins 的持久化存储

确保 Jenkins 的数据持久化是保留构建历史和配置的关键。默认情况下,Kubernetes Pod 是临时的,重启后数据会丢失。 为了解决这个问题,我们可以使用 Persistent Volume(PV)和 Persistent Volume Claim(PVC)来配置持久化存储。

以下是一个 PV 和 PVC 的配置示例:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-pvc
  namespace: jenkins
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

使用 kubectl 应用该配置:

$ kubectl apply -f jenkins-pv.yaml

这样即使 Pod 重启或失败,Jenkins 也能保留其关键数据。

7. 访问 Jenkins 的 Web 界面

Jenkins 部署并暴露服务后,我们就可以访问它的 Web 界面了。

首先获取 Kubernetes 节点的外部 IP:

$ kubectl get nodes -o wide

然后在浏览器中访问 http://<node-external-ip>:30000。Jenkins 会提示输入管理员密码,密码可以从 Jenkins Pod 的日志中获取:

$ kubectl logs <jenkins-pod-name> -n jenkins

使用该密码解锁 Jenkins 并完成初始化设置。

进入 Jenkins 后,会看到插件安装界面,可以选择安装推荐插件或手动选择插件:

Jenkins customize plugins screen showing options to install suggested plugins or select plugins manually.

8. 运行一个 Jenkins 流水线示例

Jenkins 设置完成后,我们可以运行一个简单的流水线来验证是否一切正常。

在 Jenkins 首页点击 “New Item”:

Jenkins dashboard with the welcome message and options to create a job or set up distributed builds.

选择 “Pipeline” 并命名为 “Sample Pipeline”:

Jenkins interface for creating a pipeline, displaying options like Freestyle project, Pipeline, and Multi-configuration project.

进入配置页面后,粘贴以下流水线脚本:

Jenkins pipeline script editor with a basic pipeline script configured to print 'Hello World' in the build stage.

pipeline {
    agent any
    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

保存配置后,点击 “Build Now” 触发构建:

Jenkins pipeline dashboard for the sample pipeline with options to build, configure, or view pipeline stages.

构建完成后,在 “Console Output” 中查看执行结果:

Jenkins console output showing the pipeline execution with a Hello World message and a successful build.

9. 使用 Helm 管理 Jenkins

Helm 可以简化在 Kubernetes 上部署复杂应用(如 Jenkins)的过程。相比于手动编写 YAML 文件(如 5.2、5.3 和 6 节所述),Helm Chart 提供了可复用、可定制的模板,自动化部署流程。

何时使用 Helm:

  • ✅ 如果你希望使用 Helm 来管理 Jenkins,可以跳过 5.2、5.3 和 6 节的手动部署步骤,Helm 会自动完成部署、服务暴露和持久化配置
  • ⚠️ 但建议继续阅读 7 和 8 节,以便在 Helm 安装后访问 Jenkins UI 并运行示例流水线

使用 Helm 安装 Jenkins:

首先添加 Jenkins Helm 仓库:

$ helm repo add jenkinsci https://charts.jenkins.io
$ helm repo update

然后使用 Helm 安装 Jenkins:

$ helm install jenkins -n jenkins jenkinsci/jenkins

Helm 会自动使用默认配置部署 Jenkins,你也可以通过修改 Helm values 文件来自定义部署。

10. 配置 Jenkins 的高可用性

为确保 Jenkins 能够处理更高的负载并在故障时保持可用,我们需要配置其高可用性。这包括部署多个 Jenkins Agent 实例,并确保负载可以在多个节点之间均衡分配。

11. 监控 Kubernetes 上的 Jenkins

Kubernetes 提供了内置的健康检查机制,可用于监控 Jenkins Pod 的状态。通过配置 liveness 和 readiness 探针,我们可以监控 Jenkins 的可用性,并在其功能受影响时及时收到通知。

以下是一个在 Jenkins 部署中添加健康检查的配置示例:

livenessProbe:
  httpGet:
    path: "/login"
    port: 8080
  initialDelaySeconds: 120
  periodSeconds: 30
readinessProbe:
  httpGet:
    path: "/login"
    port: 8080
  initialDelaySeconds: 60
  periodSeconds: 30

配置这些探针后,可以追踪 Jenkins 何时准备好接收请求,并在运行时出现问题时及时发现。

12. 在 Kubernetes 上安全加固 Jenkins

为了防止未经授权的访问,保护 Jenkins 的安全,建议采取以下措施:

  • 创建管理员用户:确保有一个具有强密码的管理员账户。
  • 启用 RBAC:使用 Kubernetes 的基于角色的访问控制(RBAC)来管理用户权限。
  • 配置网络策略:限制仅允许来自可信 IP 范围或服务的访问。
  • 使用 Secrets:将敏感信息(如密码)存储在 Kubernetes Secrets 中,避免暴露在配置文件中。

这些措施有助于保护 Kubernetes 环境中的 Jenkins,确保只有授权用户可以访问系统。

13. 总结

在 Kubernetes 上部署 Jenkins 提供了一种强大且可扩展的自动化 CI/CD 解决方案,使得软件项目的集成和交付更加顺畅。

通过遵循本文所述的步骤,你可以确保 Jenkins 在 Kubernetes 环境中高效安装、配置并优化用于生产环境。

利用持久化存储、监控和高可用性等特性,不仅能保护关键数据,还能提升 Jenkins 的稳定性和性能。这种组合使得 Jenkins 成为任何希望实现软件交付流程高可靠性、可扩展性和高效性的开发团队不可或缺的工具。


原始标题:Guide to Setup Jenkins on Kubernetes