无法从 Kubernetes Engine 连接到 CloudSQL(无法连接到"localhost"上的 MySQL 服务器)



我尝试按照中的步骤进行操作:https://cloud.google.com/sql/docs/mysql/connect-kubernetes-engine.

我让应用程序容器和cloudsql代理容器在同一个pod中运行。

创建集群后,代理容器的日志似乎是正确的:

$kubectl logs users-app-HASH1-HASH2 cloudsql-proxy
2018/08/03 18:58:45 using credential file for authentication; email=it-test@tutorial-bookshelf-xxxxxx.iam.gserviceaccount.com
2018/08/03 18:58:45 Listening on 127.0.0.1:3306 for tutorial-bookshelf-xxxxxx:asia-south1:it-sample-01
2018/08/03 18:58:45 Ready for new connections

然而,来自应用程序容器的日志会抛出一个无法在本地主机上连接的错误:

$kubectl logs users-app-HASH1-HASH2 app-container
...
19:27:38 users_app.1 |     return Connection(*args, **kwargs)
19:27:38 users_app.1 |   File "/usr/local/lib/python3.7/site-packages/pymysql/connections.py", line 327, in __init__
19:27:38 users_app.1 |     self.connect()
19:27:38 users_app.1 |   File "/usr/local/lib/python3.7/site-packages/pymysql/connections.py", line 629, in connect
19:27:38 users_app.1 |     raise exc
19:27:38 users_app.1 | sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'localhost' ([Errno 2] No such file or directory)") (Background on this error at: http://sqlalche.me/e/e3q8)

SQLALCHEMY_DATABASE_URI'mysql+pymysql://{user}:{password}@/{database}?unix_socket=/cloudsql/{cloudsql_connection_name}',并填充了正确的值(我使用kubectl机密设置的凭据(。

我确信我在这里做了一些愚蠢的事情,所以我希望在GCP方面有更多经验的人可以看看,并为解决这个问题提供建议。


更新:我刚刚转到GCP kubernetes引擎页面,在应用程序容器上打开了一个shell,并尝试连接到云sql实例。这似乎奏效了。

$gcloud container cluster ......... -it /bin/sh
#python
>>> import pymysql
>>> connection = pymysql.connect(host='127.0.0.1', user='user', password='password', db='db')
>>> with connection.cursor() as cursor:
...     cursor.execute("show databases;")
...     tables = cursor.fetchall()
...
5

但是以下(当我尝试通过sqlalchemy连接时(失败了:

>>> connection = pymysql.connect(host='127.0.0.1', user='u', password='p', db='d', unix_socket='/cloudsql/CONNECTION_NAME')
...
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 2] No such file or directory)")


>>> from sqlalchemy import create_engine
>>> engine = create_engine('mysql://user:password@localhost/db')
>>> engine.connect()
Traceback (most recent call last):
...    
sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (2002, 'Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2 "No such file or directory")') (Background on this error at: http://sqlalche.me/e/e3q8)


>>> engine = create_engine('mysql+pymysql://user:password@/db?unix_socket=/cloudsql/tutorial-bookshelf-xxxx:asia-south1:test-01')
>>> engine.connect()
Traceback (most recent call last):
...
raise exc
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'localhost' ([Errno 2] No such file or directory)") (Background on this error at: http://sqlalche.me/e/e3q8)

通过代理连接到CloudSQL可以通过unix套接字或TCP连接来完成,但不应该同时使用这两种连接。

我没有看到任何关于如何配置代理的规范,但如果您希望使用unix套接字,那么您的代理实例标志应该是这样的:-instances=<INSTANCE_CONNECTION_NAME>。这将导致代理在/cloudsql目录中创建一个unix套接字,将流量转发到您的Cloud SQL实例。在这种情况下,您将在url中设置unix_socket=/cloudsql/<INSTANCE_CONNECTION_NAME>

如果您试图通过TCP套接字进行连接,那么请使用如下实例标志:-instances=<INSTANCE_CONNECTION_NAME>=tcp:3306。这将告诉代理侦听端口3306,并将流量转发到您的云SQL实例。在这种情况下,您将使用host='27.0.0.1'和port=3306。

如果您正在寻找在GKE上使用CloudSQL的实际介绍,我鼓励您查看本项目中提到的代码实验室:https://github.com/GoogleCloudPlatform/gmemegen

我最近通过cloudSQL代理安装了cloudSQL postgres。我有几个问题要问你。

  1. 您用于cloudsql代理的凭据,它们是否具有云SQL客户端角色
  2. 你的cloudsql代理容器命令是这样的吗,

    /cloud_sql_proxy","--dir=/cloudsql","-instances==tcp:3306","-credential_file=/secrets/cloudsql/credential.json">

如果您可以共享您的kubernetes deployment.yml,它同时具有应用程序和代理容器,这可能会有所帮助。

好的。。发布了一个答案,但我还没有完全满意,所以我会等待更多。

通过将SQLALCHEMY_DATABASE_URI更改为'mysql+pymysql://user:password@/db'(意味着我去掉了unix套接字连接字符串(,我能够连接到云SQL实例

所以:

>>> engine = create_engine('mysql+pymysql://user:password@/db')
>>> engine.connect()
<sqlalchemy.engine.base.Connection object at 0x7f2236bdc438>

我不知道为什么我必须去掉unix套接字连接字符串,因为我为我的项目启用了云SQL API。

相关内容

  • 没有找到相关文章

最新更新