我仅使用基本mongo:3.6.4官方docker映像创建了Mongo容器,并将其部署到了我的OpenShift OKD集群,但是无法从集群外部使用Mongo客户端连接到此MongoDB实例。
我可以在http://mongodb.my.domain处访问pod并成功获得“看来您正在尝试通过本机驱动程序端口上的HTTP访问MongoDB”。信息。
使用Pod上的终端时,我可以使用以下命令成功登录: mongo“ mongodb:// mongoadmin:pass @ localhost” --authenticationDatabase管理员
但是当尝试从外部OKD连接时,连接失败。
我的客户端需要通过代理才能访问OKD吊舱,并且我确实具有.der证书文件,但不确定是否与问题有关。
我尝试过的一些命令:
mongo“ mongodb:// mongoadmin:pass@mongodb.my.domain:80” --authenticationDatabase管理员
mongo --ssl“ mongodb:// mongoadmin:pass@mongodb.my.domain:80” --authenticationDatabase管理员
我希望能够成功连接,但会收到以下错误消息:
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群集上的某些代理设置是否有问题。任何帮助将不胜感激。
答案 0 :(得分:1)
这里的问题是外部OpenShift路由不能很好地处理数据库连接。当您尝试通过路由连接到Mongo Pod时,路由将接受该连接并将您的连接传输到Mongo服务。我认为此传输将连接包装在HTTP包装器中,而Mongo不喜欢处理。 OKD documentation强调基于路径的路由流量应基于HTTP,这将导致连接失败。
当您尝试连接到MongoDB数据库时,您会看到这一点的证据,并且返回“看来您正在尝试通过本机驱动程序端口上的HTTP访问MongoDB”。浏览器。用户relief.malone对此进行了解释,并在their answer to this question中提出了几种解决方案/解决方法。
要添加到relief.malone的答案,我建议您从MongoDB pod移植到本地计算机以进行开发/调试。在生产中,您可以将应用程序部署到通过其内部 DNS名称引用MongoDB服务的OKD,该名称将类似于以下内容:mongodb.project_namespace.svc:27017
。这样,您将避免路由干扰连接。
有关端口转发isn't that informative的Openshift OKD文档,但是,由于oc
在后台运行kubectl
命令,因此您可以阅读this Kubernetes guide以获得更多信息。