向外部世界公开kubernetes状态集合上的mongodb

qzlgjiam  于 2022-11-02  发布在  Kubernetes
关注(0)|答案(2)|浏览(173)

我已经使用这个helm chart在kubernetes上用Statefulsets设置了mongodb复制集
我可以访问集群内部的mongo示例,但是我想打开它来访问外部世界。
1.使用选择器标签创建一个Map到mongo示例的“NodePort”类型的附加服务。
1.将所有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

对于第一种方法,我得到了下面的错误,这是有意义的,因为外部服务并不总是命中副本集中的主节点。多次尝试最终会连接到主节点,写入工作正常。

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

对于第二种方法,由于我们直接通过每个pod的IP:port访问它们,因此我希望它能够正常工作,但它抛出了以下异常

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,但没有得到太多的帮助
我快没主意了。有人能帮我解决这个问题吗?任何替代的解决方案都是非常感谢的。
谢谢

toiithl6

toiithl61#

在花了一些时间解决这个问题之后,我发现上面脚本中的mongo端点返回了副本集的DNS,格式如下:“mongo-release-mongodb-replicaset-0.mongo-release-mongodb-replicaset.default.svc.cluster.local:27017”。这些地址只能在集群命名空间中解析。在另一个pod中运行下面的脚本验证了这一点

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
vxqlmq5t

vxqlmq5t2#

解决此问题的一个方法是使用参数directConnection=True示例化MongoClient,如下所示:

c = MongoClient('localhost', 27017, directConnection=True)

PyMongo文件:https://pymongo.readthedocs.io/en/stable/examples/high_availability.html?highlight=dns

相关问题