跳到主要内容

Jenkins 在 Kubernetes 平台部署指南

概述

Jenkins 是一个开源的持续集成和持续部署工具,广泛用于自动化构建、测试和部署软件项目。本文档将详细介绍如何在 Kubernetes 平台中通过 Helm 部署 Jenkins。

目录

  1. 环境准备
  2. Helm 部署 Jenkins
  3. 网络配置
  4. 部署验证与访问
  5. 可选:使用 MinIO 作为存储后端

1. 环境准备

1.1 Kubernetes 平台要求

  • Kubernetes 版本: 1.20+
  • 节点配置: 至少 2 个节点,每个节点最少 2 核 4GB 内存
  • 存储类: 需要配置默认存储类(如 NFS、Local Path 等)

1.2 必需组件启用

确保以下组件已启用:

  • Ingress Controller(如 Nginx Ingress)
  • 默认 StorageClass

2. Helm 部署 Jenkins

2.1 添加 Jenkins Helm 仓库

# 添加 Jenkins Helm 仓库
helm repo add jenkins https://charts.jenkins.io
helm repo update

2.2 配置 Jenkins 参数

创建 jenkins-values.yaml 配置文件:

# Jenkins 配置
controller:
# 镜像配置
image: "jenkins/jenkins"
tag: "2.401.3-jdk11"
imagePullPolicy: "Always"

# 管理员配置
adminUser: "admin"
adminPassword: "admin123"

# 资源限制
resources:
limits:
cpu: 2000m
memory: 4Gi
requests:
cpu: 1000m
memory: 2Gi

# 持久化存储
persistence:
enabled: true
storageClass: ""
annotations: {}
accessMode: "ReadWriteOnce"
size: "8Gi"
volumes:
- name: jenkins-home
emptyDir: {}
mounts:
- mountPath: /var/jenkins_home
name: jenkins-home
readOnly: false

# 网络配置
service:
port: 8080
type: ClusterIP

# Java 配置
javaOpts: "-Xms2g -Xmx4g"

# 插件配置
installPlugins:
- kubernetes:3936.v3ca_518c73f06
- workflow-aggregator:590.v6a_d052e5a_a_b_5
- git:5.0.0
- configuration-as-code:1569.vb_72405b_80249

# Agent 配置
agent:
enabled: true
image: "jenkins/inbound-agent"
tag: "3161.v1f9253ff3c70-1"
workingDir: "/home/jenkins"

resources:
limits:
cpu: 500m
memory: 1Gi
requests:
cpu: 250m
memory: 512Mi

# 持久化配置
persistence:
enabled: true
existingClaim: ""
storageClass: ""
annotations: {}
accessMode: "ReadWriteOnce"
size: "8Gi"
volumes:
- name: jenkins-home
emptyDir: {}
mounts:
- mountPath: /var/jenkins_home
name: jenkins-home
readOnly: false

# 网络策略
networkPolicy:
enabled: false

# RBAC 配置
rbac:
create: true

# ServiceAccount 配置
serviceAccount:
create: true
name: ""

2.3 安装 Jenkins

# 创建命名空间
kubectl create namespace jenkins

# 安装 Jenkins
helm install jenkins jenkins/jenkins \
--namespace jenkins \
--values jenkins-values.yaml \
--version 4.3.1

3. 网络配置

3.1 创建 Ingress

创建 jenkins-ingress.yaml 文件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: jenkins-ingress
namespace: jenkins
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"
nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"
spec:
tls:
- hosts:
- jenkins.example.com
secretName: jenkins-tls
rules:
- host: jenkins.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: jenkins
port:
number: 8080

应用 Ingress 配置:

kubectl apply -f jenkins-ingress.yaml

4. 部署验证与访问

4.1 检查服务状态

# 检查 Jenkins Pod 状态
kubectl get pods -n jenkins

# 检查 Jenkins 服务状态
kubectl get svc -n jenkins

# 检查 Ingress 状态
kubectl get ingress -n jenkins

4.2 访问 Jenkins Web 界面

  1. 在本地 /etc/hosts 文件中添加域名解析:

    <节点IP> jenkins.example.com
  2. 在浏览器中访问:https://jenkins.example.com

4.3 功能验证

获取初始管理员密码

# 获取 Jenkins 初始管理员密码
kubectl exec -it -n jenkins svc/jenkins -c jenkins -- cat /var/jenkins_home/secrets/initialAdminPassword

登录验证

使用获取到的初始密码登录 Jenkins,然后按照向导完成初始化设置。

创建测试任务

  1. 创建一个简单的 "Hello World" 流水线任务
  2. 执行任务并验证结果

