集装箱式服务器应用程序无法连接到MySQL数据库

我试图将在我们的Kubernetes集群中运行的服务器代码(在Google Container Engine上托pipe)连接到Google Cloud SQL托pipe的MySQL 5.7实例。 我遇到的问题是,每个连接都被数据库服务器Access denied for user 'USER'@'IP' (using password: YES) 。 数据库凭据(用户名,密码,数据库名称和SSL证书)在通过其他MySQL客户端连接或与本地实例上的容器相同的应用程序连接时都是正确的。

我已经validation所有凭据在应用程序的本地和服务器托pipe版本上都是相同的,并且与之连接的用户具有指定的通配符%主机。 真的不知道下一步要检查什么,说实话…

连接代码的编辑版本如下:

 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内置的。 没有专门的防火墙规则导致networking问题,这是由库连接,但未通过身份validation的事实。

设置云SQL代理后,我设法弄清楚实际的错误是什么:秘密和podconfiguration之间的一个额外的新行被添加到数据库名称,导致任何连接尝试失败。 随着代理设置,这是明确的,因为有一个实际的错误信息显示的效果。

(值得注意的是,所有logging我用来validation凭据是否准确的凭证的日志都没有明确显示换行符,并且被控制台显示添加换行符以包装显示的事实伪装,并且发生在行正好与数据库名称的结尾)

您是否阅读了https://cloud.google.com/sql/docs/mysql/connect-container-engine上的文档?

在容器引擎中,您需要在应用程序窗口旁边设置云端SQL代理容器并与之通话。 Cloud SQL Proxy将对Cloud SQL服务进行实际调用。

如果容器在本地工作,我假设你在开发机器上设置了Application Default Credentials。 这可能是失败的,因为这些凭据不是作为服务帐户文件在您的容器上。 尝试configuration服务帐户文件,或使用--scopes参数创build您的GKE集群,以使您的实例可以访问Cloud SQL。