1

我正在尝试将在 GCP Kubernetes 引擎集群上运行的 Java 应用程序与 Mongo Atlas 集群(M20)连接起来。之前,当我没有打开 VPC 对等互连并且我使用的是常规连接字符串时,它运行良好。但我现在正在尝试使用 VPC 对等互连,并default在我的 GCP 项目中使用 VPC 网络。我按照https://docs.atlas.mongodb.com/security-vpc-peering/中的步骤操作。我选择了192.168.0.0/18的Atlas CIDR(b/c“The Atlas CIDR block must be at least a /18”),将GCP项目和Atlas集群链接后,将10.128.0.0/9加入IP白名单对于 Atlas 集群(b/c 它说这是 GCP 项目中 auto 的默认范围)。

我实际上可以通过 Mongo shell via mongo "mongodb+srv://<cluster_name>-pri.crum0.gcp.mongodb.net/itls",从我的 GCP 项目中的其他一些 VM 进行连接。但是在我的 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$1@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?

任何帮助,将不胜感激。

4

3 回答 3

2

我最终进行了 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
于 2020-06-10T19:16:55.547 回答
0

我猜你要么应该使用水平分割设置,要么你的应用程序没有连接到副本集配置中使用的主机名/IP 地址。

Atlas 端的白名单应反映应用程序用于连接的 IP,如 Atlas 所示。

于 2020-06-09T06:57:41.553 回答
0

除了上面user1145925Pod address range的回答外,我还必须将GKE的 Mongo Atlas 列入白名单。

于 2020-07-14T10:14:33.520 回答