基于k3s部署Nginx、MySQL、SpringBoot和Redis的详细教程
1. 安装k3s集群
1.1 单节点快速部署
# 使用root或sudo权限执行
curl -sfL https://get.k3s.io | sh -# 验证安装
sudo kubectl get nodes # 输出应为Ready状态
sudo systemctl status k3s
1.2 配置kubectl权限(可选)
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER ~/.kube/config
export KUBECONFIG=~/.kube/config
2. 部署MySQL数据库
2.1 创建持久化存储卷
# mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 5Gi # 生产环境建议10Gi以上
kubectl apply -f mysql-pvc.yaml
2.2 创建数据库密码Secret
kubectl create secret generic mysql-secret \--from-literal=root_password=your_secure_password \--from-literal=database=springdb
2.3 部署MySQL
# mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: mysql-deployment
spec:replicas: 1selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:8.0env:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: root_password- name: MYSQL_DATABASEvalueFrom:secretKeyRef:name: mysql-secretkey: databaseports:- containerPort: 3306volumeMounts:- mountPath: /var/lib/mysqlname: mysql-datavolumes:- name: mysql-datapersistentVolumeClaim:claimName: mysql-pvc
---
apiVersion: v1
kind: Service
metadata:name: mysql-service
spec:selector:app: mysqlports:- port: 3306targetPort: 3306type: ClusterIP
kubectl apply -f mysql-deployment.yaml
3. 部署Redis缓存
3.1 创建Redis持久化存储
# redis-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: redis-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 2Gi
kubectl apply -f redis-pvc.yaml
3.2 部署Redis
# redis-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: redis-deployment
spec:replicas: 1selector:matchLabels:app: redistemplate:metadata:labels:app: redisspec:containers:- name: redisimage: redis:7.0-alpinecommand: ["redis-server", "--appendonly yes"] # 启用持久化ports:- containerPort: 6379volumeMounts:- mountPath: /dataname: redis-datavolumes:- name: redis-datapersistentVolumeClaim:claimName: redis-pvc
---
apiVersion: v1
kind: Service
metadata:name: redis-service
spec:selector:app: redisports:- port: 6379targetPort: 6379type: ClusterIP
kubectl apply -f redis-deployment.yaml
4. 部署SpringBoot应用
4.1 准备SpringBoot Docker镜像
-
示例
application.properties:spring.datasource.url=jdbc:mysql://mysql-service:3306/${MYSQL_DATABASE} spring.datasource.username=root spring.datasource.password=${MYSQL_ROOT_PASSWORD} spring.redis.host=redis-service spring.redis.port=6379 -
Dockerfile:
FROM maven:3.8.6-jdk-11 AS build WORKDIR /app COPY . . RUN mvn clean package -DskipTestsFROM openjdk:11-jre-slim COPY --from=build /app/target/*.jar /app.jar ENTRYPOINT ["java","-jar","/app.jar"] -
构建并推送镜像:
docker build -t yourusername/springboot-app:v1 . docker push yourusername/springboot-app:v1
4.2 部署SpringBoot到k3s
# springboot-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: springboot-deployment
spec:replicas: 2selector:matchLabels:app: springboottemplate:metadata:labels:app: springbootspec:containers:- name: springbootimage: yourusername/springboot-app:v1ports:- containerPort: 8080env:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: root_password- name: MYSQL_DATABASEvalueFrom:secretKeyRef:name: mysql-secretkey: databaselivenessProbe:httpGet:path: /actuator/healthport: 8080initialDelaySeconds: 30periodSeconds: 10readinessProbe:httpGet:path: /actuator/healthport: 8080
---
apiVersion: v1
kind: Service
metadata:name: springboot-service
spec:selector:app: springbootports:- port: 8080targetPort: 8080type: ClusterIP
kubectl apply -f springboot-deployment.yaml
5. 部署Nginx反向代理
5.1 创建Nginx配置文件
# nginx-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: nginx-config
data:default.conf: |server {listen 80;server_name localhost;location / {proxy_pass http://springboot-service:8080;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
kubectl apply -f nginx-config.yaml
5.2 部署Nginx
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:alpineports:- containerPort: 80volumeMounts:- mountPath: /etc/nginx/conf.dname: nginx-configvolumes:- name: nginx-configconfigMap:name: nginx-config
---
apiVersion: v1
kind: Service
metadata:name: nginx-service
spec:selector:app: nginxports:- port: 80targetPort: 80type: NodePort # 或LoadBalancer
kubectl apply -f nginx-deployment.yaml
6. 验证部署
6.1 检查所有组件状态
kubectl get pods,svc,pvc
# 输出示例:
# NAME READY STATUS RESTARTS AGE
# pod/mysql-deployment-7c6d8f8b4d-abcde 1/1 Running 0 5m
# pod/redis-deployment-7d5f8d4b5f-fghij 1/1 Running 0 4m
# pod/springboot-deployment-6d5f8d4b5f-klmno 2/2 Running 0 3m
# pod/nginx-deployment-7c6d8f8b4d-pqrst 1/1 Running 0 2m
6.2 访问SpringBoot应用
# 获取NodePort
NODE_PORT=$(kubectl get svc nginx-service -o jsonpath='{.spec.ports[0].nodePort}')
curl http://<节点IP>:$NODE_PORT
# 预期输出:SpringBoot应用的响应(如"Hello World")
7. 扩展与维护
7.1 横向扩展SpringBoot
kubectl scale deployment springboot-deployment --replicas=3
7.2 更新应用版本
-
修改代码后重新构建镜像:
docker build -t yourusername/springboot-app:v2 . docker push yourusername/springboot-app:v2 -
滚动更新:
kubectl set image deployment/springboot-deployment springboot=yourusername/springboot-app:v2
8. 关键配置说明
| 组件 | 核心配置项 | 作用说明 |
|---|---|---|
| MySQL | persistentVolumeClaim | 数据持久化存储 |
| Redis | command: ["redis-server", "--appendonly yes"] | 启用AOF持久化 |
| SpringBoot | livenessProbe 和 readinessProbe | 健康检查确保服务可用性 |
| Nginx | proxy_pass http://springboot-service | 反向代理到Java应用 |
附:常见问题排查
-
SpringBoot无法连接MySQL
-
检查Secret中的密码是否匹配:
kubectl get secret mysql-secret -o jsonpath='{.data.root_password}' | base64 -d -
查看SpringBoot日志:
kubectl logs -f <springboot-pod>
-
-
Nginx返回502错误
-
确认SpringBoot服务是否就绪:
kubectl get endpoints springboot-service
-
-
数据持久化失败
-
检查PVC绑定状态:
kubectl get pvc
-
相关文章:
基于k3s部署Nginx、MySQL、SpringBoot和Redis的详细教程
1. 安装k3s集群 1.1 单节点快速部署 # 使用root或sudo权限执行 curl -sfL https://get.k3s.io | sh -# 验证安装 sudo kubectl get nodes # 输出应为Ready状态 sudo systemctl status k3s1.2 配置kubectl权限(可选) mkdir -p ~/.kube sudo cp /etc/r…...
SQL Server数据库简介及应用
SQL Server以高性能、高可用性著称,支持Windows/Linux跨平台部署,满足混合云需求。其内存优化表、列存储索引加速数据处理,AlwaysOn可用性组保障业务连续性。安全体系集成身份验证与加密,符合企业合规要求。与Azure无缝集成&#…...
麒麟V10 arm cpu aarch64 下编译 RocketMQ-Client-CPP 2.2.0
国产自主可控服务器需要访问RocketMQ消息队列,最新的CSDK是2020年发布的 rocketmq-client-cpp-2.2.0 这个版本支持TLS模式。 用默认的版本安装遇到一些问题,记录一下。 下载Releases apache/rocketmq-client-cpp GitHubhttps://github.com/apache/roc…...
【商城实战(49)】解锁小程序端适配与优化,让商城飞起来
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
使用码云搭建CocoaPods远程私有库
一、创建远程私有索引库 用来存放私有框架的详细描述信息.podspec文件 1. 创建私有库 假设码云上创建的私有库为repo-spec 2. 查看本地已存在的索引库 pod repo list 3. 将远程私有索引库添加到本地 pod repo add [https://gitee.com/jingluoguo/repo-spec.git](https://gi…...
深度学习有哪些算法?
深度学习包含多种算法和模型,广泛应用于图像处理、自然语言处理、语音识别等领域。以下是主要分类及代表性算法: 一、基础神经网络 多层感知机(MLP) 最简单的深度学习模型,由多个全连接层组成,用于分类和回…...
专访LayaAir引擎最有价值专家-施杨
在 LayaAir 引擎的资源商店中,许多开发者都会注意到一个熟悉的名字——“射手座”。他不仅贡献了大量高质量的 Shader 资源,让一些开发者通过他的作品了解到 LayaAir 引擎在 3D 视觉效果上的更多可能,也让大家能够以低成本直接学习并应用这些…...
AJAX的理解和原理还有概念
你想问的可能是 AJAX(Asynchronous JavaScript and XML) ,它并不是一门新的编程语言,而是一种在无需重新加载整个网页的情况下,能够与服务器进行异步通信并更新部分网页的技术。以下从基本概念、原理、优点、使用场景等…...
自然语言处理:文本聚类
介绍 大家好,博主又来和大家分享自然语言处理领域的知识了。今天给大家分享的内容是自然语言处理中的文本聚类。 文本聚类在自然语言处理领域占据着重要地位,它能将大量无序的文本按照内容的相似性自动划分成不同的类别,极大地提高了文本处…...
RabbitMQ 集群降配
这里写自定义目录标题 摘要检查状态1. 检查 RabbitMQ 服务状态2. 检查 RabbitMQ 端口监听3. 检查 RabbitMQ 管理插件是否启用4. 检查开机自启状态5. 确认集群高可用性6. 检查使用该集群的服务是否做了断开重连 实操1. 负载均衡配置2. 逐个节点降配(滚动操作…...
uniapp工程中解析markdown文件
在uniapp中如何导入markdown文件,同时在页面中解析成html,请参考以下配置: 1. 安装以下3个依赖包 npm install marked highlight.js vite-plugin-markdown 2. 创建vite.config.js配置文件 // vite.config.js import { defineConfig } fro…...
数据结构:二叉树(一)·(重点)
前言 什么树?what? 树的概念与结构 概念: 树是⼀种⾮线性的数据结构,它是由 n ( n>0 ) 个有限结点组成⼀个具有层次关系的集合。 结构: 有⼀个特殊的结点,称为根结点&#…...
DevEco Studio的使用
目录 1.创建ArkTS工程 2.ArkTS工程目录结构(Stage模型) 构建第一个页面 构建第二个页面 实现页面间的跳转 1.创建ArkTS工程 若首次打开DevEco Studio,请点击Create Project创建工程。如果已经打开了一个工程,请在菜单栏选择…...
十七、实战开发 uni-app x 项目(仿京东)- 后端指南
前面我们已经用uniappx进行了前端实战学习 一、实战 开发uni-app x项目(仿京东)-规划-CSDN博客 二、实战 开发uni-app x项目(仿京东)-项目搭建-CSDN博客 三、实战开发 uni-app x 项目(仿京东)- 技术选型-CSDN博客 四、实战开发 uni-app x 项目(仿京东)- 页面设计-C…...
数据开发岗笔试题>>sql(hive) ,excel [2025]
sql SELECT user_id, AVG(loan_amount) AS avg_loan_amount FROM loan GROUP BY user_id HAVING AVG(loan_amount) > 20000; 授信表:credit 字段包含user_id(用户id),credit_id(授信id),credit_time(授信时间yyyy-MM-dd HH:mm:ss)&#x…...
内存模型以及分区,需要详细到每个区放什么。
1. 内存模型以及分区,需要详细到每个区放什么。 JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面, class 类信息常量池(static 常量和 static 变量)等放在方法区new: …...
python strip/rstrip/lstrip详细讲解(涵盖许多例子、作用以及复杂行为处理)
python strip/rstrip/lstrip详细讲解: 在Python中,strip、lstrip、rstrip 是用于字符串处理的常用方法,主要功能是去除字符串首尾的指定字符。它们的区别如下: 1. strip([chars]) 作用 :删除字符串开头和结尾 处所有属于 chars 的字符,直到遇到不属于 chars 的字符为止…...
Spring Boot集成PageHelper:轻松实现数据库分页功能
Spring Boot集成PageHelper:轻松实现数据库分页功能 1. 为什么需要分页? 分页是处理大数据量查询的核心技术,其重要性体现在: 性能优化:避免单次查询返回过多数据导致内存溢出或响应延迟。用户体验:前端展…...
OpenGL ES 入门指南:从基础到实战
引言:为什么需要 OpenGL ES? 在当今的嵌入式设备(如智能手机、汽车仪表盘、智能家居中控屏)中,流畅的图形渲染能力是用户体验的核心。OpenGL ES(OpenGL for Embedded Systems) 作为行业标准&am…...
docker安装milvus向量数据库Attu可视化界面
Docker 部署 Milvus 及 Attu 可视化工具完整指南 一、环境准备 安装 Docker 及 Docker Compose Docker 版本需 ≥20.10.12Docker Compose 版本需 ≥2.20.0(推荐 V2) 验证 Docker 环境 docker --version && docker-compose --version若出现&…...
Elasticsearch 索引
一、简介 在 Elasticsearch 中,索引(Index)是存储相关文档的地方,类似于关系数据库中的数据库。索引是 Elasticsearch 中最重要的概念之一,用于组织和存储数据。 二、索引的基本概念 索引(Index…...
ArcGIS10. 8简介与安装,附下载地址
目录 ArcGIS10.8 1. 概述 2. 组成与功能 3. 10.8 特性 下载链接 安装步骤 1. 安装准备 2. 具体步骤 3.补丁 其他版本安装 ArcGIS10.8 1. 概述 ArcGIS 10.8 是由美国 Esri 公司精心研发的一款功能强大的地理信息系统(GIS)平台。其核心功能在于…...
Idea中使用Git插件_合并当前分支到master分支_冲突解决_很简单---Git工作笔记005
由于之前用svn习惯了,用的git少,其实在idea中使用git,解决冲突,合并分支,非常的简单,一起来看一下吧. 一定要注意操作之前,一定要确保自己的分支代码,都已经commit提交了,并且push到远程了. 不要丢东西. 可以看到首先,在idea的左下角有个 git,点开以后 可以看到有显示的分支…...
Docker简易使用说明
Docker使用说明 文章目录 Docker使用说明一. 安装二. 测试三. 镜像加速 一. 安装 安装其实没什么可说的,但凡有显示界面的OS,如windows/Mac,直接上官方网站下载安装即可 二. 测试 若安装好docker后,应当先检测docker的网络通信…...
【Linux】应用层自定义协议 + 序列化和反序列化
应用层自定义协议 序列化和反序列化 一.应用层1.再谈 "协议"2.序列化 和 反序列化 二. Jsoncpp1.序列化2.反序列化 三. Tcp全双工 面向字节流四.自定义协议 保证报文的完整性1.Makefile2.Mutex.hpp3.Cond.hpp4.Log.hpp5.Thread.hpp6.ThreadPool.hpp7.Common.hpp8.…...
Matlab 雷达导引头伺服系统的建模与仿真研究
1、内容简介 Matlab 177-雷达导引头伺服系统的建模与仿真研究 可以交流、咨询、答疑 2、内容说明 略[摘 要]基于 Malah/Simuink 雷达导引|头同服系统的建模与仿真,首先对雷达导引头同服系统按照预定回路和跟踪回路的步骤分别进行建模以及相关控制参数计算,接着构建…...
华为ipd流程华为流程体系管理华为数字化转型流程数字化管理解决方案介绍81页精品PPT
华为流程体系最佳实践主要包括构建完善的流程框架,明确各层级流程要素与职责,梳理涵盖研发、采购、营销、服务、资产管理等多领域的流程,通过梳理业务场景和核心能力搭建差异化流程框架,采用自上而下与自下而上相结合的建模方法&a…...
深入理解 HTML 中的统一资源定位器(URL)
一、引言 在互联网的世界中,我们每天都在与各种网页打交道。而网页能够被准确地访问和获取,离不开一个关键的元素 —— 统一资源定位器(Uniform Resource Locators,简称 URL)。它就像是网络世界中的地址,指…...
网络流基本概念及实现算法
基本概念 流网络 对于一个有向图, 抽象成水管里的水的模型, 每根管子有容量限制, 计为 G ( V , E ) G (V, E) G(V,E), 首先不考虑反向边 对于任意无向图, 都可以将反向边转化为上述形式 如果一条边不存在, 定义为容量为 0 0 0, 形式上来说就是 c ( u , v ) 0 c(u, v) 0 c(…...
Qt程序增加Dump文件保存
qt程序出现程序闪退,对这些未能捕获的异常,存储未Dump文件方便我们定位哪块代码出的问题。利用Window API 的相关接口,具体如下 #include <QCoreApplication> #include <windows.h> #include <DbgHelp.h> #include <QD…...
