如何在Kubernetes集群中公开MongoDB副本集的远程连接



我在Kubernetes集群中部署了一个MongoDB副本集。MongoDB副本集可以在集群内部ClusterIP的帮助下轻松连接。我甚至把它连接到我的mongo express客户端。

//Successfull and working fine internally
mongodb://db-mongodb-0.mycompany-mongodb-headless:27017/db

但我必须为本地测试和其他服务建立远程连接。我使用的是Bitnami提供的MongoDB helm图表。我为我的复制集30001和30002打开了一个NodePort。

我第一次尝试建立远程连接是:

尝试连接以前打开的NodePort。我目前正在使用Mongoose客户端。我的两个复制副本集的可用节点端口是-30001、30002。

//Unsuccessful
mongoose
.connect(
`mongodb://username:password@<EXTERNAL_IP>:30001,<EXTERNAL_IP>:30002/mydb`,
{
useNewUrlParser: true,
useUnifiedTopology: true,
}
)

然后我的第二次尝试是

我尝试了端口转发,并尝试像这样连接到我的本地主机-

kubectl port-forward svc/database-mongodb-0-external 27017:27017

然后我试图建立这样的连接,但也失败了

//Unsuccessful 
//MongoError: Authentication failed.
mongodb://username:password@localhost:27017/database

我试过了?在这两种情况下,replicaSet=rs0查询参数。但运气不好。

我没有试着打开LoadBalancer。有没有办法用我的Ingress Nginx控制器建立到我的MongoDB服务的远程连接?我不知道这是否可能,但我试图将我的无头服务转发到子域。但这个子域是说-看起来你正试图在本地驱动程序端口上通过HTTP访问MongoDB。我不确定这是否可能!

但最后,我唯一的问题是,我如何与在Kubernetes集群中设置的MongoDB副本集建立或公开远程连接?

我最新的Bitnami/Mongodb值是

architecture: replicaset
auth:
rootPassword: 12341234
username: abcd
password: 1234234
database: abcd
replicaSetKey: abcd
persistence:
enabled: true
size: 3Gi
externalAccess:
enabled: true
autoDiscovery:
enabled: true
service:
type: NodePort
nodePorts: ['30001', '30002']
rbac:
create: true

如果我理解正确,您希望向远程连接公开MongoDB复制集。

我正在积极使用Bitnami MongoDB掌舵图,我可以使用您的第一次尝试将本地轻松连接到掌舵图:

  1. I端口转发映射端口的无头服务27017:27017
  2. 我只是使用用户名和密码连接到localhost,与我的连接字符串的唯一区别是我没有指定数据库:mongodb://<user>:<password>@localhost:27017

要回答您的最后一个问题,您需要在官方文档页面中查找,helm图表中很少有值可以显示您的mongodb:

  • service.type=LoadBalancer
  • externalAccess.enabled=true
  • externalAccess.autoDiscovery.enabled

您可以使用这些变量来找到远程公开MongoDB的最合适方法。

请注意,如果您将LoadBalancer和autoDiscovery设置为启用,则需要确保您的k8s集群前面有LoadBalancers(如果是Amazon EKS,则为ELB(。如果您使用云管理的kubernetes服务,请不要担心最后一点,因为您将拥有开箱即用的功能。

要从K8s集群外部访问作为复制集部署的MongoDB,需要为每个pod部署一个服务。我建议您阅读文档的这一部分,以了解拓扑结构:https://github.com/bitnami/charts/tree/master/bitnami/mongodb#architecture

要部署它,您可以按照以下步骤操作:https://github.com/bitnami/charts/tree/master/bitnami/mongodb#replicaset-从集群外部访问mongodb节点

我没有尝试打开LoadBalancer。有没有办法用我的Ingress Nginx控制器建立到MongoDB服务的远程连接?我不知道这是否可能,但我试图将我的无头服务转发到子域。但这个子域是这样说的——看起来你正试图在本地驱动程序端口上通过HTTP访问MongoDB。我不确定这是否可能!

关于这一点,这是不可能的,因为Ingress只提供HTTP流量,而MongoDB不通过HTTP 操作

最新更新