Kubernetes node.js容器无法连接到MongoDB Atlas

时间:2019-05-31 22:48:35

标签: node.js mongodb mongoose kubernetes mongodb-atlas

所以我整个下午都在苦苦挣扎。我根本无法让我的NodeJS应用程序在kubernetes上运行以连接到MongoDB Atlas数据库。

在我的应用程序中,我尝试运行mongoose.connect('mongodb+srv://admin:<password>@<project>.gcp.mongodb.net/project_prod?retryWrites=true&w=majority', { useNewUrlParser: true })

但是我只是得到了错误

UnhandledPromiseRejectionWarning: Error: querySrv ETIMEOUT _mongodb._tcp.<project>.gcp.mongodb.net
    at QueryReqWrap.onresolve [as oncomplete] (dns.js:196:19)
(node:32) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 17)

我也尝试过设置ExternalName服务,但是使用URL或ExternalName导致我无法连接到数据库。

我已经在MongoDB Atlas上将我的IP列入了白名单,所以我知道这不是问题。

它似乎也可以在我的本地机器上运行,但不能在kubernetes主机中使用。我在做什么错了?

3 个答案:

答案 0 :(得分:2)

我发现了问题,我的pod DNS未配置为允许外部连接,因此我在YML中设置了dnsPolicy: Default

答案 1 :(得分:1)

首先,将Pod部署在群集中的节点上,而不是部署在您的服务上(,因此Mongo无法识别您的服务端点例如;负载均衡器IP )。基于此,有两种解决方案:

解决方案A

  1. 将Kubernetes集群的端点添加到MongoDB网络访问IP白名单。

  2. 在您的k8s pod(或部署)清单的pod规范下,添加一个 dnsPolicy 字段,其值设置为 Default 。因此,您的Pods(基本上是您的容器)将通过主节点的名称解析配置连接到mongo。

解决方案B

  1. 将k8s集群中的所有节点端点添加到MongoDB网络访问IP白名单。

  2. 在您的k8s pod(或部署)清单的pod规范下,添加一个 dnsPolicy 字段,其值设置为 ClusterFirstWithHostNet 。由于Pod与您的主机网络一起运行,因此它们可以访问监听localhost的服务。

Kubernetes documentation

答案 2 :(得分:0)

我在Kubernetes上使用MongoDB Atlas,但在AWS上。尽管出于测试目的,您可以启用所有IP地址并进行测试,但这是用于生产设置的方法:

  • MongoDB Atlas支持网络对等
  • 在网络访问下>新对等连接
  • 对于AWS,必须指定VPC ID,CIDR和区域。对于GCP,这应该是用于VPC对等的标准过程。