启用私有 IP 并关闭 public iP 后无法从云 运行 连接到云 SQL

Cannot connect to Cloud SQL from Cloud Run after enabling private IP and turning off public iP

我有一个 postgreSQL CLoud SQL 实例,我通过 UNIX 套接字连接到该实例,根据文档,实例名称来自云 运行 容器。使用 public IP,此连接工作正常。我想关闭 public IP 并且只有一个私有 IP,所以我不会为 public IP 继续付费。

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

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

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

如上所述,我确实遵循了从云 运行 连接到云 SQL 页面上的说明:

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

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

从云 运行 云 SQL 连接是否需要 public IP?我没有在连接文档页面中看到它。还是在尝试切换到仅拥有私有 IP 时我错过了其他东西?或者我是否需要创建一个没有 public IP 的新云实例并通过实例 anme 再次完成连接云 运行 的说明?

TL;DR:向Google支持

开个案

您的情况很有趣,因为根据设计,我认为它尚不受支持。

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

此外,目前无法将您的 Cloud 运行 实例插入您的 VPC。有了函数和 App Engine,您就有了 serverless VPC connector,而没有云 运行(它来了!)。

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

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

Only directly peered networks can communicate. Transitive peering is not supported. In other words, if VPC network N1 is peered with N2 and N3, but N2 and N3 are not directly connected, VPC network N2 cannot communicate with VPC network N3 over VPC Network Peering.

我没有检查 AppEngine 或 Cloud Function,但这个设计应该行不通。

但我不确定,这就是为什么 Google 支持的案例会让你有一个明确的答案,并可能在路线图上输入。欢迎来自Google支持的任何有价值的信息!

Is a public IP required for a connection from Cloud Run to Cloud SQL? I do not see that in the connection documentation page.

Connecting to Cloud SQL from Cloud Run page 上显示 "Note: These instructions require your Cloud SQL instance to have a public IP address configured."

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

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

 gcloud sql connect 

it seems your client does not have ipv6 connectivity...

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

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