从 Kubernetes 集群连接到 MongoDB Droplet
Connecting to MongoDB Droplet from Kubernetes Cluster
我在 DigitalOcean 上有一个带有一些部署和 LoadBalancer 服务 运行 的 Kubernetes 集群,我需要连接到一个 MongoDB 中的一个 运行 在集群之外,也在DigitalOcean上。
我已经在 MongoDB 机器上允许从 LoadBalancer 服务生成的外部 IP 连接到 27017 端口,但是,似乎从 Kubernetes 到 mongo 的连接请求不是使用此 IP,在部署我的应用程序时导致以下警告(这使得 Pods 永远重启)。
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)
当我在本地 运行 我的应用程序时,连接工作正常(因为我将我的本地计算机 public IP 添加到 MongoDB droplet 的防火墙设置中)。出于安全原因,我不想允许来自 "Anywhere" 的请求。
可以做我想做的事还是应该在 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 不同。确认进入 pod 和 运行 curl -s checkip.dyndns.org
。这将为您提供 Egress IP 。你可以在你的防火墙中允许它并工作。
理想的方法是固定出口 IP,根据博客 here,Digital Ocean 不支持。您可以跟进 Digital Ocean 同样的事情。
您也可以根据需要使用 Cloud NAT 来固定出口 IP。
我在 DigitalOcean 上有一个带有一些部署和 LoadBalancer 服务 运行 的 Kubernetes 集群,我需要连接到一个 MongoDB 中的一个 运行 在集群之外,也在DigitalOcean上。
我已经在 MongoDB 机器上允许从 LoadBalancer 服务生成的外部 IP 连接到 27017 端口,但是,似乎从 Kubernetes 到 mongo 的连接请求不是使用此 IP,在部署我的应用程序时导致以下警告(这使得 Pods 永远重启)。
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)
当我在本地 运行 我的应用程序时,连接工作正常(因为我将我的本地计算机 public IP 添加到 MongoDB droplet 的防火墙设置中)。出于安全原因,我不想允许来自 "Anywhere" 的请求。
可以做我想做的事还是应该在 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 不同。确认进入 pod 和 运行 curl -s checkip.dyndns.org
。这将为您提供 Egress IP 。你可以在你的防火墙中允许它并工作。
理想的方法是固定出口 IP,根据博客 here,Digital Ocean 不支持。您可以跟进 Digital Ocean 同样的事情。
您也可以根据需要使用 Cloud NAT 来固定出口 IP。