You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单个Kubernetes Pod中部署Spring Boot应用与MySQL

嘿,我来给你说说怎么把Spring Boot应用和MySQL部署到同一个Kubernetes Pod里——不过先得提一句,这种做法其实并不符合Kubernetes的最佳实践,因为K8s的设计初衷是一个Pod运行一组紧密耦合的进程,而数据库这类组件单独部署更利于扩容、备份和故障隔离。但如果你确实有特殊场景需要这么做,下面是具体的实现步骤:

实现步骤

1. 编写Pod的YAML配置文件

同一个Kubernetes Pod可以包含多个容器,我们只需要在Pod的spec.containers数组中同时定义Spring Boot应用容器和MySQL容器即可。另外要注意:

  • 同一个Pod内的容器共享网络命名空间,所以Spring Boot可以直接用localhost访问MySQL
  • 需要为MySQL配置存储卷,避免Pod重启后数据丢失
  • 保持两个容器的数据库相关环境变量一致(比如密码、数据库名)

以下是完整的示例配置:

apiVersion: v1
kind: Pod
metadata:
  name: spring-mysql-pod
  labels:
    app: spring-mysql
spec:
  containers:
    # Spring Boot 应用容器
    - name: spring-boot-app
      image: your-spring-boot-image:latest  # 替换成你的Spring Boot镜像地址
      ports:
        - containerPort: 8080
      env:
        - name: DB_HOST
          value: localhost  # 同Pod内直接用localhost访问MySQL
        - name: DB_PORT
          value: "3306"
        - name: DB_USERNAME
          value: root
        - name: DB_PASSWORD
          value: your-db-password  # 替换为你的MySQL密码
        - name: DB_NAME
          value: your-target-db  # 替换为你的目标数据库名
      resources:
        requests:
          memory: "512Mi"
          cpu: "500m"
        limits:
          memory: "1Gi"
          cpu: "1"
    # MySQL 数据库容器
    - name: mysql
      image: mysql:8.0
      ports:
        - containerPort: 3306
      env:
        - name: MYSQL_ROOT_PASSWORD
          value: your-db-password  # 和Spring Boot配置的密码保持一致
        - name: MYSQL_DATABASE
          value: your-target-db  # 和Spring Boot配置的数据库名保持一致
      volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql  # MySQL默认数据存储路径
      resources:
        requests:
          memory: "512Mi"
          cpu: "500m"
        limits:
          memory: "1Gi"
          cpu: "1"
  # 定义存储卷,用于MySQL数据持久化
  volumes:
    - name: mysql-storage
      emptyDir: {}  # 临时存储,Pod重启会丢失数据;生产环境请替换为PersistentVolumeClaim

如果需要持久化MySQL数据,把emptyDir替换为已创建好的PersistentVolumeClaim:

volumes:
  - name: mysql-storage
    persistentVolumeClaim:
      claimName: mysql-pvc  # 替换为你的PVC名称

2. 部署Pod到Kubernetes

将上述配置保存为spring-mysql-pod.yaml,然后执行部署命令:

kubectl apply -f spring-mysql-pod.yaml

3. 验证部署结果

  • 查看Pod状态,确认两个容器都正常运行:
kubectl get pods spring-mysql-pod
  • 查看Spring Boot应用的日志,确认数据库连接正常:
kubectl logs spring-mysql-pod -c spring-boot-app
  • 进入MySQL容器,验证数据库是否正常初始化:
kubectl exec -it spring-mysql-pod -c mysql -- mysql -uroot -pyour-db-password
重要注意事项
  • 生产环境强烈不推荐:同一个Pod内的容器共享资源和生命周期,一旦其中一个容器故障,整个Pod会重启,导致应用和数据库同时不可用;而且无法单独扩容数据库或应用,违背了K8s的弹性设计理念。
  • 资源隔离:一定要给每个容器设置合理的资源请求和限制,避免两个容器互相抢占资源导致服务不稳定。
  • 数据安全:如果使用明文密码,建议改用Kubernetes Secrets来存储敏感信息,避免配置文件泄露。

内容的提问来源于stack exchange,提问作者raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 23:52:36