1. 项目概述
这套方案的核心目标是通过Rancher管理Kubernetes集群,结合Jenkins实现JeecgBoot项目的CI/CD全流程自动化部署。我在实际企业级落地过程中发现,很多团队在整合这三个平台时都会遇到配置断层的问题,特别是权限对接和网络策略这块经常成为拦路虎。
JeecgBoot作为国内流行的低代码开发平台,其微服务架构对部署环境有特殊要求。传统单机部署方式无法满足高可用需求,而直接使用原生Kubernetes又面临学习曲线陡峭的问题。Rancher的图形化管理界面恰好弥补了这个缺口,配合Jenkins的流水线能力,可以构建从代码提交到生产发布的完整工具链。
2. 环境准备与架构设计
2.1 硬件资源配置建议
生产环境建议采用3节点集群配置:
- 控制节点:4核8G内存 100G磁盘(运行Rancher和K8s控制平面)
- 工作节点:8核16G内存 200G磁盘(运行JeecgBoot组件)
- 存储节点:单独配置NFS或Ceph集群
特别注意:JeecgBoot的Redis和MySQL建议使用云服务或独立部署,不要放在K8s集群内,避免数据持久化问题。
2.2 软件版本兼容性矩阵
经过实际验证的稳定版本组合:
| 组件 | 版本 | 备注 |
|---|---|---|
| Rancher | 2.6.8 | 长期支持版本 |
| Kubernetes | 1.22.15 | Rancher默认支持的最高稳定版 |
| Jenkins | 2.346.3 | LTS版本 |
| JeecgBoot | 3.4.2 | 商业版需额外配置license |
3. Rancher集群部署实战
3.1 自定义集群安装
使用RKE2作为底层运行时,相比传统RKE有更好的性能表现:
bash复制# 在所有节点执行
curl -sfL https://get.rke2.io | INSTALL_RKE2_VERSION=v1.22.15+rke2r1 sh -
systemctl enable rke2-server.service
systemctl start rke2-server.service
Rancher安装采用Helm方式:
bash复制helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--set hostname=rancher.yourdomain.com \
--set bootstrapPassword=Admin@123 \
--set replicas=3 \
--version 2.6.8
3.2 网络策略配置关键点
JeecgBoot需要开放的端口:
- 前端:80/443
- 网关:9999
- 各微服务:7000-8000范围
配置示例:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: jeecg-allow
spec:
podSelector:
matchLabels:
app: jeecg-boot
policyTypes:
- Ingress
ingress:
- ports:
- protocol: TCP
port: 9999
- protocol: TCP
port: 80
4. Jenkins与K8s深度集成
4.1 动态Jenkins Agent配置
在Jenkinsfile中定义动态podTemplate:
groovy复制podTemplate(
containers: [
containerTemplate(
name: 'maven',
image: 'maven:3.8.6-jdk-11',
command: 'cat',
ttyEnabled: true
),
containerTemplate(
name: 'kubectl',
image: 'bitnami/kubectl:1.22.15',
command: 'cat',
ttyEnabled: true
)
],
volumes: [
hostPathVolume(
mountPath: '/home/jenkins/.m2',
hostPath: '/data/jenkins/m2'
)
]
) {
node(POD_LABEL) {
stage('Build') {
container('maven') {
sh 'mvn clean package -DskipTests'
}
}
}
}
4.2 凭据管理最佳实践
- 在Rancher中创建ServiceAccount并导出kubeconfig
- 使用Jenkins的Kubernetes Credentials插件绑定
- 通过secretKeyRef在pipeline中引用:
groovy复制environment {
KUBECONFIG = credentials('rancher-kubeconfig')
}
5. JeecgBoot定制化部署
5.1 数据库初始化处理
在Chart的pre-install hook中执行SQL初始化:
yaml复制apiVersion: batch/v1
kind: Job
metadata:
name: jeecg-db-init
annotations:
"helm.sh/hook": pre-install
spec:
template:
spec:
containers:
- name: mysql-client
image: mysql:5.7
command: ["sh", "-c"]
args:
- mysql -h $DB_HOST -u root -p$DB_PWD < /sql/init.sql
env:
- name: DB_HOST
value: "mysql-service"
- name: DB_PWD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
5.2 配置文件热加载方案
使用ConfigMap + Reloader实现配置热更新:
yaml复制apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
reloader.stakater.com/auto: "true"
spec:
template:
spec:
containers:
- name: jeecg-app
volumeMounts:
- name: config-volume
mountPath: /config
volumes:
- name: config-volume
configMap:
name: jeecg-config
6. 完整CI/CD流水线示例
6.1 多环境发布策略
groovy复制pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn -Pprod clean package'
archiveArtifacts '**/target/*.jar'
}
}
stage('Deploy to Test') {
when { branch 'develop' }
steps {
sh 'kubectl apply -f k8s/test/'
input 'Approve Production?'
}
}
stage('Deploy to Prod') {
when { branch 'main' }
steps {
sh 'kubectl apply -f k8s/prod/'
}
}
}
}
6.2 镜像扫描与安全校验
集成Trivy进行漏洞扫描:
bash复制docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy:0.34.0 image --exit-code 1 \
--severity CRITICAL your-registry/jeecg-boot:${BUILD_NUMBER}
7. 故障排查手册
7.1 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| Pod一直处于Pending状态 | 资源不足或节点选择器错误 | kubectl describe pod <name>查看事件 |
| 服务访问超时 | NetworkPolicy拦截 | 检查默认deny-all策略 |
| Jenkins连接K8s失败 | RBAC权限不足 | 检查ServiceAccount绑定角色 |
| JeecgBoot启动报数据库连接错误 | 数据库白名单未配置 | 添加K8s Pod IP段到数据库ACL |
7.2 日志收集技巧
使用Rancher的日志聚合功能:
- 启用Cluster Explorer中的Logging功能
- 配置FluentBit输出到Elasticsearch
- 通过Kibana查看JeecgBoot各组件日志
关键日志路径:
- 网关服务:/logs/jeecg-gateway.log
- 业务模块:/logs/jeecg-module-*.log
- GC日志:/logs/gc-%p.log
8. 性能调优建议
8.1 JVM参数优化
针对JeecgBoot的Java应用推荐配置:
yaml复制env:
- name: JAVA_OPTS
value: >-
-server
-Xms2g
-Xmx2g
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
8.2 Ingress控制器调优
使用Nginx Ingress时的关键参数:
yaml复制controller:
config:
upstream-keepalive-connections: "200"
worker-processes: "4"
resources:
limits:
cpu: "2"
memory: 2Gi
这套方案在某制造企业落地后,部署效率提升70%以上,生产环境发布耗时从原来的2小时缩短到15分钟。最关键的是通过Rancher的统一管理界面,让运维团队能够快速定位问题,不再需要记忆复杂的kubectl命令。对于Java应用的部署,特别要注意JVM参数和线程池的配置,避免出现内存泄漏导致Pod不断重启的情况。
