【问题标题】:Connect to Google Cloud MySql From Cloud Run (knative)从 Cloud Run (knative) 连接到 Google Cloud MySql
【发布时间】:2020-05-27 13:04:48
【问题描述】:

对于我正在处理的示例项目 (https://gitlab.com/connorbutch/reading-comprehension-ws),我在从 google cloud run 连接到 google cloud mysql 数据库时遇到问题。但是,当我使用相同的参数(在 docker 和 kubernetes 中)在本地运行时,应用程序看起来会成功。

此处列出了我在设置我的 google cloud run 应用程序时所遵循的步骤 (https://cloud.google.com/sql/docs/mysql/connect-run)。我在云数据库信息中包含了 mysql db。我尝试过的事情

使用 jdbc 连接字符串中的 ip 地址进行连接(在本地工作,但页面上的此语句表明它可能不适用于 google cloud run,“Cloud Run(完全托管)不支持使用 TCP 连接到 Cloud SQL 实例。您的代码不应尝试使用 IP 地址(例如 127.0.0.1 或 172.17.0.1)访问实例。”) 按照建议使用 unix socket 连接,服务器甚至没有启动

当我在 google cloud 上使用 jdbc url 中的 ip 地址启动应用程序时,看起来应用程序启动成功:

2020-02-12T02:51:01.733606Z 2020-02-12 02:51:01.733  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path '' 
2020-02-12T02:51:01.740162Z 2020-02-12 02:51:01.739  INFO 1 --- [           main] com.connor.Application                   : Started Application in 15.717 seconds (JVM running for 17.715) 

但是,当我提出第一个请求时,我看到以下内容:

Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
Caused by: java.net.SocketTimeoutException: connect timed out
Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

您有什么建议吗?我想知道这是否与必须配置我们的 DataSource 相关,如下所示:https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/cloud-sql/mysql/servlet/src/main/java/com/example/cloudsql/ConnectionPoolContextListener.java

【问题讨论】:

  • 您使用的是 Cloud Run Manager 还是 Anthos?怎么部署到Cloud Run,可以分享一下吗?
  • @pentium10 我刚刚使用 ui 进行部署以进行概念验证

标签: mysql google-cloud-platform cloud google-cloud-run


【解决方案1】:

遵循文档步骤:

  1. Build and deploy container
  2. Connect from Cloud Run

在最后一步:第二个链接的“Connecting to CloudSQL”而不是使用代码sn-p,我使用GitHub instructions中的以下命令:

 gcloud run services update helloworld --add-cloudsql-instances [INSTANCE_CONNECTION_NAME] --set-env-vars CLOUD_SQL_CONNECTION_NAME=[INSTANCE_CONNECTION_NAME],DB_USER=[MY_DB_USER],DB_PASS=[MY_DB_PASS],DB_NAME=[MY_DB]

其中“helloworld”是我的服务名称。

请谨慎使用此命令上的间距,因为它很容易引发错误。

话虽如此,执行 curl 命令后我没有收到任何错误,所以我的应用程序运行成功。

此外,在调查您收到的错误期间,我遇到了this link,其中包含导致此错误的可能原因列表。

最后,由于报错提示超时,你也可以尝试修改Cloud Run的请求超时,关注this

一些可能对您有用的进一步链接是:

  1. Diagnosing issues with Cloud SQL instances
  2. Troubleshooting Cloud Run (fully managed)

我希望这些信息对您有所帮助。

【讨论】:

  • 感谢 Artemis 的彻底回复!我去看看有没有帮助!
  • 不客气!请告诉我情况如何,以便我们在发生任何事件时进行进一步调查。
【解决方案2】:

遗憾的是,https://cloud.google.com/sql/docs/mysql/connect-run 文档目前没有记录 Knative 指令。任何时候你看到“Cloud Run(完全托管)”这不是 Kubernetes 实现。

如果您在 Kubernetes/GKE 集群上使用 Cloud Run,这可能更适用。 https://cloud.google.com/sql/docs/mysql/connect-kubernetes-engine 就是说这种方法使用“Cloud SQL Proxy”sidecar 容器,Knative 目前还不支持这个概念。

但是,使用这些说明,您可以通过私有 IP 连接到 Cloud SQL 实例,因为 GKE 集群可以位于 VPC 中(尽管“Cloud Run 完全托管”应用程序目前不能)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-23
    • 2020-06-15
    • 2021-07-18
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2020-05-27
    相关资源
    最近更新 更多