2017-06-23 69 views
0

我已经安装使用这种头盔chart上kubernetes statefulsets MongoDB的暴露给外部世界

我可以访问群集内蒙戈实例与Statefulsets kubernetes MongoDB的replicaset。但我想打开它来访问外部世界。我尝试了两种方法来实现它

  1. 创建一个附加服务类型'NodePort'映射到具有选择器标签的mongo实例。

  2. 从外部暴露出所有3个mongodb豆荚。

    kubectl expose pods mongo-release-mongodb-replicaset-2 --type=NodePort

这里是我的测试脚本。

from pymongo import MongoClient 
client = MongoClient('192.168.99.100',30738) #approach 1 
#client = MongoClient('mongodb://192.168.99.100:31455,192.168.99.100:31424,192.168.99.100:31569/?replicaSet=rs0') #approach 2 
db=client.test 
db.test.insert({"key1":1}) 
values=db.test.find({'key1': 1}) 
for value in values: 
    print value 

使用第一种方法时,由于外部服务并不一致击中replicaset中的主节点,因此我得到以下错误,这是合理的。多次尝试最终会连接到主设备和写入设备。

File "/Library/Python/2.7/site-packages/pymongo/pool.py", line 552, in _raise_connection_failure 
raise error 
pymongo.errors.NotMasterError: not master 

在第二种方法,因为我们是直接通过他们的IP访问每个荚:端口,我希望它的工作,但它抛出了以下异常

pymongo.errors.ServerSelectionTimeoutError: mongo-release-mongodb-replicaset-0.mongo-release-mongodb-replicaset.default.svc.cluster.local:27017: [Errno 8] nodename nor servname provided, or not known,mongo-release-mongodb-replicaset-2.mongo-release-mongodb-replicaset.default.svc.cluster.local:27017: [Errno 8] nodename nor servname provided, or not known,mongo-release-mongodb-replicaset-1.mongo-release-mongodb-replicaset.default.svc.cluster.local:27017: [Errno 8] nodename nor servname provided, or not known 

从错误出现的DNS翻译导致问题?我看着这个question,但没有得到太多的帮助

我用尽了想法。任何人都可以解决这个问题吗?任何替代解决方案也受到赞赏。

感谢

+0

1.和2.严格等价,在2.您应该使用'expose rs'而不是'expose pod'。 –

回答

0

花更多的时间与这个问题后,我想通了蒙戈端点在上面的脚本是“以下面的格式 - ”返回replicaset的DNS蒙戈释放小的mongodb-replicaset-0。蒙戈释放小的mongodb-replicaset.default.svc.cluster.local:27017' 。这些地址只能在群集名称空间内解析。通过在另一个窗格中运行以下脚本验证相同

from pymongo import MongoClient 
client = MongoClient('mongodb://mongo-release-mongodb-replicaset-0.mongo-release-mongodb-replicaset:27017,mongo-release-mongodb-replicaset-1.mongo-release-mongodb-replicaset:27017,mongo-release-mongodb-replicaset-2.mongo-release-mongodb-replicaset:27017/?replicaSet=rs0') 
db=client.test 
db.test.insert({"key1":1}) 
values=db.test.find({'key1': 1}) 
for value in values: 
    print value 
+0

事实上,如果您创建了一个类型为NodePort的服务,您必须击中暴露该端口的节点的IP(私有/公共网络接口)。服务名称只能由kube-dns解析,并且返回的IP仅在内部(pods/cluster节点)。 –

+0

主要问题是MongoDB集群正在根据您提供的用于启动复制集的配置向客户端提供其拓扑。外部端点仅用于获取此拓扑,然后客户端尝试直接访问mongo节点。您需要多个点: - rs.initiate()中提供的名称必须可从客户端解析出来 - 解析的IP必须可以从客户端路由 – vgkowski