kubernetes服务中的多个外部名称,以使用连接字符串

时间:2019-03-05 06:33:09

标签: kubernetes mongodb-cluster

我想将我的Kubernetes部署连接到具有URI的远程托管数据库。

我能够使用Docker使用URI连接到远程托管的数据库。现在,我想了解如何在Kubernetes服务文件中指定多个外部名称。

我有一个带有以下URL的MongoDB集群:

mongodb://username:password@mngd-new-pr1-01:27017,mngd-new-pr2-02:27017,mngd-new-pr3-03:27017/

我关注了Kubernetes best practices: mapping external services。当我设置一个外部名称时,它正在工作。

如何在外部名称中指定所有3个群集?

kind: Service
apiVersion: v1
metadata:
 name: mongo
spec:
  type: ExternalName
  externalName: mngd-new-pr1-01,mngd-new-pr2-02,mngd-new-pr3-03
  ports:
  - port: 27017

因为我无法创建多个外部名称。

我先创建了无头服务,然后为该服务创建了端点。如“方案1:具有IP地址的群集外部数据库”所述

从日志中,我认为正在建立连接。但是后来出现了类似下面的异常,它已断开连接。

2019-03-20 11:26:13.941信息1 --- [38.200.19:27038] org.mongodb.driver.connection:打开到[.38.200的连接[connectionId {localValue:1,serverValue:386066}] .19:27038 2019-03-20 11:26:13.953信息1 --- [.164.29.4:27038] org.mongodb.driver.connection:打开到.164.29.4的连接[connectionId {localValue:2,serverValue:458254}] :27038 2019-03-20 11:26:13.988信息1 --- [38.200.19:27038] org.mongodb.driver.cluster:监视线程已成功连接到服务器并带有描述ServerDescription {address = .38.200.19:27038,type = REPLICA_SET_PRIMARY,状态= CONNECTED,确定= true,版本= ServerVersion {versionList = [3,6,8]},minWireVersion = 0,maxWireVersion = 6,maxDocumentSize = 16777216,logicalSessionTimeoutMinutes = 30,roundTripTimeNanos = 45440955,setName ='no -prd-rep',canonicalAddress = mngd-new-pr1-01:27038,hosts = [mngd-new-pr1-01:27038,mngd-new-pr1-02:27038,mngd-new-pr1-03:27038 ],无源= [],仲裁人= [],primary ='mngd-new-pr1-01:27038' 2019-03-20 11:26:13.990信息1 --- [38.200.19:27038] org.mongodb.driver.cluster:将发现的服务器mngd-new-pr1-01:27038添加到群集的客户端视图 2019-03-20 11:26:13.992信息1 --- [38.200.19:27038] org.mongodb.driver.cluster:将发现的服务器mngd-new-pr1-02:27038添加到群集的客户端视图 2019-03-20 11:26:13.993信息1 --- [38.200.19:27038] org.mongodb.driver.cluster:将发现的服务器mngd-new-pr1-03:27038添加到群集的客户端视图 2019-03-20 11:26:13.997信息1 --- [38.200.19:27038] org.mongodb.driver.cluster:服务器102.227.4:27038不再是副本集的成员。从集群的客户端视图中删除。 2019-03-20 11:26:14.001信息1 --- [.164.29.4:27038] org.mongodb.driver.cluster:监视线程已成功连接到服务器并带有描述ServerDescription {address = .164.29.4:27038,类型= REPLICA_SET_SECONDARY,状态= CONNECTED,确定= true,版本= ServerVersion {versionList = [3,6,8]},minWireVersion = 0,maxWireVersion = 6,maxDocumentSize = 16777216,逻辑会话超时标识符= 30,roundTripTimeNanos = 47581993,setName =' no-prd-rep',canonicalAddress = mngd-new-pr1-01:27038,hosts = [mngd-new-pr1-01:27038,mngd-new-pr1-02:27038,mngd-new-pr1-03: 27038],passives = [],arbiters = [],primary ='mngd-new-pr1-01:27038', 2019-03-20 11:26:14.001信息1-[38.200.19:27038] org.mongodb.driver.cluster:服务器38.200.19:27038不再是副本集的成员。从集群的客户端视图中删除。 2019-03-20 11:26:14.001信息1 --- [38.200.19:27038] org.mongodb.driver.cluster:服务器164.29.4:27038不再是副本集的成员。从集群的客户端视图中删除。 2019-03-20 11:26:14.001信息1 --- [38.200.19:27038] org.mongodb.driver.cluster:规范地址mngd-new-pr1-01:27038与服务器地址不匹配。从集群的客户端视图中删除.38.200.19:27038 2019-03-20 11:26:34.012信息1-[2-prd2-01:27038] org.mongodb.driver.cluster:连接到服务器mngd-new-pr1-01:27038时监视线程异常 com.mongodb.MongoSocketException:mngd-new-pr1-01:名称或服务未知 在com.mongodb.ServerAddress.getSocketAddress(http://ServerAddress.java:188)〜[mongodb-driver-core-3.6.4.jar!/:na]

因此,由于我们将端点用作ip地址,并且其与部署yaml连接字符串中指定的连接字符串不匹配,因此可能会失败。 真的让我很困惑:)

PS:要检查与外部mongo群集的连接性,我已经启动了单个Pod

apiVersion:v1 种类:豆荚 元数据:   名称:proxy-chk 规格:   容器:   -名称:centos     图片:centos     命令:[“ / bin / sh”,“-c”,“ while:; curl -L http:// $ {MONGODBendpointipaddress}:27038 /;睡眠10;完成”]

在日志中,我可以看到它能够建立连接。

“看来您正在尝试通过本机驱动程序端口上的HTTP访问MongoDB。”

所以我认为我之前创建的无头服务能够路由流量

需要您的建议。

1 个答案:

答案 0 :(得分:1)

一种替代方法是为mongo主机每个创建一项服务,但是如果将来需要添加更多主机,则会破坏抽象。