如何设置从多个 App Engine 项目到 Mongo Atlas 的 VPC 网络对等互连
How to set up VPC network peering from multiple App Engine projects to Mongo Atlas
我有一个 App Engine 应用程序,它通过网络对等连接安全地连接到 Mongo Atlas,一切正常。
我开始想要将应用程序制作成多区域的,这意味着创建多个项目并因此复制各种 GCP 基础设施,包括对等连接。但是,在重现此连接时,由于每个项目中两个“默认”VPC 之间 Mongo Atlas 端的 IP 冲突,我无法重现。
我可以在 GCP 端创建 VPC 网络对等互连,共享“默认”VPC 并设置相同的 Mongo project/network ID。默认 VPC 具有每个区域的范围,例如us-west1=10.138.0.0/20、us-west2=10.168.0.0/20(我原来的应用区域)和 us-west4=10.182.0.0/20 - 我正在设置的第二个区域。
在MongoDB端,他们的CIDR block固定在192.168.0.0/16,不能更改。但是当我输入新的 GCP 项目 ID 和“默认”VPC 时,它会抛出此错误:
Error trying to process asynchronous operation: An IP range in the peer network (10.138.0.0/20) overlaps with an IP range (10.138.0.0/20) in an active peer (peer-ABCXYZ) of the local network.
我知道 IP 范围不能重叠,因为这样会导致路由不明确。所以我想知道如何解决这个问题并连接两个项目。
我注意到错误大约是 10.138,这是 us-west1 区域,我什至没有使用它。那么有没有办法限制每个 VPC peering 只共享项目的区域?如果我能对每个人都这样做,就不会有重叠。
Mongo DB有文档介绍这个问题,但是这只是讨论AWS的解决方案,而且只是从他们的角度出发,并没有说另一端如何设置。
https://docs.atlas.mongodb.com/security-vpc-peering/#network-peering-between-an-service-vpc-and-two-virtual-networks-with-identical-cidr-blocks
GCP 有一份关于该问题的文档,但似乎没有提供解决方案,只是“你不能这样做”
https://cloud.google.com/vpc/docs/vpc-peering#overlapping_subnets_at_time_of_peering
我想我可能需要创建一个新的 VPC,可能具有区域限制的子网,并且只共享该 VPC?我查看了“创建 VPC 网络”,但它很快就变得复杂了。
我想要的是这样的:
Project A, us-west2=10.168.0.0/20 <==> Mongo Atlas 192.168.0.0/16
Project B, us-west4=10.182.0.0/20 <==> Mongo Atlas 192.168.0.0/16
这个问题类似,但没有具体说明(因为OP无论如何都不想要第二个连接)
更新
从那以后,我发现这成为问题的原因之一是因为在 2 年前最初设置第一个应用程序时,我只是使用了“默认”VPC,它本身默认为自动创建子网的“自动模式”适用于现在和未来的所有地区。这可以节省时间,but GCP recommends not to use this in production - 原因有很多,包括我的问题!如果您想更好地控制子网并避免冲突等,他们建议您使用“自定义模式”VPC,您必须自己定义所有子网。
在我的例子中,我不需要这个世界上所有可能区域的超级 VPC,而只需要一个区域。所以现在我将 to convert it to custom-mode 并修剪掉我在这个项目中没有使用的其他区域,以便能够解决重叠问题(即使我在另一个项目中使用单区域子网,我仍然需要将它们从原始项目中删除以避免冲突。
你是对的,如果你使用默认 VPC,你在所有区域都有 VPC,并且由于重叠而对等连接失败。
有2种解法:
- 在每个 region/project 中创建自定义 VPC 以创建干净的对等连接
- 或者(我的最爱),创建共享 VPC 并将所有 region/project 添加到宿主项目。最后,它是同一个项目,但仅限于多区域,共享 VPC 层很有意义。
Guillaume 的回答是正确的,但我想我应该添加我的具体工作方法,包括我如何避免冲突而不必重新配置我的原始应用程序。
我打算将原始应用程序的 auto-mode VPC 转换为自定义 VPC,然后删除我不使用的区域(除 us-west2 之外的所有区域)。我在另一个项目中实践了这一点,似乎工作起来又快又容易,但我想避免对我的生产应用程序造成任何干扰。
在研究了 auto-mode VPC 使用的 IP 范围后,我意识到我可以使用任何备用的“本地”IP 范围在我的第二个区域中创建一个新的 VPC,只要我避开 GCP auto-range of 10.128.0.0/20
(10.128.0.0 - 10.255.255.255) 和 Mongo Atlas range of 192.168.0.0/16
(192.168.0.0 - 192.168.255.255),所以我选择了 10.1.0.0/16
.
然后执行了这些步骤:
- 在我的第二个区域项目中创建自定义 VPC“my-app-engine”
- 添加 1 个子网“my-app-engine-us-west4”区域:“us-west4”10.1.0.0/16
- 在 GCP + Mongo Atlas 上将 VPC 对等添加到此网络并等待它连接
- 将子网范围 10.1.0.0/16 添加到 Atlas Network Access > IP Access List
- Re-deployed 使用额外的 app.yaml 设置将应用程序添加到此 VPC 中:
- 网络:my-app-engine
- subnetwork_name: my-app-engine-us-west4
对于自定义 VPC,您还必须在 app.yaml 中指定 subnetwork_name
,但对于 auto-mode 则不需要。
“IP 访问列表”让我困惑了一段时间,因为我忘记了您还必须为新的 VPC 对等打开 Mongo 防火墙,并且仍然会出现与集群的连接超时,即使已设置对等互连。
所以现在我有两个 VPC 对等连接,原来的 overstuffed 连接,以及自定义网络上的这个新的 slim 连接。一旦新区域开始工作,我最终将以这种更精简的模式重新部署旧应用程序。
我有一个 App Engine 应用程序,它通过网络对等连接安全地连接到 Mongo Atlas,一切正常。
我开始想要将应用程序制作成多区域的,这意味着创建多个项目并因此复制各种 GCP 基础设施,包括对等连接。但是,在重现此连接时,由于每个项目中两个“默认”VPC 之间 Mongo Atlas 端的 IP 冲突,我无法重现。
我可以在 GCP 端创建 VPC 网络对等互连,共享“默认”VPC 并设置相同的 Mongo project/network ID。默认 VPC 具有每个区域的范围,例如us-west1=10.138.0.0/20、us-west2=10.168.0.0/20(我原来的应用区域)和 us-west4=10.182.0.0/20 - 我正在设置的第二个区域。
在MongoDB端,他们的CIDR block固定在192.168.0.0/16,不能更改。但是当我输入新的 GCP 项目 ID 和“默认”VPC 时,它会抛出此错误:
Error trying to process asynchronous operation: An IP range in the peer network (10.138.0.0/20) overlaps with an IP range (10.138.0.0/20) in an active peer (peer-ABCXYZ) of the local network.
我知道 IP 范围不能重叠,因为这样会导致路由不明确。所以我想知道如何解决这个问题并连接两个项目。
我注意到错误大约是 10.138,这是 us-west1 区域,我什至没有使用它。那么有没有办法限制每个 VPC peering 只共享项目的区域?如果我能对每个人都这样做,就不会有重叠。
Mongo DB有文档介绍这个问题,但是这只是讨论AWS的解决方案,而且只是从他们的角度出发,并没有说另一端如何设置。 https://docs.atlas.mongodb.com/security-vpc-peering/#network-peering-between-an-service-vpc-and-two-virtual-networks-with-identical-cidr-blocks
GCP 有一份关于该问题的文档,但似乎没有提供解决方案,只是“你不能这样做” https://cloud.google.com/vpc/docs/vpc-peering#overlapping_subnets_at_time_of_peering
我想我可能需要创建一个新的 VPC,可能具有区域限制的子网,并且只共享该 VPC?我查看了“创建 VPC 网络”,但它很快就变得复杂了。
我想要的是这样的:
Project A, us-west2=10.168.0.0/20 <==> Mongo Atlas 192.168.0.0/16
Project B, us-west4=10.182.0.0/20 <==> Mongo Atlas 192.168.0.0/16
这个问题类似,但没有具体说明(因为OP无论如何都不想要第二个连接)
更新
从那以后,我发现这成为问题的原因之一是因为在 2 年前最初设置第一个应用程序时,我只是使用了“默认”VPC,它本身默认为自动创建子网的“自动模式”适用于现在和未来的所有地区。这可以节省时间,but GCP recommends not to use this in production - 原因有很多,包括我的问题!如果您想更好地控制子网并避免冲突等,他们建议您使用“自定义模式”VPC,您必须自己定义所有子网。
在我的例子中,我不需要这个世界上所有可能区域的超级 VPC,而只需要一个区域。所以现在我将 to convert it to custom-mode 并修剪掉我在这个项目中没有使用的其他区域,以便能够解决重叠问题(即使我在另一个项目中使用单区域子网,我仍然需要将它们从原始项目中删除以避免冲突。
你是对的,如果你使用默认 VPC,你在所有区域都有 VPC,并且由于重叠而对等连接失败。
有2种解法:
- 在每个 region/project 中创建自定义 VPC 以创建干净的对等连接
- 或者(我的最爱),创建共享 VPC 并将所有 region/project 添加到宿主项目。最后,它是同一个项目,但仅限于多区域,共享 VPC 层很有意义。
Guillaume 的回答是正确的,但我想我应该添加我的具体工作方法,包括我如何避免冲突而不必重新配置我的原始应用程序。
我打算将原始应用程序的 auto-mode VPC 转换为自定义 VPC,然后删除我不使用的区域(除 us-west2 之外的所有区域)。我在另一个项目中实践了这一点,似乎工作起来又快又容易,但我想避免对我的生产应用程序造成任何干扰。
在研究了 auto-mode VPC 使用的 IP 范围后,我意识到我可以使用任何备用的“本地”IP 范围在我的第二个区域中创建一个新的 VPC,只要我避开 GCP auto-range of 10.128.0.0/20
(10.128.0.0 - 10.255.255.255) 和 Mongo Atlas range of 192.168.0.0/16
(192.168.0.0 - 192.168.255.255),所以我选择了 10.1.0.0/16
.
然后执行了这些步骤:
- 在我的第二个区域项目中创建自定义 VPC“my-app-engine”
- 添加 1 个子网“my-app-engine-us-west4”区域:“us-west4”10.1.0.0/16
- 在 GCP + Mongo Atlas 上将 VPC 对等添加到此网络并等待它连接
- 将子网范围 10.1.0.0/16 添加到 Atlas Network Access > IP Access List
- Re-deployed 使用额外的 app.yaml 设置将应用程序添加到此 VPC 中:
- 网络:my-app-engine
- subnetwork_name: my-app-engine-us-west4
对于自定义 VPC,您还必须在 app.yaml 中指定 subnetwork_name
,但对于 auto-mode 则不需要。
“IP 访问列表”让我困惑了一段时间,因为我忘记了您还必须为新的 VPC 对等打开 Mongo 防火墙,并且仍然会出现与集群的连接超时,即使已设置对等互连。
所以现在我有两个 VPC 对等连接,原来的 overstuffed 连接,以及自定义网络上的这个新的 slim 连接。一旦新区域开始工作,我最终将以这种更精简的模式重新部署旧应用程序。