1

我仅使用基本 mongo:3.6.4 官方 docker 映像创建了一个 Mongo 容器,并将其部署到我的 OpenShift OKD 集群,但无法使用集群外部的 Mongo 客户端连接到此 MongoDB 实例。

我可以在http://mongodb.my.domain访问 pod并成功获得“看起来您正试图在本机驱动程序端口上通过 HTTP 访问 MongoDB”。信息。

在 pod 上使用终端时,我可以使用以下命令成功登录:mongo "mongodb://mongoadmin:pass@localhost" --authenticationDatabase admin

但是当尝试从 OKD 外部连接时,连接失败。

我的客户需要通过代理才能访问 OKD pod,我确实有一个 .der 证书文件,但不确定这是否与问题有关。

我尝试过的一些命令:

mongo "mongodb://mongoadmin:pass@mongodb.my.domain:80" --authenticationDatabase admin

mongo --ssl "mongodb://mongoadmin:pass@mongodb.my.domain:80" --authenticationDatabase admin

我希望能够成功连接,但收到此错误消息:

MongoDB shell version v3.4.20
connecting to: mongodb://mongoadmin:pass@mongodb.my.domain:80
2019-05-15T11:32:25.514+0100 I NETWORK  [thread1] recv(): message len 1347703880 is invalid. Min 16 Max: 48000000
2019-05-15T11:32:25.514+0100 E QUERY    [thread1] Error: network error while attempting to run command 'isMaster' on host 'mongodb.my.domain:80'  :
connect@src/mongo/shell/mongo.js:240:13
@(connect):1:6
exception: connect failed

我不确定这是否与我使用 MongoDB 客户端的方式或我的 OKD 集群上的某些代理设置有关。任何帮助,将不胜感激。

4

1 回答 1

2

这里的问题是外部 OpenShift 路由不擅长处理数据库连接。当您尝试通过路由连接到 Mongo pod 时,路由将接受连接并将您的连接传输到 Mongo 服务。我相信这种传输将连接包装在 HTTP 包装器中,Mongo 不喜欢处理这种包装器。OKD 文档强调基于路径的路由流量应该是基于 HTTP 的,这将导致连接失败。

当您尝试连接到 MongoDB 数据库时,您可以看到这方面的证据,它会返回“看起来您正尝试在本机驱动程序端口上通过 HTTP 访问 MongoDB”。到浏览器。用户relief.malone 对此进行了解释,并在他们对这个问题的回答中提出了一些解决方案/解决方法。

为了添加到relief.malone 的答案中,我建议您从MongoDB pod 转发到您的本地机器进行开发/调试。在生产环境中,您可以将应用程序部署到 OKD,该应用程序通过其内部DNS 名称引用 MongoDB 服务,如下所示:mongodb.project_namespace.svc:27017. 这样,您将避免路由干扰连接。

关于端口转发的 Openshift OKD 文档信息量不大,但是,由于在后台oc运行kubectl命令,您可以阅读此 Kubernetes 指南以获取更多信息

于 2019-05-15T13:06:26.500 回答