1. 项目概述
最近在帮一家中型企业做JeecgBoot项目的容器化改造,需要将这套低代码开发平台部署到Kubernetes集群上。考虑到团队的技术储备和运维成本,最终选择了Rancher作为Kubernetes管理平台,配合Jenkins实现CI/CD流水线。这套方案经过三个月的生产验证,目前已经稳定运行了200+微服务实例。
提示:这套方案特别适合需要快速构建企业级低代码平台的中小型团队,所有组件都采用开源版本,无需额外授权费用。
2. 整体架构设计
2.1 技术栈选型
核心组件版本选择经过严格测试:
- Rancher 2.6.5(管理K8s集群)
- Kubernetes 1.22(生产环境稳定版本)
- Jenkins 2.346.3(LTS版本)
- JeecgBoot 3.4.3(当前最新稳定版)
架构拓扑如下图所示:
code复制[前端LB] -> [Rancher管理的K8s集群]
├── JeecgBoot命名空间
│ ├── 前端Nginx(3副本)
│ ├── 后端Java服务(动态伸缩)
│ └── Redis/MySQL(有状态服务)
└── CI/CD命名空间
├── Jenkins Master
└── Jenkins Agent Pods
2.2 网络规划建议
生产环境建议采用如下IP规划:
- Service网段:10.43.0.0/16
- Pod网段:10.42.0.0/16
- Ingress VIP:192.168.1.100-150
3. 环境准备
3.1 硬件配置要求
最低配置(测试环境):
- 3台8核16G服务器(etcd+control plane+worker)
- 100GB SSD存储(建议Ceph RBD)
推荐生产配置:
- 3台16核32G专用etcd节点
- 2台8核16G control plane节点
- N台16核32G worker节点(按业务需求扩展)
- 分布式存储(如Longhorn)
3.2 操作系统优化
所有节点需执行:
bash复制# 关闭swap
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
# 优化内核参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
EOF
sysctl --system
4. Rancher集群部署
4.1 单节点安装
快速测试可使用Docker安装:
bash复制docker run -d --restart=unless-stopped \
-p 80:80 -p 443:443 \
--privileged \
rancher/rancher:latest
4.2 高可用部署
生产环境建议使用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 replicas=3 \
--set ingress.tls.source=letsEncrypt
5. Kubernetes集群配置
5.1 通过Rancher创建集群
- 登录Rancher控制台
- 选择"集群管理"->"创建集群"
- 配置集群选项:
- 网络插件:Calico
- 云提供商:None
- 审计日志:Enabled
5.2 关键组件配置
需要特别关注的K8s参数:
yaml复制apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
evictionHard:
memory.available: "500Mi"
nodefs.available: "10%"
kubeReserved:
cpu: "500m"
memory: "1Gi"
6. Jenkins部署与配置
6.1 Helm安装Jenkins
使用官方chart部署:
bash复制helm repo add jenkins https://charts.jenkins.io
helm install jenkins jenkins/jenkins \
--set controller.serviceType=NodePort \
--set controller.servicePort=8080 \
--set controller.adminUser=admin \
--set controller.adminPassword=YourStrongPassword!
6.2 必备插件安装
通过Jenkins脚本控制台批量安装:
groovy复制def plugins = ["kubernetes:1.30.4", "workflow-aggregator:2.6", "git:4.10.0"]
Jenkins.instance.pluginManager.install(plugins, true)
7. JeecgBoot容器化改造
7.1 Dockerfile优化
后端服务示例:
dockerfile复制FROM openjdk:11-jre-slim
RUN mkdir -p /app/lib
COPY target/jeecg-boot-module-system-3.4.3.jar /app/app.jar
COPY target/lib/* /app/lib/
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]
7.2 K8s部署文件
deployment.yaml关键配置:
yaml复制livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 120
periodSeconds: 15
resources:
requests:
memory: "2Gi"
cpu: "500m"
limits:
memory: "4Gi"
cpu: "2"
8. CI/CD流水线实现
8.1 Jenkinsfile完整示例
多分支流水线脚本:
groovy复制pipeline {
agent {
kubernetes {
yaml '''
spec:
containers:
- name: jnlp
resources:
limits:
cpu: 500m
memory: 1Gi
- name: maven
image: maven:3.8.6-jdk-11
command: ["cat"]
tty: true
'''
}
}
stages {
stage('Build') {
steps {
container('maven') {
sh 'mvn clean package -DskipTests'
}
}
}
stage('Docker Build') {
steps {
script {
docker.build("registry.example.com/jeecg:${env.BUILD_NUMBER}")
}
}
}
stage('Deploy to K8s') {
steps {
sh 'kubectl apply -f k8s/deployment.yaml'
}
}
}
}
8.2 关键优化点
- 使用Kubernetes插件动态创建构建Pod
- 镜像版本采用BUILD_NUMBER保证唯一性
- 部署阶段使用kubectl apply实现声明式更新
9. 运维监控方案
9.1 日志收集
建议采用EFK栈:
bash复制helm install elasticsearch elastic/elasticsearch \
--set replicas=3 \
--set minimumMasterNodes=2
helm install fluent-bit fluent/fluent-bit \
--set backend.type=es \
--set backend.es.host=elasticsearch-client
9.2 性能监控
使用Prometheus-Operator:
bash复制helm install prometheus prometheus-community/kube-prometheus-stack \
--set alertmanager.enabled=false
10. 常见问题排查
10.1 镜像拉取失败
典型错误:
code复制Failed to pull image: rpc error: code = Unknown desc = Error response from daemon: pull access denied
解决方案:
bash复制kubectl create secret docker-registry regcred \
--docker-server=registry.example.com \
--docker-username=admin \
--docker-password=yourpassword
10.2 Jenkins Slave连接问题
错误现象:
code复制Timeout waiting to connect to Jenkins master
检查要点:
- Jenkins URL配置是否正确
- Kubernetes插件中的Jenkins隧道设置
- 网络策略是否允许Pod间通信
11. 生产环境调优建议
11.1 JVM参数优化
在K8s deployment中配置:
yaml复制env:
- name: JAVA_OPTS
value: "-XX:+UseG1GC -Xms2g -Xmx2g -XX:MaxGCPauseMillis=200"
11.2 数据库连接池
推荐配置:
properties复制spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.connection-timeout=30000
12. 安全加固措施
12.1 网络策略
限制JeecgBoot命名空间访问:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: jeecg-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
12.2 RBAC配置
最小权限示例:
yaml复制apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: jeecg
rules:
- apiGroups: [""]
resources: ["pods", "services"]
verbs: ["get", "list"]
这套方案在实际落地时,有几个关键点需要特别注意:
- Rancher升级前务必备份ETCD数据
- Jenkins的JVM内存需要根据任务量调整
- JeecgBoot的静态资源建议使用CDN加速
- 生产环境一定要配置HPA自动扩缩容
我在三个不同规模的企业实施过这个方案,最大的集群运行了超过100个JeecgBoot微服务实例。最深的体会是:初期一定要把监控告警体系搭建完善,等出现问题再排查就太被动了。建议至少配置以下监控项:
- Pod内存使用率(超过80%告警)
- JVM GC时间(超过1秒告警)
- 数据库连接池使用率
- API接口成功率
