如何从外部访问托管在 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 集群外部发布/使用消息