从Kubernetes集群连接到MongoDB Droplet

时间:2020-07-30 11:57:01

标签: mongodb kubernetes digital-ocean

我有一个带有一些部署的Kubernetes集群,并且在DigitalOcean上运行了LoadBalancer服务,我需要连接到一个在集群中外部且也在DigitalOcean上运行的液滴中的MongoDB。

我已允许从LoadBalancer服务生成的外部IP在MongoDB机器上连接到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)

当我在本地运行我的应用程序时,连接工作正常(因为我将本地计算机公用IP添加到了MongoDB Drop上的防火墙设置中)。出于安全原因,我不想允许来自“任何地方” 的请求。

可以做我想做的还是应该在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)

1 个答案:

答案 0 :(得分:0)

k8s应用程序的出口IP与您的LoadBalancer IP不同。确认进入吊舱并运行curl -s checkip.dyndns.org。这将为您提供出口IP。您可以在防火墙中允许它工作。

理想的方法是固定出口IP,并且博客here不支持Digital Ocean。您可以使用Digital Ocean进行后续操作。

您还可以根据需要使用Cloud NAT修复出口IP。