Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将kubernetes状态集上的mongodb暴露给外部世界_Mongodb_Kubernetes_Mongodb Replica Set - Fatal编程技术网

将kubernetes状态集上的mongodb暴露给外部世界

将kubernetes状态集上的mongodb暴露给外部世界,mongodb,kubernetes,mongodb-replica-set,Mongodb,Kubernetes,Mongodb Replica Set,我已经使用这个头盔在kubernetes上用Statefulset设置了mongodb复制集 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-replicas

我已经使用这个头盔在kubernetes上用Statefulset设置了mongodb复制集

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
我可以访问集群内的mongo实例。但我想把它打开,让它接触外部世界。我尝试了两种方法来实现它

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
  • 使用选择器标签创建映射到mongo实例的“NodePort”类型的附加服务

  • 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
    
  • 从外部暴露所有3个mongodb吊舱

    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
    
    kubectl expose pods mongo-release-mongodb-replicaset-2--type=NodePort

  • 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
    
    这是我的测试脚本

     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
    
    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
    
    对于第一种方法,我得到了以下错误,这是有意义的,因为外部服务没有一致地命中replicaset中的主节点。多次尝试最终都会连接到主机和write works

    File "/Library/Python/2.7/site-packages/pymongo/pool.py", line 552, in _raise_connection_failure
    raise error
    pymongo.errors.NotMasterError: not master
    
    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
    
    对于第二种方法,因为我们直接通过它们的IP:port访问每个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
    
    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
    
    从错误中可以看出DNS转换导致了问题?我看了这个,但没有得到多少帮助

    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
    
    我的点子快用完了。有人能帮忙解决这个问题吗?任何替代解决方案也将受到赞赏

    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
    

    谢谢

    在花了一些时间处理这个问题之后,我发现上面脚本中的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
    

    实际上,如果创建NodePort类型的服务,则必须访问暴露端口的节点的IP(专用/公用网络接口)。服务名称只能由kube dns解析,返回的IP仅为内部IP(pods/群集节点)。主要问题是MongoDB群集正在根据您为启动复制集提供的配置向客户端提供其拓扑。外部端点仅用于获取此拓扑,然后客户端尝试直接访问mongo节点。您需要多点:-rs.initiate()中提供的名称必须可以从客户端解析-解析的IP必须可以从客户端路由1。二,。是严格等价的,在2。您可能应该使用
    expose rs
    而不是
    expose pod