无法通过kubectl端口转发连接到mongodb副本集

时间:2019-02-28 12:01:26

标签: mongodb kubernetes google-kubernetes-engine kubectl project-calico

我正试图通过kubectl访问mongodb副本集,所以我不会将其公开给互联网,因为Calico会阻止它,所以我无法使用OpenVPN。

所以我正在使用此脚本:

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进行开发?

1 个答案:

答案 0 :(得分:0)

端口转发将在您的计算机上建立本地端口重定向(转发)交通到某个吊舱。在您的情况下,您已要求Kubernetes将127.0.0.1:27020上的流量转发到pod的27017端口。

之所以会发生此问题,是因为副本集配置使用内部群集IP指向其他节点,因此在mongo客户端会话上您会看到类似[ReplicaSetMonitor-TaskExecutor] changing hosts to rs0/<ClusterIP-1>:27017,<ClusterIP-2>:27017,<ClusterIP-3>:27017 from rs/localhost:27020,localhost:27021,localhost:27022的信息,并且您的计算机无法访问群集的IP,当然。

出于开发目的,您仅需连接到主Mongo节点(如mongodb://localhost:27020/animedb中所述),它将把数据复制到辅助节点中。对于开发/调试来说,这是足够安全的,但是不适合生产!

如果您需要将其设置为永久/生产访问权限,则应更新您的plicateSet设置,以使它们使用公共IP或主机名相互查找,请参见https://docs.mongodb.com/manual/tutorial/change-hostnames-in-a-replica-set/