无法使用来自 GCP 集群的 VPC 对等连接到 Mongo Atlas
Cannot connect to Mongo Atlas using VPC peering from GCP cluster
我正在尝试将 GCP Kubernetes 引擎集群上的 Java 应用 运行 与 Mongo Atlas 集群 (M20) 连接起来。以前,当我没有打开 VPC 对等连接并且我使用的是常规连接字符串时,它运行良好。但我现在正在尝试使用 VPC 对等连接,在我的 GCP 项目中使用 default
VPC 网络。我按照 https://docs.atlas.mongodb.com/security-vpc-peering/ 中的步骤操作。我选择的Atlas CIDR为192.168.0.0/18 (b/c "The Atlas CIDR block must be at least a /18"),将GCP项目与Atlas集群对接后,将10.128.0.0/9添加到Atlas集群的IP白名单中(b/c 它说这是 GCP 项目中 auto 的默认范围。
我实际上可以通过 Mongo shell 通过 mongo "mongodb+srv://<cluster_name>-pri.crum0.gcp.mongodb.net/itls"
从我的 GCP 项目中的其他虚拟机进行连接。但是我的 GCP 集群中某个 pod 上的应用 运行 无法连接。我在 Java 应用程序中看到的确切错误是
Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches com.mongodb.client.internal.MongoClientDelegate@a07fbd8. Client view of cluster state is {type=REPLICA_SET, servers=[{address=<cluster_name>-shard-00-00-pri.crum0.gcp.mongodb.net:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.SocketTimeoutException: connect timed out}}, {address=<cluster_name>-shard-00-01-pri.crum0.gcp.mongodb.net:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.SocketTimeoutException: connect timed out}}, {address=<cluster_new>-shard-00-02-pri.crum0.gcp.mongodb.net:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.SocketTimeoutException: connect timed out}}]
可能的问题:
1) is it possible to connect from a GCP cluster at all (or perhaps, why is this cluster somehow not part of default VPC network)?
2) is there something wrong in the Atlas CIDR range or my IP whitelist range?
如有任何帮助,我们将不胜感激。
我猜你要么应该使用 split horizon 设置,要么你没有从你的应用程序连接到副本集配置中使用的 hostnames/IP 地址。
Atlas 端的白名单应反映您的应用程序用于连接的 IP,如 Atlas 所示。
我最终进行了 2 处更改以使其正常工作。第一个更改是我缺少的明确要求。不确定是否绝对有必要进行第二次更改。
1)
我必须创建一个新的 GCP 集群,并且在其中默认启用 VPC-native(启用 IP 别名)。在我的旧集群中,此设置被禁用,我无法为 运行 集群更改它。此设置肯定需要打开,以解决问题。
2)
虽然我使用的是 Mongo Java 驱动程序 3.11.1,但我确实使用了 nslookup
命令并认为使用旧驱动程序样式的连接 URI 字符串(即 mongodb://<username>:<password>@<cluster_name>-shard-00-00-pri.crum0.gcp.mongodb.net:27017,<cluster_name>-shard-00-01-pri.crum0.gcp.mongodb.net:27017,<cluster_name>-shard-00-02-pri.crum0.gcp.mongodb.net:27017/itls?ssl=true&replicaSet=<cluster_name>-shard-0&authSource=admin&retryWrites=true&w=majority
), 因为 nslookup
实际上为旧样式提供了真实的 IP 地址,而不是新的。
nslookup
个有用的命令:
>> nslookup <cluster_name>-shard-00-00-pri.crum0.gcp.mongodb.net
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: <cluster_name>-shard-00-00-pri.crum0.gcp.mongodb.net
Address: 192.168.248.2
>> nslookup <cluster_name>-pri.crum0.gcp.mongodb.net
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
*** Can't find <cluster_name>-pri.crum0.gcp.mongodb.net: No answer
除了上面 的答案外,我还必须在 GKE 的 Mongo Atlas Pod address range
上加入白名单。
我正在尝试将 GCP Kubernetes 引擎集群上的 Java 应用 运行 与 Mongo Atlas 集群 (M20) 连接起来。以前,当我没有打开 VPC 对等连接并且我使用的是常规连接字符串时,它运行良好。但我现在正在尝试使用 VPC 对等连接,在我的 GCP 项目中使用 default
VPC 网络。我按照 https://docs.atlas.mongodb.com/security-vpc-peering/ 中的步骤操作。我选择的Atlas CIDR为192.168.0.0/18 (b/c "The Atlas CIDR block must be at least a /18"),将GCP项目与Atlas集群对接后,将10.128.0.0/9添加到Atlas集群的IP白名单中(b/c 它说这是 GCP 项目中 auto 的默认范围。
我实际上可以通过 Mongo shell 通过 mongo "mongodb+srv://<cluster_name>-pri.crum0.gcp.mongodb.net/itls"
从我的 GCP 项目中的其他虚拟机进行连接。但是我的 GCP 集群中某个 pod 上的应用 运行 无法连接。我在 Java 应用程序中看到的确切错误是
Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches com.mongodb.client.internal.MongoClientDelegate@a07fbd8. Client view of cluster state is {type=REPLICA_SET, servers=[{address=<cluster_name>-shard-00-00-pri.crum0.gcp.mongodb.net:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.SocketTimeoutException: connect timed out}}, {address=<cluster_name>-shard-00-01-pri.crum0.gcp.mongodb.net:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.SocketTimeoutException: connect timed out}}, {address=<cluster_new>-shard-00-02-pri.crum0.gcp.mongodb.net:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.SocketTimeoutException: connect timed out}}]
可能的问题:
1) is it possible to connect from a GCP cluster at all (or perhaps, why is this cluster somehow not part of default VPC network)?
2) is there something wrong in the Atlas CIDR range or my IP whitelist range?
如有任何帮助,我们将不胜感激。
我猜你要么应该使用 split horizon 设置,要么你没有从你的应用程序连接到副本集配置中使用的 hostnames/IP 地址。
Atlas 端的白名单应反映您的应用程序用于连接的 IP,如 Atlas 所示。
我最终进行了 2 处更改以使其正常工作。第一个更改是我缺少的明确要求。不确定是否绝对有必要进行第二次更改。
1) 我必须创建一个新的 GCP 集群,并且在其中默认启用 VPC-native(启用 IP 别名)。在我的旧集群中,此设置被禁用,我无法为 运行 集群更改它。此设置肯定需要打开,以解决问题。
2)
虽然我使用的是 Mongo Java 驱动程序 3.11.1,但我确实使用了 nslookup
命令并认为使用旧驱动程序样式的连接 URI 字符串(即 mongodb://<username>:<password>@<cluster_name>-shard-00-00-pri.crum0.gcp.mongodb.net:27017,<cluster_name>-shard-00-01-pri.crum0.gcp.mongodb.net:27017,<cluster_name>-shard-00-02-pri.crum0.gcp.mongodb.net:27017/itls?ssl=true&replicaSet=<cluster_name>-shard-0&authSource=admin&retryWrites=true&w=majority
), 因为 nslookup
实际上为旧样式提供了真实的 IP 地址,而不是新的。
nslookup
个有用的命令:
>> nslookup <cluster_name>-shard-00-00-pri.crum0.gcp.mongodb.net
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: <cluster_name>-shard-00-00-pri.crum0.gcp.mongodb.net
Address: 192.168.248.2
>> nslookup <cluster_name>-pri.crum0.gcp.mongodb.net
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
*** Can't find <cluster_name>-pri.crum0.gcp.mongodb.net: No answer
除了上面 Pod address range
上加入白名单。