mongodb - 从 Kubernetes 集群连接到 MongoDB Droplet
问题描述
我有一个 Kubernetes 集群,其中包含一些部署和一个在 DigitalOcean 上运行的 LoadBalancer 服务,我需要连接到一个 MongoDB,该 MongoDB在集群外部运行的 droplet 中,但也在 DigitalOcean 上。
我已经允许在 MongoDB 机器上从 LoadBalancer 服务生成的外部 IP 连接到 27017 端口,但是,从 Kubernetes 到 mongo 的连接请求似乎不是使用此 IP 进行的,在部署我的应用程序时会导致以下警告(这使得 Pod 永远重启)。
ConnectionError: Mongodb connection failed after 1 attempts with message: connection timed out
at /usr/app/node_modules/@nindoo/mongodb-data-layer/dist/connections/mongodb.js:38:23
at Generator.throw (<anonymous>)
at rejected (/usr/app/node_modules/@nindoo/mongodb-data-layer/dist/connections/mongodb.js:6:65)
当我在本地运行我的应用程序时,连接工作得很好(因为我将本地机器公共 IP 添加到 MongoDB 小滴上的防火墙设置中)。出于安全原因,我不想允许来自“任何地方”的请求。
可以做我想做的事,还是应该在 Kubernetes 集群中部署 mongo?
我正在使用 Kubernetes v1.18.3
编辑:
我正在使用@nindoo/mongodb-data-layer npm 包连接到 mongo。这是我公司团队创建的一个包,它实现了一个createConnection
将配置对象作为参数的函数:
import { createConnection } from '@nindoo/mongodb-data-layer'
const config = {
database: {
mongodb: {
uri: env.get('DATABASE_MONGODB_URI', 'mongodb://<droplet_ip>:27017/'),
dbName: env.get('DATABASE_MONGODB_DBNAME', '<database_name>'),
maximumConnectionAttempts: 1,
options: {
authSource: '<authenticationDatabase>',
auth: {
user: '<admin_user>',
password: '<admin_password>',
}
}
}
}
}
const mongodbConnection = await createConnection(config.database.mongodb)
解决方案
k8s 应用程序的 Egress IP 与您的 LoadBalancer IP 不同。确认进入吊舱并运行curl -s checkip.dyndns.org
。这将为您提供 Egress IP 。您可以在防火墙中允许此操作并正常工作。
理想的方法是固定 Egress IP 并且 Digital Ocean 不支持这里的博客。您可以跟进 Digital Ocean。
您还可以根据需要使用 Cloud NAT 来修复 Egress IP。
推荐阅读
- javascript - 如何使作用于svg组的随机颜色函数为组中的所有元素调用相同的颜色
- r - 如何在 ifelse 语句中只获得一次迭代
- python - 添加新的 Django 应用程序 - 找不到 404 页面
- c++ - 如何使用 xyz 坐标创建 3D 图像
- java - 线程“主”java.lang.NoClassDefFoundError 中的异常:com/google/api/services/bigquery/model/TableRow
- angular - Angular Universal应用程序不断加载问题
- c# - 我在 youtube 上看到的代码不起作用。我需要通过在文本框上使用 textchanged 事件来执行 Rowfilter
- java - 我的代码执行,但没有得到任何输出
- python - 如何使用 csv 中的 matplotlib 创建饼图
- pandas - 转置列并将列名用作另一行中的值