为什么在尝试连接到 OKD pod 运行 一个简单的 mongo 容器时出现 "message len 1347703880 is invalid. Min 16 Max: 48000000" 错误?
Why do I get an "message len 1347703880 is invalid. Min 16 Max: 48000000" error when trying to connect to an OKD pod running a simple mongo container?
我只使用基础 mongo:3.6.4 官方 docker 映像创建了一个 Mongo 容器并将其部署到我的 OpenShift OKD 集群,但无法连接到此 Mongo数据库实例使用来自集群外部的 Mongo 客户端。
我可以访问 http://mongodb.my.domain 的 pod 并成功获取 "It looks like you are trying to access MongoDB over HTTP on the native driver port." 消息。
使用 pod 上的终端时,我可以使用以下方法成功登录:
mongo "mongodb://mongoadmin:pass@localhost" --authenticationDatabase admin
但是当尝试从 OKD 外部连接时,连接失败。
我的客户端需要通过代理才能访问 OKD pods,我有一个 .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 集群上的某些代理设置有关。任何帮助将不胜感激。
这里的问题是外部 OpenShift 路由不擅长处理数据库连接。当您尝试通过路由连接到 Mongo pod 时,路由将接受连接并将您的连接传输到 Mongo 服务。我相信此传输将连接包装在 HTTP 包装器中,Mongo 不喜欢处理。 OKD documentation 强调基于路径的路由流量应该是基于 HTTP 的,这将导致连接失败。
您可以在尝试连接到 MongoDB 数据库并将其 returns "It looks like you are trying to access MongoDB over HTTP on the native driver port." 连接到浏览器时看到这方面的证据。用户 relief.malone 对此进行了解释,并在 中提出了一些解决方案/解决方法。
要添加到 relief.malone 的答案中,我建议您将 MongoDB pod 转发到本地计算机 development/debugging。在生产中,您可以将应用程序部署到 OKD,通过它的 内部 DNS 名称引用 MongoDB 服务,它看起来像这样:mongodb.project_namespace.svc:27017
。这样您就可以避免路由干扰连接。
有关 port-forwarding isn't that informative, but, since oc
runs the kubectl
command under the hood, you can read this Kubernetes guide 的 Openshift OKD 文档以获取更多信息
我只使用基础 mongo:3.6.4 官方 docker 映像创建了一个 Mongo 容器并将其部署到我的 OpenShift OKD 集群,但无法连接到此 Mongo数据库实例使用来自集群外部的 Mongo 客户端。
我可以访问 http://mongodb.my.domain 的 pod 并成功获取 "It looks like you are trying to access MongoDB over HTTP on the native driver port." 消息。
使用 pod 上的终端时,我可以使用以下方法成功登录: mongo "mongodb://mongoadmin:pass@localhost" --authenticationDatabase admin
但是当尝试从 OKD 外部连接时,连接失败。
我的客户端需要通过代理才能访问 OKD pods,我有一个 .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 集群上的某些代理设置有关。任何帮助将不胜感激。
这里的问题是外部 OpenShift 路由不擅长处理数据库连接。当您尝试通过路由连接到 Mongo pod 时,路由将接受连接并将您的连接传输到 Mongo 服务。我相信此传输将连接包装在 HTTP 包装器中,Mongo 不喜欢处理。 OKD documentation 强调基于路径的路由流量应该是基于 HTTP 的,这将导致连接失败。
您可以在尝试连接到 MongoDB 数据库并将其 returns "It looks like you are trying to access MongoDB over HTTP on the native driver port." 连接到浏览器时看到这方面的证据。用户 relief.malone 对此进行了解释,并在
要添加到 relief.malone 的答案中,我建议您将 MongoDB pod 转发到本地计算机 development/debugging。在生产中,您可以将应用程序部署到 OKD,通过它的 内部 DNS 名称引用 MongoDB 服务,它看起来像这样:mongodb.project_namespace.svc:27017
。这样您就可以避免路由干扰连接。
有关 port-forwarding isn't that informative, but, since oc
runs the kubectl
command under the hood, you can read this Kubernetes guide 的 Openshift OKD 文档以获取更多信息