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

Kubernetes Pod访问同实例MySQL报root用户Access denied排查求助

排查解决方案
  • **MySQL 8.0 版本默认使用caching_sha2_password认证插件,低版本JDBC驱动对该插件兼容性不足,优先校验驱动版本:
    1. 确认prm镜像中mysql-connector-java版本与pyp项目使用的驱动版本一致,若版本低于8.0.19建议直接升级到匹配数据库版本的驱动。
    2. 若不方便升级驱动,可手动修改root用户认证策略,进入MySQL容器执行以下SQL:
      ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的实际密码';
      FLUSH PRIVILEGES;
      
  • 校验Kubernetes Secret配置正确性:Kubernetes Secret的data字段值必须为Base64编码格式,若直接填写明文会导致读取到错误密码。执行以下命令校验Secret存储的密码是否正确:
    kubectl get secret pyp-secret -o jsonpath='{.data.mysql_password}' | base64 -d
    
    若输出内容与实际密码不符,重新生成符合Base64编码规则的Secret即可。
  • 修正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手动验证连通性:
    1. 执行kubectl get pods获取prm Pod名称,执行以下命令进入容器:
      kubectl exec -it <替换为prm-pod名称> -- /bin/bash
      
    2. 执行echo $MYSQL_PASSWORD确认环境变量读取的密码和实际密码一致。
    3. 安装mysql客户端后执行mysql -h pyp-db -u root -p$MYSQL_PASSWORD测试直连数据库,确认是网络连通性、凭证有效性。

内容的提问来源于stack exchange,提问作者Anne Helene Holmen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:54:07