将mongodb暴露在外部世界的kubernetes状态

时间:2017-06-23 21:20:35

标签: mongodb kubernetes mongodb-replica-set

我已使用此掌舵chart

在状态集上使用kubernetes设置mongodb复制集

我可以访问集群内的mongo实例。但是我想打开它来访问外部世界。我尝试了两种方法来实现它

  1. 创建类型为' NodePort'的其他服务使用选择器标签映射到mongo实例。

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

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

  3. 这是我的测试脚本。

     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:端口直接访问每个pod,我希望它能够工作,但它会抛出以下异常

    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,但没有得到很多帮助

    我的想法已经不多了。有人可以帮忙解决这个问题吗?任何替代解决方案也受到赞赏。

    由于

1 个答案:

答案 0 :(得分:0)

在花了一些时间讨论这个问题后,我发现上面脚本中的mongo端点正在以下列格式返回复制集的DNS' - 'mongo-release-mongodb-replicaset-0.mongo-release-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
相关问题