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

10

所以我整个下午都在苦苦挣扎。我完全无法让我的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 Pod 中却不能。我做错了什么?


1
你能否允许所有IP地址被加入白名单,然后再尝试一遍? - Kevin Prasanna R R
似乎没有什么区别,这很合理,因为它似乎是一个DNS错误。如果您从无效的主机连接,Mongoose将会给出一个错误,指出您的IP未被列入白名单。 - Matthew Weeks
3个回答

9

我找到了问题所在,我的Pod DNS没有配置允许外部连接,因此我在我的YML文件中设置 dnsPolicy: Default,因为奇怪的是,默认值并不是Default


1
我使用在AWS上的Kubernetes中的MongoDB Atlas。尽管为了测试目的,您可以启用所有IP地址并进行测试,但以下是生产设置的方法:
  • MongoDB Atlas支持网络对等连接
  • 在“网络访问”下,选择“新对等连接”
  • 对于AWS,必须指定VPC ID、CIDR和Region。对于GCP,应该使用VPC对等连接的标准过程。

所以我已经在Google Cloud平台上设置了所有内容,但似乎无法弄清楚我在使用时应该如何连接我的应用程序。你怎么做? - Matthew Weeks
首先,请验证您的应用程序是否能够从本地 Docker 映像中连接到服务? - Kevin Prasanna R R
好的。您能否在与K8s集群相同的VPC中创建一个临时VM并连接到Atlas?这是为了验证对等连接。 - Kevin Prasanna R R

1

首先,在群集中的节点上部署Pods而不是在您的服务上 (所以Mongo将不会识别您的服务端点 e.g; 负载均衡器IP)。基于此,有两个解决方案:

方案A

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

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

方案B

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

  2. 在您的k8s Pod (或deployment)清单的pod spec下,添加一个dnsPolicy字段,该字段的值设置为ClusterFirstWithHostNet. 由于Pods使用您的主机网络运行,它们可以访问在localhost上侦听的服务。

Kubernetes文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接