与 Google SQL 的 TCP 连接给出 OperationalError(来自 GKE 中的容器化应用程序)

Posted

技术标签:

【中文标题】与 Google SQL 的 TCP 连接给出 OperationalError(来自 GKE 中的容器化应用程序)【英文标题】:TCP Connection to Google SQL gives OperationalError (from containerized app in GKE) 【发布时间】:2022-01-06 12:36:50 【问题描述】:

我有一个容器化并部署到 Google Kubernetes Engine 的 Flask 和 SQLAlchemy 服务,并且我在 Google SQL 中建立了到我的数据库的 TCP 连接。在本地开发时,连接成功,因为我已将计算机的 IP 地址添加到 Google SQL 中我的数据库实例的“授权网络”。但是,当我将服务部署到 GKE 中的集群时,与数据库的 TCP 连接会出现 OperationalError。

我认为这个错误主要是因为我的集群的 IP 地址没有添加到“授权网络”中(为了验证我从授权网络中删除了我的计算机的 IP 并在本地测试了连接并得到了相同的 OperationalError)。我已经授权了我的集群的端点 IP、pod 地址范围(见下图)以及为我的服务公开到互联网的 IP,但是,两者似乎都不起作用。为了授权我的 GKE 集群连接 Google SQL 中的数据库,我应该将哪个 IP 添加到“授权网络”?

这是我构建连接 URL 的方法:

class Config(object):
    if os.environ.get('ENVIRONMENT') == 'production':
        log.debug("You're using the remote db URL!!!")
        db_user = os.environ.get("DB_USER")
        db_pass = os.environ.get("DB_PASS")
        db_name = os.environ.get("DB_NAME")
        db_hostname = os.environ.get("DB_HOST")
        db_port = os.environ.get("DB_PORT")

        SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://db_user:db_pass@db_hostname:db_port/db_name"

【问题讨论】:

你的云sql实例是如何配置的(网络部分)?公共IP,私人IP,两者兼而有之?它绑定到哪个 VPC?与 gke 集群相同(默认/默认)?您如何连接到 sql 实例(生成的 conn 字符串是什么)?您得到的确切错误是什么? 你使用的是私有IP吗?如果是这样,您必须具有对等互连和服务连接。一旦你不使用私有,你可以通过 Socket 或使用云 sql 代理连接,看看这个youtube.com/watch?v=rh1EzNey3VQ,youtube.com/watch?v=iKoaiH_xYB8,youtube.com/watch?v=w0dLD0Adslk&t=2s 【参考方案1】:

我建议不要将整个节点网络添加到授权网络,而是使用 Cloud SQL 代理来授权您的连接。这里有一个操作指南:https://cloud.google.com/sql/docs/mysql/connect-kubernetes-engine

【讨论】:

以上是关于与 Google SQL 的 TCP 连接给出 OperationalError(来自 GKE 中的容器化应用程序)的主要内容,如果未能解决你的问题,请参考以下文章

Google应用引擎TCP连接失败

使用 GRPC 与 Google Cloud Run 通信的 Google App Engine 给出“错误:14 不可用:连接已断开”

Web 服务与 TCP/IP 套接字 (Java) + SQL 连接

TCP协议及TCP正常连接与断开

UDP与TCP的区别

WCF over net.tcp 与安全模式 none 给出异常