kubernetes K8S中的MongoDB ReplicaSet--无法通过端口转发连接

jljoyd4f  于 2023-03-07  发布在  Kubernetes
关注(0)|答案(1)|浏览(174)

我有一个k8s开发集群(在aks中)。我以前使用bitnami图表来部署单个mongoDB pod,我从来没有遇到过以下问题。
由于我现在使用的特性只适用于replicaSet,所以最近我转而使用MongoDBCommunity Operator创建了一个运行在自己的名称空间(在dev中)中的MongoDB replicaSet示例,我的应用程序连接并使用这个示例时完全没有问题,我的新特性工作起来就像做梦一样。

$ k get pods -n db
NAME                                          READY   STATUS    RESTARTS   AGE
mongodb-kubernetes-operator-748c85557-bffz5   1/1     Running   0          2d16h
nga-mongodb-0                                 2/2     Running   0          2d19h

现在我想在vscode中使用MongoDB扩展来帮助调试,这就是问题所在,正如我提到的,使用bitnami图表没有问题--我提供了db连接字符串,它就工作了。
当我尝试对这个新部署执行相同操作时,我得到了以下错误:

getaddrinfo ENOTFOUND nga-mongodb-0.nga-mongodb-svc.db.svc.cluster.local

操作员以2种形式创建包含连接字符串的密码,用于服务和pod,两者都给出相同的错误
服务:

mongodb+srv://username:password@nga-mongodb-svc.db.svc.cluster.local/admin?ssl=false

Pod:

mongodb://username:password@nga-mongodb-0.nga-mongodb-svc.db.svc.cluster.local:27017/admin?ssl=false

我注意到这两个字符串都不包括副本名称,我觉得这很奇怪,但我在应用程序中使用基于svc的字符串,它工作正常,所以在端口转发时应该工作正常。
我的端口转发语句非常基本:

k port-forward -n db nga-mongodb-0 27017:27017

如果我尝试curl localhost:27017,就会得到预期的消息

It looks like you are trying to access MongoDB over HTTP on the native driver port.

这说明我有一个工作的港口转运商。
然后,我使用的连接字符串(假设为pod连接字符串)更改为:

mongodb://username:password@localhost:27017/admin?ssl=false

我怀疑,但不知道,副本集试图将客户端转发到主服务器(如果我使用pod连接字符串,我已经连接到主服务器),并发送一个kubernetes URL,该URL无法通过端口转发方法很好地转换。
有没有人真的能让它工作或者知道怎么让它工作?

dxxyhpgq

dxxyhpgq1#

所以,在写下这个问题并整理我的思路的基础上,我找到了发生这种情况的原因和答案。
我在我的问题中暗示这可能是一个重定向问题,现在我有证据证明这就是问题所在。我已经将以下条目添加到我的hosts文件中:

127.0.0.1       nga-mongodb-0.nga-mongodb-svc.db.svc.cluster.local

现在它可以工作了。MongoDB replicaSet试图将我转发到主服务器(即使我已经连接到主服务器),并且通过返回它所知道的唯一主机来完成,这是非常正确的。通过将该主机名添加到/etc/hosts文件中,我的机器将该名称解析为localhost,然后通过转发连接返回。我实际上还没有使用svc方法尝试过这一点。但我怀疑它会不会起作用,因为我相信它会不断地改变方向。

相关问题