当前位置: 首页 > 知识库问答 >
问题:

在 kubernetes 中与 Mongodb 集群的外部连接

徐凌
2023-03-14

我已经使用mongo k8s sidecar在kubernetes上提供了一个3成员副本集mongo集群。我需要在外部公开mongodb服务,因此创建了一个LoadBalancer。

这就是服务的样子

LoadBalancer Ingress:     xxx.yyy.elb.amazonaws.com
Port:                     <unset>  27017/TCP
TargetPort:               27017/TCP
NodePort:                 <unset>  30994/TCP
Endpoints:            100.14.1.3:27017,100.14.1.4:27017,100.14.2.5:27017

尝试使用mongodb shell 3.6进行连接,效果很好mongo--host xxx.yyy.elb.amazonaws.com

但是在java客户端代码中,我看到了下面的异常。< code > Java . net . unknown hostexception:mongo-1 . mongo . dev . SVC . cluster . local

我可以确认mongo舱已经启动并运行。我可以从集群中的其他单元连接到mongo只是不能从外部连接到它。

我不明白的是java客户端中到底发生了什么。

java客户端(使用sping-data-mongo进行配置)的创建如下。

MongoClient mongoClient = new MongoClient( “xxx.yyy.elb.amazonaws.com” , 27017 );

完整堆栈跟踪如下

原因:com.mongodb。MongoTimeoutException:等待与com.mongodb.client.internal.MongoClientDelegate匹配的服务器时,在30000毫秒后超时$1@161f6623.群集状态的客户端视图为{type=REPLICA_SET,servers=[{address=mongo-2-mongo.dev.svc.cluster.local:27017,type=UNKNOWN,state=CONNECTING,exception={com.mongodb.MongoSocketException:mongo-2.mongo.def.svc.cluster.local},由{java.net.UnnknownHostException:mongo-2.mongo.dev.svc.cluster.local}}引起,{address=mongo-0.mongo.dev.svc.cluster.local:27017,type=UNKNOWN,state=CONNECTING,exception={com.mongodb.MongoSocketException:mongo-0.mongo.dev.svc.cluster.local},由{java.net.UnnknownHostException:mongo-0.mongo.dev.svc.cluster.local}}引起,{address=mongo-1.mongo.dev.svc.cluster.local:27017,type=UNKNOWN,state=CONNECTING,exception={com.mongodb.MongoSocketException:mongo-1.mongo.def.svc.cluster.local},由com.mongodb.internal.connection.BaseCluster.createTimeoutException(BaseCluster.java:401)位于com.mongob.internal.connection.BaseCluster.selectServer(BaseCluster.java:120)的{java.net.UnnknownHostException:mongo-1.mongo.dev.svc.cluster.local}}引起

为什么mongo客户端使用pod名称,即使我已经传递了负载平衡器地址?我该如何解决这个问题?

提前致谢


共有1个答案

籍星汉
2023-03-14
匿名用户

mongo-1.mongo.dev.svc.cluster出现错误。local,这是集群内的内部endpoint。换句话说,这就是从集群中的其他pod获取Mongo实例的方式。

在Java客户端上,您需要使用xxx.yyy.elb.amazonaws.com:27017作为Mongoendpoint配置。

类似于:

MongoClient mongoClient = new MongoClient( "xxx.yyy.elb.amazonaws.com" , 27017 );

为了让您大致了解路径,您的 Mongo 实例通过端口 27017 上的负载均衡器 Kubernetes 服务公开。

然后流量进入负载平衡器,并从那里转发到您的endpoint100.14.1.3:27017等。

然后,他们从那里进入每个节点上的节点端口< code>30994上的节点。

然后,运行pod的节点会回复一个答案。

容器本身中的Mongo进程在port27017上运行,因此当流量到达port30994上的节点时,容器运行时将流量转发到容器中的应用程序到27017

 类似资料:
  • 本系列文档介绍使用二进制部署最新 kubernetes v1.6.2 集群的所有步骤,而不是使用 kubeadm 等自动化方式来部署集群。 在部署的过程中,将详细列出各组件的启动参数,它们的含义和可能遇到的问题。 部署完成后,你将理解系统各组件的交互原理,进而能快速解决实际问题。 所以本文档主要适合于那些有一定 kubernetes 基础,想通过一步步部署的方式来学习和了解系统配置、运行原理的人。

  • 本系列文档介绍使用二进制部署最新 kubernetes v1.6.2 集群的所有步骤,而不是使用 kubeadm 等自动化方式来部署集群。

  • 本文档最初是基于kubenetes1.6版本编写的,对于kuberentes1.8及以上版本同样适用,只是个别位置有稍许变动,变动的地方我将特别注明版本要求。 本系列文档介绍使用二进制部署 kubernetes 集群的所有步骤,而不是使用 kubeadm 等自动化方式来部署集群,同时开启了集群的TLS安全认证,该安装步骤适用于所有bare metal环境、on-premise环境和公有云环境。 如

  • 我是新点燃的。 步骤1:我在两个VM(ubuntu)中安装了Ignite 2.6.0,在一个VM中启动了节点。下面有COMAND。bin/ignite.sh examples/config/example-ignite.xml 步骤2:我的所有配置都在example-default.xml中 步骤3:在其他VM中执行包含datagrid逻辑的client.jar(该VM既是客户机也是节点)。 步骤

  • 我安装了一个kubernetes集群。我想为我的一个微服务使用外部数据库(在我的集群之外),但这个外部数据库被设置为集群,没有自己的负载均衡器。 有没有办法创建一个内部负载平衡器服务,让kubernetes始终将微服务定向到正在运行的实例? 我看到您可以设置loadbalancer类型的服务,我如何使用它?我尝试创建它,但我看到loadbalancer服务是用NodePort创建的。它可以在没有节

  • 我试图在我本地minikube集群上的一个简单示例中使用fabric8io/kubernetes-client,在这里我获得了一个pod的IP 是完成执行的pod的名称,如果执行则可见。 是一个kubernetes API主机,我从中获得该主机。 MiniKube只有1个节点。 Fabric8IO/Kubernetes-客户端版本为4.9.1 Java 11 我将此代码作为作业部署在的同一集群上。