【问题标题】:Not able to connect to Cloud SQL (MySQL) from GKE using a Spring-Boot application无法使用 Spring-Boot 应用程序从 GKE 连接到 Cloud SQL (MySQL)
【发布时间】:2020-06-27 21:42:19
【问题描述】:

我有一个 Spring Boot MySQL 提取器,它使用 jdbctemplate 连接到 Cloud SQL MySQL 实例。凭据存在于 application.properties 文件中。

我正在使用以下连接 URL:jdbc:mysql://[Public-IP]:3306/[database_name]

当我运行这个应用程序时,我遇到了以下错误:

Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
        at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
        at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836)
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456)
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199)
        at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
        at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:189)
        at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:154)
        at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:145)
        at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:205)
        at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:169)
        at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:157)
        at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:115)
        at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:78)
        ... 21 common frames omitted
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
        at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167)
        at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:91)
        at com.mysql.cj.NativeSession.connect(NativeSession.java:144)
        at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:956)
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826)
        ... 33 common frames omitted
Caused by: java.net.ConnectException: Operation timed out
        at java.base/sun.nio.ch.Net.connect0(Native Method)
        at java.base/sun.nio.ch.Net.connect(Net.java:493)
        at java.base/sun.nio.ch.Net.connect(Net.java:482)
        at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:588)
        at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:339)
        at java.base/java.net.Socket.connect(Socket.java:585)
        at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155)
        at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65)
        ... 36 common frames omitted

任何帮助将不胜感激。

【问题讨论】:

  • 你的 mysql 是否“允许远程连接”(“默认情况下”不应该)?你能在别处测试访问/凭据吗?

标签: java mysql google-cloud-platform google-kubernetes-engine google-cloud-sql


【解决方案1】:

我认为您需要使用“sidecar”容器模式将 Cloud SQL 代理 docker 映像添加到您的 pod。你可以在这里找到文档:https://cloud.google.com/sql/docs/mysql/connect-kubernetes-engine#proxy

【讨论】:

  • 您好 Claudio,我没有尝试使用 Cloud SQL Proxy docker 进行连接,而是使用私有 IP 地址进行连接。这是文档:cloud.google.com/sql/docs/mysql/…
  • 您好阿曼,在您的连接字符串中,您写的是 [Public-IP] 而不是 Private。无论如何,我真的建议您使用 Cloud SQL Proxy,它真的超级容易使用,而且真的更安全,因为您通过服务帐户连接。如果您需要帮助,请联系我。
  • 对不起,我的意思是公开,但感谢您的建议。
  • 没问题。你很高兴。
  • 这里有一个简单的使用sql代理的方法:youtube.com/watch?v=iKoaiH_xYB8&t=21s
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多