如何连接到 Kubernetes 上的 MongoDB 副本集

How to connect to MongoDB replicaset on Kubernetes

我已经在 K8s 集群上以复制集模式部署了 bitnami's Mongodb helm chart,使用这个最小配置(目前):

  architecture: replicaset
  auth:
    enabled: false

现在我有两个副本(据称一个主要副本和一个辅助副本)和一个仲裁者(没有数据,只有投票权)。此外,我还获得了两项服务:appname-mongodb-headlessappname-mongodb-arbiter-headless。但是,MongoDB docs 将复制集安装的连接字符串指定为 mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017,mongodb2.example.com:27017/?replicaSet=myRepl

我可以使用 mongodb://appname-mongodb-headless:27017 连接到数据库,但这是“真实体验”(即高可用性等)吗?

我找到了 。它适用于另一张图表,但它表明无头服务的某种组合应该就足够了。尽管如此,它并没有回答我问题的所有方面。

headless 服务作为连接到 MongoDB 的入口点,无需指定 pod 地址。 Kubernetes 将平衡负载并将其提供给特定的 pod。

如果您希望使用 externalAccess.enabled 连接到 MongoDB,您应该查看部署图表时显示的 Helm 部署说明。您可以通过执行 helm get notes MY-RELEASE 命令阅读它们 post-部署。

例如,在我的例子中,它显示了这一点,但根据部署选项,它会显示其他内容:

To connect to your database, create a MongoDB® client container:

    kubectl run --namespace default mbmongo-mongodb-client --rm --tty -i --restart='Never' --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" --image docker.io/bitnami/mongodb:4.4.8-debian-10-r24 --command -- bash

Then, run the following command:
    mongo admin --host "mbmongo-mongodb-0.mbmongo-mongodb-headless.default.svc.cluster.local:27017,mbmongo-mongodb-1.mbmongo-mongodb-headless.default.svc.cluster.local:27017,mbmongo-mongodb-2.mbmongo-mongodb-headless.default.svc.cluster.local:27017" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD

To connect to your database nodes from outside, you need to add both primary and secondary nodes hostnames/IPs to your Mongo client. To obtain them, follow the instructions below:

    MongoDB® nodes domain: you can reach MongoDB® nodes on any of the K8s nodes external IPs.

        kubectl get nodes -o wide

    MongoDB® nodes port: You will have a different node port for each MongoDB® node. You can get the list of configured node ports using the command below:

        echo "$(kubectl get svc --namespace default -l "app.kubernetes.io/name=mongodb,app.kubernetes.io/instance=mbmongo,app.kubernetes.io/component=mongodb,pod" -o jsonpath='{.items[*].spec.ports[0].nodePort}' | tr ' ' '\n')"

从注释中可以看到这一行:

To connect to your database nodes from outside, you need to add both primary and secondary nodes hostnames/IPs to your Mongo client

这意味着您确实需要指定所有 primary/secondary 节点名称,但不需要指定仲裁者。


至于replicaSetKey,它指的是MongoDB keyFile的内容用于集群内部复制,所以它可以以安全的方式发生。您可以阅读更多相关信息 here

如果您继续发现问题,我建议您在 bitnami/charts 存储库中创建一个问题。

添加到 Marcos 的答案中,还有另一种 URI 格式称为 DNS 种子列表连接格式 来自 3.6+,您可以将其与无头服务的单个主机名一起使用,并且仍然利用复制集。

mongodb+srv://server.example.com/

这里是这样描述的:https://docs.mongodb.com/manual/reference/connection-string/#dns-seed-list-connection-format