【问题标题】:Cannot connect to Cloud SQL from Cloud Run after enabling private IP and turning off public iP启用私有 IP 并关闭公共 iP 后无法从 Cloud Run 连接到 Cloud SQL
【发布时间】:2020-04-29 13:40:24
【问题描述】:

根据文档,我有一个 postgreSQL CLoud SQL 实例,我通过 UNIX 套接字和来自 Cloud Run 容器的实例名称连接到该实例。使用公共 IP,此连接可以正常工作。我希望关闭公共 IP 并且只有一个私有 IP,因此我不会为以后的公共 IP 付费。

当我第一次创建 Cloud SQL 实例时,我只启用了公共 IP。几天后,我启用了私有 IP。对于私有 IP 的关联网络,我接受了默认值,因为 Cloud Run 实例在同一个项目中。

当我关闭公共 IP 时,我的应用程序无法再连接到 Cloud SQL 实例。我收到连接被拒绝错误:

sqlalchemy.exc.InterfaceError: (pg8000.core.InterfaceError) ('communication error', ConnectionRefusedError(111, 'Connection refused'))

如上所述,我确实按照从 Cloud Run 连接到 Cloud SQL 页面上的说明进行操作:

https://cloud.google.com/sql/docs/postgres/connect-run

我什至在关闭公共 IP 并且只有私有 IP 可用后运行 gcloud 命令来更新现有部署的修订版,但没有任何区别。

从 Cloud Run 连接到 Cloud SQL 是否需要公共 IP?我在连接文档页面中没有看到。还是在尝试切换到只有私有 IP 时我错过了其他什么?还是我需要在没有公共 IP 的情况下创建一个新的 Cloud Instance,然后再按照说明通过实例名称连接 Cloud Run?

【问题讨论】:

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


    【解决方案1】:

    从 Cloud Run 到 Cloud SQL 的连接是否需要公共 IP?我在连接文档页面中没有看到。

    Connecting to Cloud SQL from Cloud Run page 上显示“注意:这些说明要求您的 Cloud SQL 实例配置公共 IP 地址。”

    私有 IP 访问是来自 Virtual Private Cloud (VPC) 的访问。为了通过 VPC 访问您的实例,您连接的资源需要是 VPC 的一部分。 Cloud Run 目前不支持 VPC 访问,因此您现在需要使用公共 IP。

    【讨论】:

      【解决方案2】:

      TL;DR:向 Google 支持提出案例

      您的案例很有趣,因为按照设计,我认为它尚未得到支持。

      实际上,当您使用私有 IP 创建 Cloud SQL 数据库时,network peering is done between your VPC and the Cloud SQL VPC (or something equivalent)

      此外,目前无法将您的 Cloud Run 实例插入您的 VPC。有了函数和 App Engine,您就有了 serverless VPC connector,而 Cloud Run 还没有(它即将推出!)。

      无服务器 VPC 连接器执行与 Cloud SQL 私有 IP 相同的事情,我的意思是您的 VPC 和 Cloud Functions(或 App Engine)VPC(或等效的东西)之间的对等。

      即使 Cloud Run 上提供了无服务器 VPC 连接器,由于network peering transitivity,它也不确定它是否可以工作。简而言之,如果您在 VPC A -> VPC B 和 VPC B -> VPC C 之间有对等互连,则无法通过在 VPC B 中执行跃点从 VPC A 到达 VPC C。将 A 替换为 VPC Cloud Run, B由您项目的 VPC 提供,C 由 VPC Cloud SQL 提供。

      只有直接对等的网络才能进行通信。不支持传递对等互连。换言之,如果 VPC 网络 N1 与 N2 和 N3 对等,但 N2 和 N3 没有直接连接,则 VPC 网络 N2 无法通过 VPC Network Peering 与 VPC 网络 N3 通信。

      我没有检查 AppEngine 或 Cloud Function,但这种设计不应该工作。

      但我不确定,这就是为什么 Google 支持的案例可以让您获得明确的答案,并可能在路线图上提供意见。欢迎提供来自 Google 支持的任何有价值的信息!

      【讨论】:

        【解决方案3】:

        当我尝试使用 cloud shell 中的以下命令连接到 postgres 时,我也遇到了以下错误:

         gcloud sql connect 
        

        您的客户端似乎没有 ipv6 连接...

        我所做的是使用以下命令登录到使用 Google 云 Kubernetes 部署的 pod 之一:

        kubectl exec --stdin --tty java-hello-world-7fdecb9894-smql4  -- /bin/bash
        

        然后我第一次跑:

        apt-get update
        apt install postgresql-client
        

        现在我可以使用以下方式连接:

        psql -h postgres-private-ip -U username
        

        【讨论】:

          猜你喜欢
          • 2021-01-28
          • 1970-01-01
          • 2020-12-30
          • 2019-12-28
          • 1970-01-01
          • 2021-04-26
          • 1970-01-01
          • 2021-07-16
          • 2020-01-01
          相关资源
          最近更新 更多