我已经使用这个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,但没有得到太多的帮助
我快没主意了。有人能帮我解决这个问题吗?任何替代的解决方案都是非常感谢的。
谢谢
2条答案
按热度按时间toiithl61#
在花了一些时间解决这个问题之后,我发现上面脚本中的mongo端点返回了副本集的DNS,格式如下:“mongo-release-mongodb-replicaset-0.mongo-release-mongodb-replicaset.default.svc.cluster.local:27017”。这些地址只能在集群命名空间中解析。在另一个pod中运行下面的脚本验证了这一点
vxqlmq5t2#
解决此问题的一个方法是使用参数
directConnection=True
示例化MongoClient,如下所示:PyMongo文件:https://pymongo.readthedocs.io/en/stable/examples/high_availability.html?highlight=dns