【问题标题】:Mongo connection URI for statefulSet in K8s, each replica (pod) or the (headless) service?K8s中statefulSet的Mongo连接URI,每个副本(pod)还是(无头)服务?
【发布时间】:2022-01-04 13:29:24
【问题描述】:

我有点不确定 Mongodb statefulset 应用程序的正确连接 URI 是什么。我的集群中运行了三个副本,每个副本都在单独的节点中。 我应该配置 pod 还是无头服务(pod 的负载均衡器)?

文档指导使用 pod,如下所示(使用 StatefulSets 在 Kubernetes 上运行 MongoDB | Kubernetes): mongodb://user:pwd@mongo-0.mongo,mongo-1.mongo,mongo-2.mongo:27017/dbname_?

但我也让它与服务一起使用: mongodb://user:pwd@mongodb-headless.svc.cluster.local:27017/dbname_?authSource=admin&replicaSet=rs0

但是,我不知道正确的 URI 是什么?我遇到的问题是,当某些副本出于某种原因出现故障时,应用程序会因数据库连接丢失而崩溃。我认为这就是无头服务出现的地方,但不是,文档说要配置 pod。如果我扩展副本,我需要重新配置 URI。这听起来不太动态。

我也面临一些无头服务的问题,好像它在不同的命名空间中我无法使用定义的命名空间进行连接,例如: mongodb-headless.namespace.svc.cluster.local:27017

我错过了什么吗? 提前感谢您!

编辑:为 service/lb URI 示例添加了副本集(我已经配置了这个...)

【问题讨论】:

    标签: mongodb spring-boot kubernetes spring-data-mongodb


    【解决方案1】:

    我认为您引用无头服务的方式将导致 mongodb 仅使用集合中的第一个。

    另一种方法是使用 MongoDB 的 DNS seed list connection format 以及 Kubernetes 对 DNS SRV 记录的支持。如果您将服务的端口命名为 mongodb,那么以下连接字符串应该可以工作:

    mongodb+srv://user:pwd@mongodb-headless.namespace.svc.cluster.local:27017/dbname_?
    

    MongoDB 客户端将使用 DNS 获取连接时的种子列表,该列表与实际运行的 Pod 保持同步。 注意这个enables tls by default,你可能不想要。

    【讨论】:

    • 谢谢!我仍然有点困惑,因为服务对 ping 的响应。但不应用作 LoabBalancer。另外,我不想为此设置任何 dns 或 tls。但是使用 pod 的直接地址感觉很笨拙。
    • tls 可以关闭,从 Kubernetes 的 CoreDNS 免费获得 DNS
    • 啊,没错,但我不想为此设置任何 dns。即使你,使用该服务是否正确,它应该工作吗?为什么它不能与命名空间一起工作,但在没有命名空间的情况下工作(都响应来自同一命名空间中集群中的 pod 内部的 ping)?
    • 如果只使用服务名,MongoDB 只会连接到 DNS 查询返回的 addressfirst pod。我不确定它会在重新连接时尝试不同的 IP。没有关于命名空间问题的线索。
    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2021-09-22
    相关资源
    最近更新 更多