5. 可选:使用 MinIO 作为存储后端

5.1 MinIO 存储优势

将 Jenkins 的存储后端配置为使用 MinIO 提供了以下优势:

  1. 高可用性: MinIO 集群提供企业级的高可用性和数据冗余
  2. 扩展性: 可以轻松水平扩展存储容量和性能
  3. 成本效益: 使用标准硬件构建分布式存储,比传统 SAN 存储更经济
  4. S3 兼容性: Jenkins 可以通过 S3 插件与 MinIO 无缝集成
  5. 统一存储: 可以为多个应用提供对象存储服务

5.2 配置 Jenkins 使用 MinIO

要将 Jenkins 配置为使用 MinIO 作为存储后端,请按以下步骤操作:

5.2.1 准备 MinIO 环境

确保您已经部署了 MinIO 集群,参考 MinIO 集群高可用部署方案

在 MinIO 中创建 Jenkins 专用的存储桶:

# 使用 mc 客户端创建存储桶
mc mb minio/jenkins-backups

# 设置存储桶策略(可选,根据安全要求调整)
mc anonymous set download minio/jenkins-backups

5.2.2 创建 MinIO 访问凭证

在 MinIO 中创建专门用于 Jenkins 的访问密钥:

# 创建访问密钥(在 MinIO 控制台或通过 mc 命令)
mc admin user add minio jenkins-user jenkins-password123

# 分配存储桶访问策略
mc admin policy attach minio readwrite --user jenkins-user

5.2.3 安装和配置 S3 插件

  1. 在 Jenkins 界面中,进入 Manage Jenkins > Manage Plugins
  2. 搜索并安装以下插件:
    • S3 plugin
    • Amazon S3 Standard Storage Service

5.2.4 配置 Jenkins 使用 MinIO 存储

  1. 在 Jenkins 界面中,进入 Manage Jenkins > Configure System

  2. 找到 Amazon S3 profiles 部分,添加新的配置:

    • Profile name: minio
    • Access Key: jenkins-user
    • Secret Key: jenkins-password123
    • S3 Endpoint: http://192.168.192.115:9000
    • Region: us-east-1
    • Use path style access: 勾选
    • Use HTTPS: 取消勾选(如果使用 HTTP)
  3. 保存配置

5.2.5 配置备份任务

创建一个定时任务将 Jenkins 配置和数据备份到 MinIO:

  1. 创建一个新的 Pipeline 任务
  2. 在 Pipeline 脚本中添加以下内容:
pipeline {
agent any

environment {
S3_PROFILE = 'minio'
BUCKET_NAME = 'jenkins-backups'
BACKUP_DIR = '/var/jenkins_home/backups'
}

stages {
stage('Backup Jenkins') {
steps {
script {
// 创建备份目录
sh 'mkdir -p ${BACKUP_DIR}'

// 备份 Jenkins 配置
sh 'tar -czf ${BACKUP_DIR}/jenkins-config-$(date +%Y%m%d-%H%M%S).tar.gz /var/jenkins_home/'

// 上传到 MinIO
sh 'aws s3 cp ${BACKUP_DIR}/ s3://${BUCKET_NAME}/ --recursive --profile ${S3_PROFILE}'
}
}
}
}
}

5.2.6 配置 Jenkins 持久化存储(可选)

如果您希望将 Jenkins 的主目录直接存储在 MinIO 上,可以通过 NFS 网关实现:

  1. 部署 MinIO NFS 网关:
# 在 Kubernetes 中部署 MinIO NFS 网关
helm install minio-nfs-gateway minio/minio \
--set mode=standalone \
--set nfs.mountPath=/data \
--set persistence.enabled=true \
--set service.type=LoadBalancer
  1. 修改 Jenkins 部署配置以使用 NFS 存储:
controller:
persistence:
enabled: true
existingClaim: "jenkins-nfs-pvc" # 使用 NFS PVC

# 创建 NFS PVC
persistence:
enabled: true
existingClaim: "jenkins-nfs-pvc"

5.2.7 验证配置

部署完成后,可以通过以下方式验证 MinIO 存储是否正常工作:

  1. 执行备份任务,检查 MinIO 存储桶中是否出现对应的备份文件
  2. 查看 Jenkins 日志确认没有存储相关的错误
# 查看 Jenkins 日志
kubectl logs -n jenkins -l app.kubernetes.io/name=jenkins

# 在 MinIO 中检查存储桶内容
mc ls minio/jenkins-backups

通过以上配置,Jenkins 可以利用 MinIO 作为备份存储后端,享受分布式存储带来的高可用性和扩展性。