Jenkins 在 Kubernetes 平台部署指南
概述
Jenkins 是一个开源的持续集成和持续部署工具,广泛用于自动化构建、测试和部署软件项目。本文档将详细介绍如何在 Kubernetes 平台中通过 Helm 部署 Jenkins。
目录
- 环境准备
- 1.1 Kubernetes 平台要求
- 1.2 必需组件启用
- Helm 部署 Jenkins
- 2.1 添加 Jenkins Helm 仓库
- 2.2 配置 Jenkins 参数
- 2.3 安装 Jenkins
- 网络配置
- 3.1 创建 Ingress
- 部署验证与访问
- 4.1 检查服务状态
- 4.2 访问 Jenkins Web 界面
- 4.3 功能验证
- 可选:使用 MinIO 作为存储后端
- 5.1 MinIO 存储优势
- 5.2 配置 Jenkins 使用 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 界面
-
在本地
/etc/hosts文件中添加域名解析:<节点IP> jenkins.example.com -
在浏览器中访问:
https://jenkins.example.com
4.3 功能验证
获取初始管理员密码
# 获取 Jenkins 初始管理员密码
kubectl exec -it -n jenkins svc/jenkins -c jenkins -- cat /var/jenkins_home/secrets/initialAdminPassword
登录验证
使用获取到的初始密码登录 Jenkins,然后按照向导完成初始化设置。
创建测试任务
- 创建一个简单的 "Hello World" 流水线任务
- 执行任务并验证结果
5. 可选:使用 MinIO 作为存储后端
5.1 MinIO 存储优势
将 Jenkins 的存储后端配置为使用 MinIO 提供了以下优势:
- 高可用性: MinIO 集群提供企业级的高可用性和数据冗余
- 扩展性: 可以轻松水平扩展存储容量和性能
- 成本效益: 使用标准硬件构建分布式存储,比传统 SAN 存储更经济
- S3 兼容性: Jenkins 可以通过 S3 插件与 MinIO 无缝集成
- 统一存储: 可以为多个应用提供对象存储服务
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 插件
- 在 Jenkins 界面中,进入 Manage Jenkins > Manage Plugins
- 搜索并安装以下插件:
- S3 plugin
- Amazon S3 Standard Storage Service
5.2.4 配置 Jenkins 使用 MinIO 存储
-
在 Jenkins 界面中,进入 Manage Jenkins > Configure System
-
找到 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)
-
保存配置
5.2.5 配置备份任务
创建一个定时任务将 Jenkins 配置和数据备份到 MinIO:
- 创建一个新的 Pipeline 任务
- 在 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 网关实现:
- 部署 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
- 修改 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 存储是否正常工作:
- 执行备份任务,检查 MinIO 存储桶中是否出现对应的备份文件
- 查看 Jenkins 日志确认没有存储相关的错误
# 查看 Jenkins 日志
kubectl logs -n jenkins -l app.kubernetes.io/name=jenkins
# 在 MinIO 中检查存储桶内容
mc ls minio/jenkins-backups
通过以上配置,Jenkins 可以利用 MinIO 作为备份存储后端,享受分布式存储带来的高可用性和扩展性。