我有一个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无法通过端口转发方法很好地转换。
有没有人真的能让它工作或者知道怎么让它工作?
1条答案
按热度按时间dxxyhpgq1#
所以,在写下这个问题并整理我的思路的基础上,我找到了发生这种情况的原因和答案。
我在我的问题中暗示这可能是一个重定向问题,现在我有证据证明这就是问题所在。我已经将以下条目添加到我的hosts文件中:
现在它可以工作了。MongoDB replicaSet试图将我转发到主服务器(即使我已经连接到主服务器),并且通过返回它所知道的唯一主机来完成,这是非常正确的。通过将该主机名添加到
/etc/hosts
文件中,我的机器将该名称解析为localhost,然后通过转发连接返回。我实际上还没有使用svc方法尝试过这一点。但我怀疑它会不会起作用,因为我相信它会不断地改变方向。