【问题标题】:Node.js application fails to connect to MongoDB Docker container using KubernetesNode.js 应用程序无法使用 Kubernetes 连接到 MongoDB Docker 容器
【发布时间】:2018-07-20 14:28:05
【问题描述】:

我在多容器 Kubernetes pod 中遇到 ENOTFOUND 错误。 MongoDB 在一个 Docker 容器中并且似乎完全可以运行,而 Node.js 应用程序在另一个容器中(请参阅下面的错误)。

/opt/systran/apps-node/enterprise-server/node_modules/mongoose/node_modules/mongodb/lib/replset.js:365
          process.nextTick(function() { throw err; })
                                        ^
MongoError:第一次连接时无法连接到服务器 [mongodb:27017] [MongoError: getaddrinfo ENOTFOUND mongodb mongodb:27017]
    在游泳池。 (/opt/systran/apps-node/enterprise-server/node_modules/mongodb-core/lib/topologies/server.js:336:35)
    在 emitOne (events.js:116:13)
    在 Pool.emit (events.js:211:7)
    在连接处。 (/opt/systran/apps-node/enterprise-server/node_modules/mongodb-core/lib/connection/pool.js:280:12)
    在 Object.onceWrapper (events.js:317:30)
    在 emitTwo (events.js:126:13)
    在 Connection.emit (events.js:214:7)
    在套接字。 (/opt/systran/apps-node/enterprise-server/node_modules/mongodb-core/lib/connection/connection.js:189:49)
    在 Object.onceWrapper (events.js:315:30)
    在 emitOne (events.js:116:13)
    在 Socket.emit (events.js:211:7)
    在 emitErrorNT (internal/streams/destroy.js:64:8)
    在 _combinedTickCallback (内部/进程/next_tick.js:138:11)
    在 process._tickCallback (internal/process/next_tick.js:180:9)

在应用程序容器中我可以执行以下操作,所以它似乎知道 MongoDB 在端口 27017 上可用。

curl "http://localhost:27017"
看起来您正试图在本机驱动程序端口上通过 HTTP 访问 MongoDB。

该应用程序旨在在 MongoDB 中创建数据库并填充集合。使用 docker-compose.yml 文件,这组 Docker 容器可以很好地与 Docker 配合使用。这些容器是遗留应用程序的一部分(同一个 pod 中还有其他容器),我对它们的内容没有太多控制权。

我检查了各种容器的日志。已使用“kubectl get pods”查看了所有库存 pod,并且一切正常。 CNI 使用“flannel”,所以使用下面的代码来初始化 Kubernetes。

kubeadm init --pod-network-cidr=10.244.0.0/16

【问题讨论】:

  • 你会尝试curl http://mongodb:27017 来查看输出吗?应用程序和 mongodb 是否在同一个 pod 中?

标签: mongodb docker kubernetes


【解决方案1】:

根据错误输出,您的 NodeJS 应用程序尝试通过 mongodb:27017 连接到 MongoDB 数据库。

由于 NodeJS 应用程序和 MongoDB 数据库都是同一个 pod 的容器,因此 NodeJS 应用程序应该通过 localhost:27017 连接到 MongoDB 数据库,因为 pod 中的容器共享存储/网络资源。

因此,您需要更改 NodeJS 应用程序的配置:将连接设置为 MongoDB localhost:27017 而不是 mongodb:27017

【讨论】:

  • 是的。那是切换到“localhost:27017”而不是“mongodb:27017”的解决方案。现在可以看到 MongoDB 容器和同一个 pod 中的其他应用程序容器之间的连接。
  • 很高兴听到这个消息!那么请批准答案。
  • 嗨,我需要帮助解决几乎类似的问题:stackoverflow.com/questions/65870380/…
猜你喜欢
  • 2019-05-24
  • 2019-10-17
  • 2021-10-25
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 2020-12-23
  • 2017-04-11
  • 2019-07-30
相关资源
最近更新 更多