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

Kubernetes部署Spring Boot应用无法连接MySQL数据库问题咨询

问题修复方案

一、数据库连接失败修复

你遇到的通信报错核心是两个配置缺陷:

  • 无启动顺序控制:直接创建独立Pod时,K8s不会按依赖顺序调度启动,webapp Pod通常会早于MySQL Pod启动。此时MySQL尚未完成初始化、3306端口未开始监听,webapp发起连接直接失败,且Spring Boot默认启动阶段数据库连接失败就会直接终止进程,不会自动重试。
  • JDBC连接参数缺失:MySQL 8版本默认认证插件、SSL配置和旧版本不兼容,原有连接串缺少对应适配参数,即使MySQL启动完成也可能连接被拒。

按以下步骤修改配置即可解决:

  1. 调整application.properties中的数据库连接地址,补充兼容参数:
spring.datasource.url=jdbc:mysql://webapp-mysql:3306/bootdb?createDatabaseIfNotExist=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&autoReconnect=true&failOverReadOnly=false&maxReconnects=10

参数说明:

  • useSSL=false:关闭集群内部通信不需要的SSL校验
  • allowPublicKeyRetrieval=true:解决MySQL8默认caching_sha2_password认证插件的公钥获取报错
  • autoReconnect=true:连接异常时自动重试
    修改后重新构建Spring Boot镜像,替换原有镜像标签。
  1. 调整pods.yaml配置,增加启动等待逻辑、补全端口声明:
apiVersion: v1
kind: Pod
metadata:
  name: webapp
  labels:
    app: webapp
    release: "06"
spec:
  initContainers:
    - name: wait-for-mysql
      image: busybox:1.36
      command: ['sh', '-c', 'until nc -z webapp-mysql 3306; do echo "waiting for mysql to be ready"; sleep 2; done;']
  containers:
    - name: webapp
      image: andy999/shareserviceproj:release06
      ports:
        - containerPort: 8080 # 与Spring Boot配置的server.port保持一致,默认值为8080

---
apiVersion: v1
kind: Pod
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  containers:
   - name: mysql
     image: mysql:8
     ports:
       - containerPort: 3306
     env:
      # 生产环境请使用Secret存储敏感信息
      - name: MYSQL_ROOT_PASSWORD
        value: Temp@1234
      - name: MYSQL_DATABASE
        value: bootdb

新增的initContainer会在webapp主容器启动前循环探测MySQL服务的3306端口,直到端口可访问才会启动webapp,彻底解决启动顺序导致的连接失败。

  1. 调整Services.yaml配置,补全端口映射规则:
apiVersion: v1
kind: Service
metadata:
  name: share-webapp

spec:
  selector:
    app: webapp

  ports:
    - name: http
      port: 80
      targetPort: 8080 # 和webapp Pod的containerPort、Spring Boot监听端口保持一致
      nodePort: 30080

  type: NodePort

---
apiVersion: v1
kind: Service
metadata:
  name: webapp-mysql

spec:
  selector:
    app: mysql

  ports:
   - port: 3306
     targetPort: 3306
  type: ClusterIP

原有配置没有指定targetPort,Service默认会把请求转发到Pod的80端口,和Spring Boot默认监听的8080端口不匹配,即使应用正常启动也无法从外部访问。

二、Postman请求URL规则

你使用NodePort类型暴露web服务,请求地址格式为:
http://<K8s集群任意节点的IP地址>:30080/<代码中定义的接口路径>
示例:如果你的K8s节点IP为192.168.3.100,后端POST接口路径为/api/order/create,则完整请求地址为http://192.168.3.100:30080/api/order/create。
注意事项:

  • 如果使用minikube部署集群,执行minikube ip命令获取实际节点IP,不要直接使用127.0.0.1
  • 如果使用云服务器部署集群,需要在安全组规则中放开30080端口的入方向访问权限
  • 如果Spring Boot配置了server.servlet.context-path,接口路径需要带上对应的前缀

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:39:32