我正在尝试将在Kubernetes群集(托管在Google容器引擎上)中作为Docker容器运行的服务器代码连接到Google Cloud SQL托管的MySQL 5.7实例。我遇到的问题是数据库服务器使用Access denied for user 'USER'@'IP' (using password: YES)
拒绝每个连接。数据库凭据(用户名,密码,数据库名称和SSL证书)都是正确的,并且在通过其他MySQL客户端或作为本地实例上的容器运行的同一应用程序进行连接时可以正常工作。
我已经验证了应用的本地和服务器托管版本上的所有凭据都是相同的,并且我正在连接的用户指定了通配符%
主机。老实说,不太确定接下来要检查什么......
连接代码的编辑版本如下:
let connectionCreds = {
host: Config.SQL.HOST,
user: Config.SQL.USER,
password: Config.SQL.PASSWORD,
database: Config.SQL.DATABASE,
charset: 'utf8mb4',
};
if (Config.SQL.SSL_ENABLE) {
connectionCreds['ssl'] = {
key: fs.readFileSync(Config.SQL.SSL_CLIENT_KEY_PATH),
cert: fs.readFileSync(Config.SQL.SSL_CLIENT_CERT_PATH),
ca: fs.readFileSync(Config.SQL.SSL_SERVER_CA_PATH)
}
}
this.connection = MySQL.createConnection(connectionCreds);
附加信息:服务器应用程序使用mysql2库在Node中构建,以连接到数据库。没有特殊的防火墙规则导致网络问题,并且这已经证实了库IS连接但无法进行身份验证。
答案 0 :(得分:1)
设置Cloud SQL Proxy后,我设法弄清楚实际错误是什么:在秘密和pod配置之间的某处,数据库名称中添加了一个额外的换行符,导致任何连接尝试失败。通过代理设置,这一点已经明确,因为显示了实际的错误消息。
(特别是我所有关于我用来验证凭据是否准确的凭据的日志记录没有明确显示换行符,并且被控制台显示添加了换行符以包裹显示的事实所伪装,以及它碰巧恰好与数据库名称的结束位置对齐)
答案 1 :(得分:0)
您是否阅读了https://cloud.google.com/sql/docs/mysql/connect-container-engine上的文档?
在Container Engine中,您需要在应用程序窗格旁边设置Cloud SQL Proxy容器并与之通信。然后,Cloud SQL Proxy将实际调用Cloud SQL服务。
如果容器在本地工作,我假设您在开发计算机上设置了应用程序默认凭据。它可能会失败,因为这些凭据不作为服务帐户文件在您的容器上。尝试配置服务帐户文件,或使用--scopes
参数创建GKE集群,使您的实例能够访问Cloud SQL。