如何连接到 Kubernetes 上的 MongoDB 副本集
How to connect to MongoDB replicaset on Kubernetes
我已经在 K8s 集群上以复制集模式部署了 bitnami's Mongodb helm chart,使用这个最小配置(目前):
architecture: replicaset
auth:
enabled: false
现在我有两个副本(据称一个主要副本和一个辅助副本)和一个仲裁者(没有数据,只有投票权)。此外,我还获得了两项服务:appname-mongodb-headless
、appname-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
连接到数据库,但这是“真实体验”(即高可用性等)吗?
- 我是否需要指定副本集名称(如示例中所示)以及如何找出它是什么?
- 如果现在的服务够用,是否需要在连接串中加入仲裁程序?
- 或者我应该为每个副本创建单独的服务并构建推荐的连接字符串吗?
externalAccess:
enabled: true
autoDiscovery:
enabled: true
- 我最终会在整理这部分连接后启用身份验证。这是什么
replicaSetKey
(“副本集中用于身份验证的密钥”),我在哪里使用它?
我找到了 。它适用于另一张图表,但它表明无头服务的某种组合应该就足够了。尽管如此,它并没有回答我问题的所有方面。
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
我已经在 K8s 集群上以复制集模式部署了 bitnami's Mongodb helm chart,使用这个最小配置(目前):
architecture: replicaset
auth:
enabled: false
现在我有两个副本(据称一个主要副本和一个辅助副本)和一个仲裁者(没有数据,只有投票权)。此外,我还获得了两项服务:appname-mongodb-headless
、appname-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
连接到数据库,但这是“真实体验”(即高可用性等)吗?
- 我是否需要指定副本集名称(如示例中所示)以及如何找出它是什么?
- 如果现在的服务够用,是否需要在连接串中加入仲裁程序?
- 或者我应该为每个副本创建单独的服务并构建推荐的连接字符串吗?
externalAccess: enabled: true autoDiscovery: enabled: true
- 我最终会在整理这部分连接后启用身份验证。这是什么
replicaSetKey
(“副本集中用于身份验证的密钥”),我在哪里使用它?
我找到了
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