在 GCP 项目之间设置 VPN 以访问 SQL 引擎子网

Setting up VPN between GCP Projects to access SQL Engine subnetwork

请耐心等待,因为我的背景是开发而不是系统管理员。网络是我边走边学的东西,也是我写这篇文章的原因:)

几个月前,我开始设计我们云的网络结构。在这里进行了几次交流后,我决定拥有一个项目,该项目将托管到本地资源的 VPN 隧道,以及一些其他项目,这些项目将在我们的产品从本地服务器移出后托管我们的产品。

一切都很好,我设法设置好了。

现在,其中一个项目致力于 "storage":这意味着,对我们来说,数据库、要访问的统计数据的存储桶等。

我创建了第一个 mySQL 数据库(第 2 代)以开始测试,并注意到从内部 IP 访问 SQL 数据库的唯一可用选项是 "parent project" 子网.

我意识到 SQL 引擎为此专门创建了一个子网。它也写在文档中,愚蠢的我。 没问题,我拆了,开启私服连接,在VPC管理中创建一个分配的IP范围,设置为导出路由。

然后我回到 SQL 引擎 a 创建了一个新数据库。正如预期的那样,新的已将 IP 分配给之前设置的分配 IP 范围。

现在,我希望每个对等网络也能够看到 SQL 子网,但显然不能。再说一次,RDFM,你这只傻鹅。也写在那里。

我激活了 GCP 的青铜支持订阅以获得一些指导,但我得到的是重复的 "create a vpn tunnel between the two projects" 这让我有点失望,因为 Peered VPC 的概念非常好。

但无论如何,我们就这样做吧。

我在项目上创建了一个指向网关的隧道,该网关将具有 K8s 集群,反之亦然。 仪表板告诉我隧道已建立,但显然 bgp 设置存在问题,因为它们永远挂在两侧的 "Waiting for peer" 上。

目前我正在寻找与 BGP 相关的任何信息,但我所能找到的只是它在理论上的工作原理、用途、保留的 ASM 编号等。

我真的需要有人指出显而易见的地方并告诉我我在这里搞砸了什么,所以:

这是托管数据库的项目上的 VPN 隧道:

这是将部署产品的项目上的 VPN 隧道,需要访问数据库。

非常感谢任何帮助!

关于您的 VPN 隧道中的 BGP 状态 "Waiting for peer",我认为这是由于配置的 Cloud Router BGP IP 和 BGP 对等 IP 造成的。配置时,隧道 1 的云路由器 BGP IP 地址将成为隧道 2 的 BGP 对等 IP 地址,隧道 1 的 BGP 对等 IP 地址将成为隧道 2 的路由器 BGP IP 地址。

根据您的场景,stage-tunnel-to-cerberus 的 IP 地址应为: 路由器BGP IP地址:169.254.1.2 和, BGP 对端 IP 地址:169.254.1.1

这应该将您的 VPN 隧道 BGP 会话状态置于 "BGP established"。

您无法通过 VPN 或 VPC 对等实现您想要的。事实上,VPC 中有一条规则可以避免对等传递 described in the restriction part

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.

现在,实现你想要实现的目标。当您使用云 SQL 私有 IP 时,您会在您的 VPC 和云 SQL 的 VPC 之间创建对等互连。 SQL 引擎还有另一个对等互连(或 VPN 隧道)。

SQL 引擎 -> 对等 -> 项目 -> 对等 -> 云 SQL

这样不行。

但是你可以使用shared VPC。创建一个共享 VPC,在其中添加您的 2 个项目,为 SQL 引擎和云 SQL 对等创建一个公共子网。那应该可以。

但是,要小心。并非所有 VPC 功能都可用于共享 VPC。例如,serverless VPC connector 还不符合它。

希望对您有所帮助!

OP 问题中的原始设置应该有效,即

Network 1 <--- (VPN) ---> Network 2 <--- (Peered) ---> CloudSQL network

network 并且对等互连由 GCP 创建)

然后 Network 1 中的资源能够访问在 CloudSQLz 网络中创建的 MySQL 实例。