如何从外部访问托管在 kubernetes 集群上的 mongodb 副本集?

Posted

技术标签:

【中文标题】如何从外部访问托管在 kubernetes 集群上的 mongodb 副本集?【英文标题】:How to access mongodb replicaset hosted on a kubernetes cluster from outside? 【发布时间】:2019-02-17 20:12:16 【问题描述】:

使用 Amazon EKS 在 Rancher 中创建的集群。

MongoDB 副本集是作为 Rancher 中的目录应用程序创建的。

集群中的服务可以通过此连接字符串成功连接数据库。

mongodb://mongodb-replicaset.mongodb-replicaset.svc.cluster.local:27017/tradeit_system?replicaSet=rs

我想查看和编辑数据库中的数据。在本地数据库中,您可以通过命令mongo --port 27017 轻松完成。

同样有一种方法可以连接到 kubernetes 上的那个。是从终端还是使用像 Robo 3t 这样的应用程序?

编辑

复制集没有显示。

kubectl get deployments --all-namespace

kubectl get pods --all-namespaces

显示它在 3 个 pod 中运行 mongodb-replicaset-0、mongodb-replicaset-1、mongodb-replicaset-2。

【问题讨论】:

【参考方案1】:
    运行kubectl get services -n <namespace>。这将列出副本集服务 执行kubectl port-forward svc/mongodb-replicaset -n mongoNamespace 27018:27017

在哪里

mongodb-replicaset = mongodb 服务名称

mongoNamespace = 命名空间

27018 = 您的本地端口

作为最佳实践,您应该始终连接服务而不是 pod。由于 pod 会自动重新创建/重新启动,因此它会为您提供一个新的 pod 名称。连接到服务可以避免重新连接和查找 mongodb 副本集的主 pod。

【讨论】:

@也许你是对的,连接到服务是最好的,而不是 Pod。 我是否也应该使用服务来访问我的微服务上的 mongodb 集群? @VandersonAssis 是的,尤其是当您在微服务上连接数据库服务器时。而不是将它们连接到特定的 pod。 k8s 上有 3 种服务,ClusterIP、NodePort 和 LoadBalancer。见matthewpalmer.net/kubernetes-app-developer/articles/… 有了这个答案,我得到了这个错误getaddrinfo ENOTFOUND example-mongodb-0.example-mongodb-svc.mongodb.svc.cluster.local。编辑:这个错误似乎只发生在 MongoDB Compass GUI 上。使用例如它工作的 C# nuget 客户端。 @DavidS。尝试将useUnifiedTopology 设置为false,并且只对replicaset 主pod 进行端口转发。然后在连接字符串中只传递主 pod 的主机名,不传递副本集名称。【参考方案2】:

kubectl port-forward mongodb-replicaset-0 --namespace mongodb-replicaset 27017:27017

mongodb-replicaset-0 - 运行主集的 pod。

这会将流量转发到您机器上的localhost:27017

Github discussion

Documentation on port-forward

【讨论】:

【参考方案3】:

执行kubectl get pods 后,您将看到您的 pod 的名称。

您可以使用以下命令连接到任何 pod:kubectl exec -it POD_NAME /bin/bash。 另请查看 Execute a command in a container 的文档。

另外,在连接到POD 后,您可以使用whereis mongo 查看 mongo 的位置。

我认为默认安装位于/usr/bin/mongo,因此在连接到您的集群时,您可以使用kubectl exec -it POD_NAME /usr/bin/mongo直接从您喜欢的任何pod调用mongo

【讨论】:

以上是关于如何从外部访问托管在 kubernetes 集群上的 mongodb 副本集?的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 kubernetes 从托管在同一集群/内部的注册表中提取容器映像

如何从 kubernetes 集群内部访问主机的 localhost

如何在 kubernetes 上设置基本的 rabbitmq

Kubernetes 集群中的 Kafka - 如何从 Kubernetes 集群外部发布/使用消息

关于Kubernetes中如何优雅的访问集群外服务的一些笔记

关于Kubernetes中如何优雅的访问集群外服务的一些笔记