Kubernetes Pod访问同实例MySQL报root用户Access denied排查求助
排查解决方案
- **MySQL 8.0 版本默认使用
caching_sha2_password认证插件,低版本JDBC驱动对该插件兼容性不足,优先校验驱动版本:- 确认prm镜像中
mysql-connector-java版本与pyp项目使用的驱动版本一致,若版本低于8.0.19建议直接升级到匹配数据库版本的驱动。 - 若不方便升级驱动,可手动修改root用户认证策略,进入MySQL容器执行以下SQL:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的实际密码'; FLUSH PRIVILEGES;
- 确认prm镜像中
- 校验Kubernetes Secret配置正确性:Kubernetes Secret的
data字段值必须为Base64编码格式,若直接填写明文会导致读取到错误密码。执行以下命令校验Secret存储的密码是否正确:
若输出内容与实际密码不符,重新生成符合Base64编码规则的Secret即可。kubectl get secret pyp-secret -o jsonpath='{.data.mysql_password}' | base64 -d - 修正JDBC连接写法:直接拼接用户名、密码到URL的方式会导致特殊字符被URL转义异常,同时MySQL 8.0远程连接需要额外添加兼容参数,修改代码如下:
新增的static Connection init(String host,String user, String password){ Connection con = null; try { if (con == null) { Class.forName("com.mysql.cj.jdbc.Driver").newInstance(); // 新增必要连接参数解决MySQL8适配 String url = "jdbc:mysql://" + host + ":3306/PP_Master?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"; logger.trace("DB url:" + url); // 使用重载方法传递用户名密码,避免拼接异常 con = DriverManager.getConnection(url, user, password); } } catch (Exception ex) { logger.error("init: " , ex); } return con; }allowPublicKeyRetrieval=true参数用于解决MySQL8默认不允许公钥检索导致的远程权限校验失败问题。 - **进入prm Pod手动验证连通性:
- 执行
kubectl get pods获取prm Pod名称,执行以下命令进入容器:kubectl exec -it <替换为prm-pod名称> -- /bin/bash - 执行
echo $MYSQL_PASSWORD确认环境变量读取的密码和实际密码一致。 - 安装mysql客户端后执行
mysql -h pyp-db -u root -p$MYSQL_PASSWORD测试直连数据库,确认是网络连通性、凭证有效性。
- 执行
内容的提问来源于stack exchange,提问作者Anne Helene Holmen
相关产品推荐
相关产品推荐

