Skip to main content
 首页 » 编程设计

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

2025年05月04日20kevingrace

我尝试按照以下步骤操作: https://cloud.google.com/sql/docs/mysql/connect-kubernetes-engine .

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

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

$kubectl logs users-app-HASH1-HASH2 cloudsql-proxy 
2018/08/03 18:58:45 using credential file for authentication; <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8beee6eae2e7b6e2ffa6ffeef8ffcbfffeffe4f9e2eae7a6e9e4e4e0f8e3eee7eda6f3f3f3f3f3f3a5e2eae6a5ecf8eef9fde2e8eeeae8e8e4fee5ffa5e8e4e6" rel="noreferrer noopener nofollow">[email protected]</a> 
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 secret 设置的凭据)。

我确信我在这里做了一些愚蠢的事情,所以我希望在 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 实例。在本例中,您将设置 unix_socket=/cloudsql/<INSTANCE_CONNECTION_NAME>在您的网址中。

如果您尝试通过 TCP 套接字进行连接,请使用如下实例标志:-instances=<INSTANCE_CONNECTION_NAME>=tcp:3306 。这将告诉代理监听端口 3306 并将流量转发到您的 Cloud SQL 实例。在本例中,您将使用主机='127.0.0.1'和端口=3306。

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