【问题标题】:MongoDB ReplicaSet in K8S -- can't connect via port forwardK8S 中的 MongoDB ReplicaSet -- 无法通过端口转发连接
【发布时间】:2022-08-08 17:53:39
【问题描述】:

我有一个 k8s 开发集群(在 aks 中)。我之前使用 bitnami 图表来部署单个 MongoDB pod,但我从未遇到过以下问题。

由于我现在使用的功能仅适用于副本集,因此我最近开始使用 MongoDBCommunity Operator 来创建在其自己的命名空间(在 dev 中)运行的单实例 MongoDB 副本集。我的应用程序正在毫无问题地连接和使用这个实例,我的新功能就像做梦一样。

$ 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

荚:

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通过端口转发方法。所以,我怀疑这是运营商所做的奇怪的事情。

有没有其他人真正得到这个工作或知道如何让它工作?

  • 很抱歉来自 SO 的奇怪的代码突出显示:)
  • spring.data.mongodb.uri=mongodb://mongo-service:27017/test 我在 sprint 和 mongodb 中使用的是什么,它在有状态的情况下运行良好,你使用的是 operator 吗?
  • @HarshManvar - 您的机器如何解析“mongo-service”主机?此外,这不是连接问题——它工作正常,这是一个副本集 => 端口转发问题。
  • 哦,好吧,我正在尝试在同一个 k8s 集群上运行服务,以便它可以轻松解决,但是我没有尝试将端口转发到副本。

标签: mongodb kubernetes portforwarding replicaset mongodb-replica-set


【解决方案1】:

因此,基于写下问题并组织我的想法,我找到了发生这种情况的原因和答案。

我在我的问题中建议这可能是一个重定向问题,现在我有证据证明这是问题所在。我已将以下条目添加到我的主机文件中:

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

现在它起作用了。因此,MongoDB 副本集试图将我转发到主服务器(即使我已经连接到主服务器),并且这样做是通过返回它知道的唯一主机来实现的,这是非常正确的。通过将该主机名添加到/etc/hosts 文件,我的机器将名称解析为本地主机并通过转发连接返回。我实际上并没有用 svc 方法尝试过这个,但我怀疑它会起作用,因为我相信它会不断重定向。

【讨论】:

  • 嗨,我正在尝试使用 MongoDBCommunity 运算符,但是当在 vs 代码中编辑 yaml 文件以使用它时,apiVersion 和 kind 参数都会被下划线并且错误消息是 This apiVersion and/or kind does not reference a schema known by Cloud Code. Please ensure you are using a valid apiVersion and kind. 所以我想我没有正确安装它。 . 你用的是 kubectl 还是 helm?我在这里开了一个问题stackoverflow.com/questions/73154993/…你能看一下吗?非常感谢 :)
猜你喜欢
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2014-10-24
  • 2018-07-01
  • 2021-08-24
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多