Kubernetes部署Spring Boot应用无法连接MySQL数据库问题咨询
问题修复方案
一、数据库连接失败修复
你遇到的通信报错核心是两个配置缺陷:
- 无启动顺序控制:直接创建独立Pod时,K8s不会按依赖顺序调度启动,webapp Pod通常会早于MySQL Pod启动。此时MySQL尚未完成初始化、3306端口未开始监听,webapp发起连接直接失败,且Spring Boot默认启动阶段数据库连接失败就会直接终止进程,不会自动重试。
- JDBC连接参数缺失:MySQL 8版本默认认证插件、SSL配置和旧版本不兼容,原有连接串缺少对应适配参数,即使MySQL启动完成也可能连接被拒。
按以下步骤修改配置即可解决:
- 调整
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镜像,替换原有镜像标签。
- 调整
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,彻底解决启动顺序导致的连接失败。
- 调整
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
相关产品推荐
相关产品推荐

