簡體   English   中英

Kubernetes node.js 容器無法連接到 MongoDB Atlas

[英]Kubernetes node.js container cannot connect to 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 pod。 我究竟做錯了什么?

我發現了這個問題,我的 pod DNS 沒有配置為允許外部連接,所以我在我的 YML 中設置了dnsPolicy: Default ,因為奇怪的是Default實際上並不是默認值

我使用來自 Kubernetes 但在 AWS 上的 MongoDB Atlas。 盡管出於測試目的,您可以啟用所有 IP 地址並進行測試,但以下是生產設置的方法:

  • MongoDB Atlas 支持網絡對等互連
  • 在網絡訪問 > 新建對等連接下
  • 對於 AWS,必須指定 VPC ID、CIDR 和區域。 對於 GCP,它應該是用於 VPC 對等的標准程序。

首先,Pod 部署在集群中的節點上,而不是部署在您的服務上(因此 Mongo 不會識別您的服務端點,例如;負載均衡器 IP )。 基於此,有兩種解決方案:

溶液A

  1. 將Kubernetes集群的端點加入MongoDB網絡訪問IP白名單。

  2. 在 k8s pod(或部署)清單的 pod 規范下,添加一個dnsPolicy字段,其值設置為Default 因此,您的 Pod(基本上是您的容器)將通過主節點的名稱解析配置連接到 mongo。

溶液B

  1. 將您的 k8s 集群中的所有節點端點添加到 MongoDB 網絡訪問 IP 白名單。

  2. 在 k8s pod(或部署)清單的 pod 規范下,添加一個dnsPolicy字段,其值設置為ClusterFirstWithHostNet 由於 pod 與您的主機網絡一起運行,因此它們可以訪問在 localhost 上偵聽的服務。

Kubernetes 文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM