Не удается подключиться к репликатору mongodb через kubectl port-forward
Я пытаюсь получить доступ к репликацию mongodb через kubectl, поэтому я не буду выставлять его в Интернет, я не могу использовать OpenVPN, так как Calico блокирует его.
Итак, я использую этот скрипт:
export MONGO_POD_NAME1=$(kubectl get pods --namespace develop -l "app=mongodb-replicaset" -o jsonpath="{.items[0].metadata.name}")
export MONGO_POD_NAME2=$(kubectl get pods --namespace develop -l "app=mongodb-replicaset" -o jsonpath="{.items[1].metadata.name}")
export MONGO_POD_NAME3=$(kubectl get pods --namespace develop -l "app=mongodb-replicaset" -o jsonpath="{.items[2].metadata.name}")
echo $MONGO_POD_NAME1, $MONGO_POD_NAME2, $MONGO_POD_NAME3
kubectl port-forward --namespace develop $MONGO_POD_NAME1 27020:27017 & p3=$!
kubectl port-forward --namespace develop $MONGO_POD_NAME2 27021:27017 & p4=$!
kubectl port-forward --namespace develop $MONGO_POD_NAME3 27022:27017 & p5=$!
wait -n
[ "$?" -gt 1 ] || kill "$p3" "$p4" "$p5"
wait
И моя строка подключения выглядит так:
mongodb://LOGIN:PW@localhost:27020,localhost:27021,localhost:27022/animedb?replicaSet=rs0
Тем не менее, я все еще не могу подключиться к своему репликасу mongodb, он говорит:
connection error: { MongoNetworkError: failed to connect to server
[anime-data-develop-mongodb-replicaset-0.anime-data-develop-mongodb-replicaset.develop.svc.cluster.local:27017]
on first connect [MongoNetworkError: getaddrinfo ENOTFOUND
anime-data-develop-mongodb-replicaset-0.anime-data-develop-mongodb-replicaset.develop.svc.cluster.local
anime-data-develop-mongodb-replicaset-0.anime-data-develop-mongodb-replicaset.develop.svc.cluster.local:27017]
Но если я использую прямое соединение, я все еще могу подключиться к каждому узлу!
В чем может быть проблема здесь? Как я могу подключиться к mongodb для разработки?
0 ответов
Переадресация портов заставит локальный порт на вашем компьютере перенаправлять (пересылать) трафик на какой-либо модуль. В вашем случае вы попросили Kubernetes перенаправить трафик на 127.0.0.1:27020 на порт 27017 вашего пода.
Проблема возникает из-за того, что конфигурация Replica Set указывает на другие узлы, использующие IP-адреса вашего внутреннего кластера, поэтому вы увидите что-то вроде [ReplicaSetMonitor-TaskExecutor] changing hosts to rs0/<ClusterIP-1>:27017,<ClusterIP-2>:27017,<ClusterIP-3>:27017 from rs/localhost:27020,localhost:27021,localhost:27022
на вашем клиентском сеансе mongo, и, конечно, ваша машина не может получить доступ к IP-адресам вашего кластера.
В целях разработки вам нужно будет подключиться только к вашему основному узлу Mongo (как в mongodb://localhost:27020/animedb
), который будет реплицировать ваши данные во вторичные. Это достаточно безопасно для разработки / отладки, но не подходит для производства!
Если вам нужно настроить его для постоянного / производственного доступа, вам следует обновить настройки ReplicaSet, чтобы они находили друг друга, используя общедоступные IP-адреса или имена хостов, см. https://docs.mongodb.com/manual/tutorial/change-hostnames-in-a-replica-set/.