Minikube集群中Spring Boot Pod无法连接MySQL服务的问题排查
问题分析与解决方案
核心原因
没错,expense_manager_user仅映射到localhost主机正是导致连接失败的关键原因。
MySQL的用户权限采用**「用户名+主机」**的组合校验机制:expense_manager_user@localhost意味着该用户只能从MySQL容器内部的localhost发起连接,而你的Spring Boot应用运行在独立的Kubernetes Pod中(IP为10.244.0.70),属于外部主机,因此会被MySQL的权限系统拒绝访问。
修复步骤
1. 修正MySQL用户权限
进入MySQL Pod执行权限变更操作:
# 替换<mysql-pod-name>为实际的MySQL Pod名称,可通过kubectl get pods获取 kubectl exec -it <mysql-pod-name> -- mysql -uroot -ppassword
在MySQL控制台中执行:
-- 允许expense_manager_user从任意主机访问目标数据库 GRANT ALL PRIVILEGES ON expense_manager.* TO 'expense_manager_user'@'%' IDENTIFIED BY 'expense_manager_password'; -- 刷新权限使变更生效 FLUSH PRIVILEGES; -- 验证权限是否生效,应能看到host为%的记录 SELECT user, host FROM mysql.user WHERE user='expense_manager_user';
2. 修正Spring Boot的数据库连接地址
你的MySQL Service名称为mysql-service,但Spring应用配置中使用的主机名是mysql,这会导致DNS解析失败。需要修改Deployment中的环境变量:
env: - name: SPRING_DATASOURCE_URL value: jdbc:mysql://mysql-service:3306/expense_manager
修改后重启Spring应用Deployment:
kubectl rollout restart deployment expense-manager-deployment
3. 处理持久化数据的潜在问题
由于你的MySQL使用了PersistentVolumeClaim(PVC)存储数据,若后续重启MySQL Pod,之前的权限变更会被PVC中的原有数据覆盖(因为MYSQL_USER等初始化环境变量仅在容器首次启动时生效)。
如果是测试环境,可删除PVC重新初始化:
kubectl delete pvc mysql-pv-claim kubectl delete deployment mysql kubectl apply -f <mysql-deployment-yaml-file>
内容的提问来源于stack exchange,提问作者Gyan-Lucifer
相关产品推荐
相关产品推荐

