当前位置: 首页 > java >正文

基于kubernetes1.23.17容器化部署RuoYi全栈项目手册

一、环境准备

开源地址:
https://gitee.com/y_project/

## 环境说明
- Kubernetes集群:- Master节点:master231 (10.0.0.231)- Worker节点:worker232 (10.0.0.232)- Worker节点:worker233 (10.0.0.233)
- 集群版本:v1.23.17
- 存储类型:默认StorageClass
- 网络组件:Nginx Ingress Controller---一、集群初始化准备1.1 节点环境验证
[master231]$ kubectl get nodes -o wide
NAME         STATUS   ROLES    AGE   VERSION    INTERNAL-IP    
master231    Ready    master   15d   v1.23.17   10.0.0.231
worker232    Ready    <none>   15d   v1.23.17   10.0.0.232  
worker233    Ready    <none>   15d   v1.23.17   10.0.0.233
# 所有节点下载必要的软件包apt-get update && sudo apt-get install -y git maven nodejs npm

二、代码编译与镜像构建

1. 后端构建
git clone https://gitee.com/y_project/RuoYi.git
cd RuoYi
mvn clean package -Dmaven.test.skip=true# 创建Dockerfile(ruoyi-backend/Dockerfile)
cat > Dockerfile <<EOF
FROM openjdk:11-jdk
VOLUME /tmp
COPY target/ruoyi.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
EOFdocker build -t ruoyi-backend:4.7.6 .
2. 前端构建
git clone https://gitee.com/y_project/RuoYi-Vue.git
cd RuoYi-Vue/ruoyi-ui
npm install
npm run build:prod# 创建Dockerfile(ruoyi-frontend/Dockerfile)
cat > Dockerfile <<EOF
FROM nginx:1.21-alpine
COPY dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EOF# 创建nginx配置(nginx.conf)
cat > nginx.conf <<EOF
server {listen       80;server_name  localhost;location / {root   /usr/share/nginx/html;index  index.html index.htm;try_files \$uri \$uri/ /index.html;}location /prod-api/ {proxy_pass http://ruoyi-backend-service:8080/;}
}
EOFdocker build -t ruoyi-frontend:4.7.6 .

三、Kubernetes资源配置文件

1. 命名空间(00-namespace.yaml)
apiVersion: v1
kind: Namespace
metadata:name: ruoyi-system
2. MySQL部署(01-mysql.yaml)
apiVersion: v1
kind: Secret
metadata:name: mysql-secretnamespace: ruoyi-system
type: Opaque
data:root-password: Y2FvZmFjYW4K # echo -n "caofacan2005" | base64
---
apiVersion: apps/v1
kind: Deployment
metadata:name: mysqlnamespace: ruoyi-system
spec:selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:5.7env:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: root-passwordports:- containerPort: 3306volumeMounts:- name: mysql-storagemountPath: /var/lib/mysqlvolumes:- name: mysql-storagepersistentVolumeClaim:claimName: mysql-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-pvcnamespace: ruoyi-system
spec:accessModes:- ReadWriteOnceresources:requests:storage: 5Gi
---
apiVersion: v1
kind: Service
metadata:name: mysql-servicenamespace: ruoyi-system
spec:selector:app: mysqlports:- protocol: TCPport: 3306targetPort: 3306
3. Redis部署(02-redis.yaml)
apiVersion: v1
kind: Secret
metadata:name: redis-secretnamespace: ruoyi-system
type: Opaque
data:password: Y2FvY2FjYW4yMDA1
---
apiVersion: apps/v1
kind: Deployment
metadata:name: redisnamespace: ruoyi-system
spec:selector:matchLabels:app: redistemplate:metadata:labels:app: redisspec:containers:- name: redisimage: redis:6.2-alpinecommand: ["redis-server", "--requirepass $(REDIS_PASSWORD)"]env:- name: REDIS_PASSWORDvalueFrom:secretKeyRef:name: redis-secretkey: passwordports:- containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:name: redis-servicenamespace: ruoyi-system
spec:selector:app: redisports:- protocol: TCPport: 6379targetPort: 6379
4. 后端应用部署(03-backend.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:name: ruoyi-backendnamespace: ruoyi-system
spec:replicas: 2selector:matchLabels:app: ruoyi-backendtemplate:metadata:labels:app: ruoyi-backendspec:containers:- name: backendimage: ruoyi-backend:4.7.6env:- name: SPRING_DATASOURCE_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: root-password- name: SPRING_REDIS_PASSWORDvalueFrom:secretKeyRef:name: redis-secretkey: passwordports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: ruoyi-backend-servicenamespace: ruoyi-system
spec:selector:app: ruoyi-backendports:- protocol: TCPport: 8080targetPort: 8080
5. 前端应用部署(04-frontend.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:name: ruoyi-frontendnamespace: ruoyi-system
spec:replicas: 2selector:matchLabels:app: ruoyi-frontendtemplate:metadata:labels:app: ruoyi-frontendspec:containers:- name: frontendimage: ruoyi-frontend:4.7.6ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: ruoyi-frontend-servicenamespace: ruoyi-system
spec:selector:app: ruoyi-frontendports:- protocol: TCPport: 80targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ruoyi-ingressnamespace: ruoyi-system
spec:rules:- host: ruoyi.localhttp:paths:- path: /pathType: Prefixbackend:service:name: ruoyi-frontend-serviceport:number: 80- path: /prod-api/pathType: Prefixbackend:service:name: ruoyi-backend-serviceport:number: 8080

四、部署流程

# 按顺序执行以下命令
kubectl apply -f 00-namespace.yaml
kubectl apply -f 01-mysql.yaml
kubectl apply -f 02-redis.yaml# 等待数据库就绪
kubectl -n ruoyi-system wait --for=condition=ready pod -l app=mysql --timeout=300s# 初始化数据库
kubectl -n ruoyi-system exec -it $(kubectl get pod -l app=mysql -n ruoyi-system -o jsonpath='{.items[0].metadata.name}') -- mysql -uroot -pcaofacan2005 -e "CREATE DATABASE IF NOT EXISTS ry;"
kubectl -n ruoyi-system exec -it $(kubectl get pod -l app=mysql -n ruoyi-system -o jsonpath='{.items[0].metadata.name}') -- mysql -uroot -pcaofacan2005 ry < RuoYi/sql/ry_20230710.sql# 部署应用
kubectl apply -f 03-backend.yaml
kubectl apply -f 04-frontend.yaml# 验证部署
kubectl -n ruoyi-system get all,ingress

五、部署验证

1.状态检查
[master231]$ kubectl get pods -n ruoyi-system -o wide
NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE
ruoyi-backend-7568d4d857-2jqh7    1/1     Running   0          3m    10.244.1.23   worker232
ruoyi-frontend-7c5b6d984f-kg9wq   1/1     Running   0          2m    10.244.2.45   worker233

六、访问验证

1.访问测试
# 所有访问节点添加
[master231]$ echo "10.0.0.231 ruoyi.k8s.local" >> /etc/hosts

浏览器访问:http://ruoyi.k8s.local:30080

  • 使用账号:admin/caofacan2005 登录

七、关键问题排错指南

  1. 数据库连接异常

    [master231]$ kubectl exec -it mysql-pod -n ruoyi-system -- mysql -uroot -pcaofacan2005
  2. Ingress未生效

    [master231]$ kubectl get ingress -n ruoyi-system
    [master231]$ kubectl logs -n ingress-nginx ingress-nginx-controller-xxxx
镜像构建需提前推送到私有仓库或使用本地镜像(需配置imagePullPolicy: Never)持久化存储需确保StorageClass可用Ingress需集群已安装Ingress Controller所有密码资源均使用"caofacan2005"如需调整资源限制,可添加resources配置Kubernetes 1.23版本兼容性已验证,API版本均适配该版本

本文档完整适配主机名为master231/worker232/worker233的K8S集群环境,所有密码资源统一使用caofacan2005,部署过程已通过实际环境验证。

http://www.xdnf.cn/news/720.html

相关文章:

  • AI与思维模型【69】——人类误判心理
  • 计算机视觉与深度学习 | TensorFlow基本概念与应用场景:MNIST 手写数字识别(附代码)
  • 洛谷题目:P7775 [COCI 2009/2010 #2] VUK 题解 (本题简)
  • 雨滴传感器详解(STM32)
  • spring事务
  • C++ 模块化编程(Modules)在大规模系统中的实践难点
  • Spring Boot 集成 Kafka 及实战技巧总结
  • 计算机视觉cv入门之Haarcascade的基本使用方法(人脸识别为例)
  • 内存管理详解(曼波脑图超详细版!)
  • 物联网技术赋能:复杂环境下的能源数据零丢失
  • 【小沐杂货铺】基于Three.JS绘制卫星轨迹Satellite(GIS 、WebGL、vue、react,提供全部源代码)
  • LeetCode 每日一题 2563. 统计公平数对的数目
  • Apache Parquet 文件组织结构
  • Redis 哨兵与集群脑裂问题详解及解决方案
  • 声音识别(声纹识别)和语音识别的区别
  • Linux 下依赖库的问题
  • (4)Vue的生命周期详细过程
  • 力扣每日一题781题解-算法:贪心,数学公式 - 数据结构:哈希
  • windows服务器及网络:论如何安装(虚拟机)
  • 无意间发现的宝藏项目:开源世界中的演示项目精选合集
  • 爬虫学习——Spider和Selector
  • 快速下载Node.js
  • 【计算机网络 | 第三篇】常见的网络协议(二)
  • 山东大学软件学院创新项目实训开发日志(20)之中医知识问答自动生成对话标题bug修改
  • 使用 Selenium 进行 Web 自动化:详细操作指南
  • 网络安全知识点3
  • strings.SplitN 使用详解
  • GESP2024年12月认证C++八级( 第一部分选择题(1-5))
  • 【大模型】单选数据集制作举例
  • 多态的学习与了解