基于k3s部署Nginx、MySQL、SpringBoot和Redis的详细教程

1. 安装k3s集群

1.1 单节点快速部署

bash 复制代码
# 使用root或sudo权限执行
curl -sfL https://get.k3s.io | sh -

# 验证安装
sudo kubectl get nodes  # 输出应为Ready状态
sudo systemctl status k3s

1.2 配置kubectl权限(可选)

bash 复制代码
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 创建持久化存储卷

yaml 复制代码
# mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi  # 生产环境建议10Gi以上
bash 复制代码
kubectl apply -f mysql-pvc.yaml

2.2 创建数据库密码Secret

bash 复制代码
kubectl create secret generic mysql-secret \
  --from-literal=root_password=your_secure_password \
  --from-literal=database=springdb

2.3 部署MySQL

yaml 复制代码
# mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:8.0
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: root_password
            - name: MYSQL_DATABASE
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: database
          ports:
            - containerPort: 3306
          volumeMounts:
            - mountPath: /var/lib/mysql
              name: mysql-data
      volumes:
        - name: mysql-data
          persistentVolumeClaim:
            claimName: mysql-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
    - port: 3306
      targetPort: 3306
  type: ClusterIP
bash 复制代码
kubectl apply -f mysql-deployment.yaml

3. 部署Redis缓存

3.1 创建Redis持久化存储

yaml 复制代码
# redis-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: redis-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
bash 复制代码
kubectl apply -f redis-pvc.yaml

3.2 部署Redis

yaml 复制代码
# redis-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
        - name: redis
          image: redis:7.0-alpine
          command: ["redis-server", "--appendonly yes"]  # 启用持久化
          ports:
            - containerPort: 6379
          volumeMounts:
            - mountPath: /data
              name: redis-data
      volumes:
        - name: redis-data
          persistentVolumeClaim:
            claimName: redis-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: redis-service
spec:
  selector:
    app: redis
  ports:
    - port: 6379
      targetPort: 6379
  type: ClusterIP
bash 复制代码
kubectl apply -f redis-deployment.yaml

4. 部署SpringBoot应用

4.1 准备SpringBoot Docker镜像

  1. 示例application.properties

    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
  2. Dockerfile

    dockerfile 复制代码
    FROM maven:3.8.6-jdk-11 AS build
    WORKDIR /app
    COPY . .
    RUN mvn clean package -DskipTests
    
    FROM openjdk:11-jre-slim
    COPY --from=build /app/target/*.jar /app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]
  3. 构建并推送镜像

    bash 复制代码
    docker build -t yourusername/springboot-app:v1 .
    docker push yourusername/springboot-app:v1

4.2 部署SpringBoot到k3s

yaml 复制代码
# springboot-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: springboot
  template:
    metadata:
      labels:
        app: springboot
    spec:
      containers:
        - name: springboot
          image: yourusername/springboot-app:v1
          ports:
            - containerPort: 8080
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: root_password
            - name: MYSQL_DATABASE
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: database
          livenessProbe:
            httpGet:
              path: /actuator/health
              port: 8080
            initialDelaySeconds: 30
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /actuator/health
              port: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: springboot-service
spec:
  selector:
    app: springboot
  ports:
    - port: 8080
      targetPort: 8080
  type: ClusterIP
bash 复制代码
kubectl apply -f springboot-deployment.yaml

5. 部署Nginx反向代理

5.1 创建Nginx配置文件

yaml 复制代码
# 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;
        }
    }
bash 复制代码
kubectl apply -f nginx-config.yaml

5.2 部署Nginx

yaml 复制代码
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:alpine
          ports:
            - containerPort: 80
          volumeMounts:
            - mountPath: /etc/nginx/conf.d
              name: nginx-config
      volumes:
        - name: nginx-config
          configMap:
            name: nginx-config
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
  type: NodePort  # 或LoadBalancer
bash 复制代码
kubectl apply -f nginx-deployment.yaml

6. 验证部署

6.1 检查所有组件状态

bash 复制代码
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应用

bash 复制代码
# 获取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

bash 复制代码
kubectl scale deployment springboot-deployment --replicas=3

7.2 更新应用版本

  1. 修改代码后重新构建镜像:

    bash 复制代码
    docker build -t yourusername/springboot-app:v2 .
    docker push yourusername/springboot-app:v2
  2. 滚动更新:

    bash 复制代码
    kubectl set image deployment/springboot-deployment springboot=yourusername/springboot-app:v2

8. 关键配置说明

组件 核心配置项 作用说明
MySQL persistentVolumeClaim 数据持久化存储
Redis command: ["redis-server", "--appendonly yes"] 启用AOF持久化
SpringBoot livenessProbereadinessProbe 健康检查确保服务可用性
Nginx proxy_pass http://springboot-service 反向代理到Java应用

附:常见问题排查

  1. SpringBoot无法连接MySQL

    • 检查Secret中的密码是否匹配:

      bash 复制代码
      kubectl get secret mysql-secret -o jsonpath='{.data.root_password}' | base64 -d
    • 查看SpringBoot日志:

      bash 复制代码
      kubectl logs -f <springboot-pod>
  2. Nginx返回502错误

    • 确认SpringBoot服务是否就绪:

      bash 复制代码
      kubectl get endpoints springboot-service
  3. 数据持久化失败

    • 检查PVC绑定状态:

      bash 复制代码
      kubectl get pvc
相关推荐
喵个咪1 小时前
初学者入门:用 go-kratos-admin + protoc-gen-typescript-http 快速搭建企业级 Admin 系统
后端·typescript·go
用户21411832636022 小时前
手把手教你用Claude制作专属PPT生成器-从模板学习到自动生成全流程实战
后端
计算机毕设匠心工作室4 小时前
【python大数据毕设实战】全面皮肤病症状数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
摆烂工程师4 小时前
2025年12月最新的 Google AI One Pro 1年会员教育认证通关指南
前端·后端·ai编程
qq_12498707535 小时前
基于SpringBoot+vue的小黄蜂外卖平台(源码+论文+部署+安装)
java·开发语言·vue.js·spring boot·后端·mysql·毕业设计
代码与野兽5 小时前
AI交易,怎么让LLM自己挑选数据源?
前端·javascript·后端
天天摸鱼的java工程师5 小时前
JDK 25 到底更新了什么?这篇全景式解读带你全面掌握
java·后端
非鱼feiyu5 小时前
自关联数据表查询优化实践:以 Django + 递归 CTE 构建树结构为例
数据库·后端·django
零日失眠者5 小时前
这5个Python库一旦掌握就离不开
后端·python
幌才_loong5 小时前
.NET8 × Redis 实战宝典:从配置到落地,搞定高并发缓存就这篇!
后端·.net