0

我正在尝试将在我们的 Kubernetes 集群(托管在 Google Container Engine 上)中作为 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);

附加信息:服务器应用程序是在 Node 中构建的,使用mysql2库连接到数据库。没有任何特殊的防火墙规则会导致网络问题,这可以通过库正在连接但无法进行身份验证的事实得到证实。

4

2 回答 2

1

设置Cloud SQL 代理后,我设法弄清楚实际错误是什么:在秘密和 pod 配置之间的某个地方,一个额外的换行符被添加到数据库名称中,导致任何连接尝试失败。设置代理后,这一点就很清楚了,因为显示了一条实际的错误消息。

(值得注意的是,我用来验证凭据是否准确的所有凭据都没有显式显示换行符,并且被控制台显示添加换行符以换行显示的事实掩盖了,它发生在行与数据库名称结束的位置完全一致)

于 2017-05-18T19:25:53.440 回答
0

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

在 Container Engine 中,您需要在应用程序 pod 旁边设置一个 Cloud SQL 代理容器并与之对话。然后,Cloud SQL 代理将对 Cloud SQL 服务进行实际调用。

如果容器在本地工作,我假设您在开发机器上设置了应用程序默认凭据。它可能会失败,因为这些凭据不在您的容器中作为服务帐户文件。尝试配置服务帐户文件,或使用--scopes参数创建 GKE 集群,让您的实例可以访问 Cloud SQL。

于 2017-05-18T05:22:52.653 回答