Не удается подключиться к Mongo Atlas с помощью пиринга VPC из кластера GCP

Я пытаюсь подключить приложение Java, работающее в кластере движка GCP Kubernetes, с кластером Mongo Atlas (M20). Раньше все работало нормально, когда у меня не был включен VPC Peering и я использовал обычную строку подключения. Но сейчас я пытаюсь использовать пиринг VPC с сетью 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. для кластера Атлас (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?

Любая помощь будет оценена по достоинству.


person user1145925    schedule 09.06.2020    source источник
comment
Можете ли вы выполнить базовые проверки из работающего модуля: узнать имя модуля Java-приложения kubectl get pods, а затем kubectl exec java_pod_name ping <cluster_name>-pri.crum0.gcp.mongodb.net?   -  person mebius99    schedule 10.06.2020
comment
О другой виртуальной машине, которая имеет доступ с помощью оболочки mongo. Какой IP он использует? Кроме того, не могли бы вы запустить Linux-модуль, такой как ubuntu, войти в систему, загрузить оболочку mongo и проверить, можете ли вы подключиться оттуда? таким образом мы можем проверить, является ли это java-приложением или самим кластером.   -  person Will R.O.F.    schedule 10.06.2020
comment
Если вам нужна команда, это: kubectl run -it --rm --generator=run-pod/v1 ubuntu --image=ubuntu -- /bin/bash зарегистрирует вас в оболочке внутри модуля, чтобы вы могли apt-get install и запускать команды оболочки ping и mongo.   -  person Will R.O.F.    schedule 10.06.2020
comment
Просмотрите экспортированные маршруты в настройках сетевого пиринга VPC, а также проверьте, какой IP-адрес подключается к MongoDB, когда действует полный белый список. Подробнее см. developer.mongodb.com/community/forums/t/   -  person Oleksandr Iegorov    schedule 27.01.2021


Ответы (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
person user1145925    schedule 10.06.2020
comment
Включение VPC-native было для меня ключевым моментом. Спасибо за этот ответ - person codependent; 23.12.2020

Я предполагаю, что вам либо следует использовать разделить горизонт, или у вас нет подключения вашего приложения к именам хостов / IP-адресам, используемым в конфигурации набора реплик.

Белый список на стороне Атласа должен отражать IP, который используется для соединений вашим приложением, как видно из Атласа.

person D. SM    schedule 09.06.2020

В дополнение к ответу user1145925 выше, мне также пришлось добавить в белый список Mongo Atlas Pod address range от GKE.

person panos    schedule 14.07.2020