Не удается подключиться к Mongo Atlas с помощью пиринга VPC из кластера GCP
Я пытаюсь подключить Java-приложение, работающее в кластере движка GCP Kubernetes, с кластером Mongo Atlas (M20). Раньше все работало нормально, когда у меня не был включен VPC Peering и я использовал обычную строку подключения. Но сейчас я пытаюсь использовать VPC Peering сdefault
Сеть VPC в моем проекте GCP. Я выполнил шаги https://docs.atlas.mongodb.com/security-vpc-peering/. Я выбрал Atlas CIDR 192.168.0.0/18 (b/c "Блок Atlas CIDR должен быть не менее a /18") и после связывания проекта GCP и кластера Atlas добавил 10.128.0.0/9 в белый список IP. для кластера Atlas (b / c он говорит, что это диапазон по умолчанию для auto в проектах GCP).
Я действительно могу подключиться через оболочку Mongo через mongo "mongodb+srv://<cluster_name>-pri.crum0.gcp.mongodb.net/itls"
из другой виртуальной машины в моем проекте GCP. Но приложение, работающее на модуле в моем кластере GCP, не может подключиться. Точная ошибка, которую я вижу в приложении 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?
Любая помощь будет оценена.
3 ответа
В итоге я внес 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
Я предполагаю, что вам либо следует использовать настройку с разделением горизонта, либо у вас нет подключения вашего приложения к именам хостов /IP-адресам, используемым в конфигурации набора реплик.
Белый список на стороне Атласа должен отражать IP, который используется для соединений вашим приложением, как видно из Атласа.