基于Kubernetes的RuoYi前后端分离项目实战部署指南

发布时间:2026/7/31 7:06:09

基于Kubernetes的RuoYi前后端分离项目实战部署指南 1. 环境准备与Kubernetes集群搭建在开始部署RuoYi前后端分离项目之前我们需要先搭建好Kubernetes集群环境。这里我推荐使用kubeadm工具来快速部署一个生产可用的Kubernetes集群。下面是我在实际项目中验证过的详细步骤首先我们需要准备三台虚拟机配置如下node80192.168.10.80作为控制平面节点node81192.168.10.81工作节点node82192.168.10.82工作节点node84192.168.10.84私有镜像仓库节点在所有节点上执行以下基础配置# 加载必要的内核模块 printf overlay\nbr_netfilter\n /etc/modules-load.d/containerd.conf modprobe overlay modprobe br_netfilter # 配置网络参数 printf net.bridge.bridge-nf-call-iptables 1\nnet.ipv4.ip_forward 1\nnet.bridge.bridge-nf-call-ip6tables 1\n /etc/sysctl.d/99-kubernetes-cri.conf sysctl --system接下来安装containerd容器运行时wget https://github.com/containerd/containerd/releases/download/v1.7.13/containerd-1.7.13-linux-amd64.tar.gz -P /opt/software/ tar Cxzvf /usr/local /opt/software/containerd-1.7.13-linux-amd64.tar.gz wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -P /etc/systemd/system/ systemctl daemon-reload systemctl enable --now containerd安装完基础组件后我们需要配置Kubernetes的apt源并安装kubeadm、kubelet和kubectlapt-get update apt-get install -y apt-transport-https ca-certificates curl gpg mkdir -p -m 755 /etc/apt/keyrings curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-ring.gpg echo deb [signed-by/etc/apt/keyrings/kubernetes-apt-ring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ / | sudo tee /etc/apt/sources.list.d/kubernetes.list apt-get update apt-get install -y kubelet1.29.1-1.1 kubeadm1.29.1-1.1 kubectl1.29.1-1.1 apt-mark hold kubelet kubeadm kubectl在控制平面节点(node80)上初始化集群kubeadm init --pod-network-cidr 10.10.0.0/16 --kubernetes-version 1.29.1 --node-name node80 export KUBECONFIG/etc/kubernetes/admin.conf安装Calico网络插件kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/tigera-operator.yaml wget https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/custom-resources.yaml # 修改custom-resources.yaml中的CIDR为10.10.0.0/16 kubectl apply -f custom-resources.yaml最后将工作节点加入集群kubeadm join 192.168.10.80:6443 --token token --discovery-token-ca-cert-hash hash2. 私有镜像仓库搭建与配置在企业级部署中我们通常需要搭建私有镜像仓库来存储自定义镜像。这里我们使用Docker Registry v2来搭建私有仓库并配置可视化界面方便管理。在node84节点上执行以下操作首先安装必要的工具并创建认证文件sudo apt-get update sudo apt-get install apache2-utils mkdir -p /docker/volume/registry/auth/ htpasswd -Bc /docker/volume/registry/auth/htpasswd root # 输入密码123456创建Registry的配置文件version: 0.1 log: level: debug fields: service: registry environment: production storage: filesystem: rootdirectory: /var/lib/registry http: addr: :5000 headers: Access-Control-Allow-Origin: [http://node84:8080,http://192.168.10.84] Access-Control-Allow-Methods: [HEAD, GET, OPTIONS, DELETE, POST, PUT] Access-Control-Allow-Headers: [Authorization,Accept] http2: disabled: false auth: htpasswd: realm: basic-realm path: /auth/htpasswd启动Registry容器docker run -d \ --name registry \ --network registry-net \ -v /docker/volume/registry/auth:/auth \ -v /docker/volume/registry/data:/var/lib/registry \ -v /docker/volume/registry/conf/config.yml:/etc/docker/registry/config.yml \ -e REGISTRY_AUTHhtpasswd \ -e REGISTRY_AUTH_HTPASSWD_REALMRegistry Realm \ -e REGISTRY_AUTH_HTPASSWD_PATH/auth/htpasswd \ -e REGISTRY_HTTP_SECRETsecretkey \ -p 5000:5000 \ registry:2为了方便管理镜像我们安装Registry UIdocker run -d \ --name registry-browser \ --network registry-net \ -e REGISTRY_TITLEDocker Registry Browser \ -e NGINX_PROXY_PASS_URLhttp://registry:5000 \ -e REGISTRY_AUTHtrue \ -e REGISTRY_AUTH_USERroot \ -e REGISTRY_AUTH_PASSWORD123456 \ -p 8080:80 \ joxit/docker-registry-ui:latest在所有Kubernetes节点上配置containerd以信任私有仓库mkdir -p /etc/containerd/certs.d/node84:5000 tee /etc/containerd/certs.d/node84:5000/hosts.toml EOF server http://node84:5000 [host.http://node84:5000] capabilities [pull, resolve, push] skip_verify true EOF systemctl restart containerd.service3. RuoYi后端服务部署实战RuoYi后端采用Spring Boot框架开发我们需要先将其打包为Docker镜像并推送到私有仓库。3.1 后端镜像构建创建DockerfileFROM openjdk:8-jdk-alpine RUN mkdir -p /opt/project/ruoyi/ruoyi-backend/upload-file-path RUN mkdir -p /opt/project/ruoyi/ruoyi-backend/logs RUN mkdir -p /etc/apk/ RUN touch /etc/apk/repositories RUN echo -e https://mirrors.aliyun.com/alpine/v3.6/main/\nhttps://mirrors.aliyun.com/alpine/v3.6/community/ /etc/apk/repositories RUN set -xe apk --no-cache add ttf-dejavu fontconfig WORKDIR /opt/project/ruoyi/ruoyi-backend COPY ./ruoyi-admin/target/ruoyi-admin.jar ruoyi-admin.jar EXPOSE 8080 CMD [nohup,java,-jar,/opt/project/ruoyi/ruoyi-backend/ruoyi-admin.jar, , /opt/project/ruoyi/ruoyi-backend/logs/nohup.log, ]构建并推送镜像docker build -t ruoyi-backend:1.0 . docker tag ruoyi-backend:1.0 node84:5000/ruoyi-backend:1.0 docker login -u root -p 123456 node84:5000 docker push node84:5000/ruoyi-backend:1.03.2 Kubernetes资源配置准备我们需要为后端服务准备以下Kubernetes资源创建数据库初始化ConfigMapmkdir -p /opt/ruoyi/sql # 将ruoyi的SQL文件放入/opt/ruoyi/sql目录 kubectl create configmap ruoyi-init-sql-config-map --from-file/opt/ruoyi/sql创建应用配置ConfigMap# application-k8s.yaml spring: redis: host: ruoyi-redis-service port: 6379 password: 123456 datasource: druid: master: url: jdbc:mysql://ruoyi-mysql-service:3306/ry-vue?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLfalseserverTimezoneGMT%2B8 username: root password: 123456kubectl create configmap ruoyi-admin-config --from-file/opt/ruoyi/application-k8s.yaml创建Redis配置ConfigMapkubectl create configmap ruoyi-redis-config-map --from-file/opt/ruoyi/redis.conf创建镜像拉取Secretkubectl create secret docker-registry registry-user-pwd-secret \ --docker-serverhttp://node84:5000 \ --docker-usernameroot \ --docker-password1234563.3 部署后端服务创建后端部署文件ruoyi-k8s-backend.yamlapiVersion: apps/v1 kind: Deployment metadata: name: database spec: selector: matchLabels: app: database template: metadata: labels: app: database spec: containers: - name: database image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD value: 123456 - name: MYSQL_DATABASE value: ry-vue volumeMounts: - mountPath: /docker-entrypoint-initdb.d name: ruoyi-init-sql ports: - containerPort: 3306 volumes: - name: ruoyi-init-sql configMap: name: ruoyi-init-sql-config-map imagePullSecrets: - name: registry-user-pwd-secret --- apiVersion: v1 kind: Service metadata: name: ruoyi-mysql-service spec: selector: app: database ports: - port: 3306 targetPort: 3306 --- apiVersion: apps/v1 kind: Deployment metadata: name: redis spec: selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis:7.2.0 ports: - containerPort: 6379 volumeMounts: - mountPath: /usr/local/etc/redis/redis.conf name: ruoyi-redis-config subPath: redis.conf volumes: - name: ruoyi-redis-config configMap: name: ruoyi-redis-config-map imagePullSecrets: - name: registry-user-pwd-secret --- apiVersion: v1 kind: Service metadata: name: ruoyi-redis-service spec: selector: app: redis ports: - port: 6379 targetPort: 6379 --- apiVersion: apps/v1 kind: Deployment metadata: name: ruoyi-java spec: replicas: 2 selector: matchLabels: app: ruoyi-java template: metadata: labels: app: ruoyi-java spec: initContainers: - name: wait-for-mysql image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD value: 123456 command: [sh, -c, until mysqladmin ping -h ruoyi-mysql-service -uroot -p$MYSQL_ROOT_PASSWORD --silent; do echo waiting for mysql; sleep 5; done] - name: wait-for-redis image: redis:7.2.0 env: - name: REDIS_PASSWORD value: 123456 command: [sh, -c, until redis-cli -h ruoyi-redis-service -a $REDIS_PASSWORD ping | grep PONG; do echo waiting for redis; sleep 5; done] containers: - name: ruoyi-java image: node84:5000/ruoyi-backend:1.0 ports: - containerPort: 8080 volumeMounts: - mountPath: /opt/project/ruoyi/ruoyi-backend/config name: config args: [java, -jar, ruoyi-admin.jar, --spring.profiles.activek8s] volumes: - name: config configMap: name: ruoyi-admin-config imagePullSecrets: - name: registry-user-pwd-secret --- apiVersion: v1 kind: Service metadata: name: ruoyi-backend-service spec: selector: app: ruoyi-java ports: - port: 8080 targetPort: 8080部署后端服务kubectl apply -f ruoyi-k8s-backend.yaml4. RuoYi前端服务部署实战RuoYi前端采用Vue.js开发我们需要将其打包并部署到Nginx中。4.1 前端镜像构建创建DockerfileFROM nginx:1.12.2 COPY nginx.conf /etc/nginx/nginx.conf RUN mkdir -p /opt/project/ruoyi/ruoyi-front-code COPY dist /opt/project/ruoyi/ruoyi-front-code EXPOSE 80 CMD [nginx, -g, daemon off;]构建并推送镜像docker build -t ruoyi-frontend:1.0 . docker tag ruoyi-frontend:1.0 node84:5000/ruoyi-frontend:1.0 docker login -u root -p 123456 node84:5000 docker push node84:5000/ruoyi-frontend:1.04.2 前端Nginx配置创建Nginx配置文件nginx.confserver { listen 80; server_name localhost; charset utf-8; location / { root /opt/project/ruoyi/ruoyi-front-code; try_files $uri $uri/ /index.html; index index.html index.htm; } location /prod-api/ { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://ruoyi-backend-service.default:8080/; } error_page 500 502 503 504 /50x.html; location /50x.html { root html; } }创建ConfigMapkubectl create configmap ruoyi-ui-config --from-file/opt/ruoyi/nginx.conf4.3 部署前端服务创建前端部署文件ruoyi-k8s-fronted.yamlapiVersion: apps/v1 kind: Deployment metadata: name: ruoyi-nginx spec: replicas: 1 selector: matchLabels: app: ruoyi-nginx template: metadata: labels: app: ruoyi-nginx spec: initContainers: - name: wait-for-ruoyi-backend-service image: alpine command: [sh, -c, until wget -q -O- http://ruoyi-backend-service:8080; do echo waiting for backend; sleep 5; done] containers: - name: ruoyi-nginx image: node84:5000/ruoyi-frontend:1.0 ports: - containerPort: 80 volumeMounts: - mountPath: /etc/nginx/conf.d name: config volumes: - name: config configMap: name: ruoyi-ui-config items: - key: nginx.conf path: default.conf imagePullSecrets: - name: registry-user-pwd-secret --- apiVersion: v1 kind: Service metadata: name: ruoyi-fronted-service spec: type: NodePort selector: app: ruoyi-nginx ports: - port: 80 targetPort: 80 nodePort: 30000部署前端服务kubectl apply -f ruoyi-k8s-fronted.yaml部署完成后可以通过任意Kubernetes节点的30000端口访问RuoYi前端界面。

相关新闻