Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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 pod(连接被拒绝)_Mongodb_Kubernetes_Remote Connection_Kubernetes Service - Fatal编程技术网

无法连接到Kubernetes中的Mongodb pod(连接被拒绝)

无法连接到Kubernetes中的Mongodb pod(连接被拒绝),mongodb,kubernetes,remote-connection,kubernetes-service,Mongodb,Kubernetes,Remote Connection,Kubernetes Service,我有一些远程虚拟机,我想在这些虚拟机上部署一些Mongodb实例,然后远程访问它们,但由于某些原因,我似乎无法做到这一点 以下是我采取的步骤: 我启动了一个Kubernetes吊舱,在远程虚拟机上运行Mongodb 然后我通过Kubernetes节点端口服务公开了它 然后,我尝试从笔记本电脑连接到Mongodb实例,但它 没用 以下是我用来尝试连接的命令: $ mongo host:NodePort (我所说的“主人”是指库伯内特斯大师) 这是它的输出: MongoDB shell

我有一些远程虚拟机,我想在这些虚拟机上部署一些Mongodb实例,然后远程访问它们,但由于某些原因,我似乎无法做到这一点

以下是我采取的步骤:

  • 我启动了一个Kubernetes吊舱,在远程虚拟机上运行Mongodb
  • 然后我通过Kubernetes节点端口服务公开了它
  • 然后,我尝试从笔记本电脑连接到Mongodb实例,但它 没用
以下是我用来尝试连接的命令:

$ mongo host:NodePort   
(我所说的“主人”是指库伯内特斯大师)

这是它的输出:

MongoDB shell version v4.0.3
connecting to: mongodb://host:NodePort/test
2018-10-24T21:43:41.462+0200 E QUERY    [js] Error: couldn't connect to server host:NodePort, connection attempt failed: SocketException:
Error connecting to host:NodePort :: caused by :: Connection refused :
connect@src/mongo/shell/mongo.js:257:13
@(connect):1:6
exception: connect failed
从Kubernetes大师那里,我确保Mongodb吊舱正在运行。然后,我在容器中运行了一个shell,并检查Mongodb服务器是否正常工作。此外,我之前通过在其yaml描述中指定“-bind ip=0.0.0.0”选项,授予了对Mongodb服务器的远程访问权限。为了确保已应用此选项,我在Mongodb实例中从同一个shell运行了以下命令:

db._adminCommand( {getCmdLineOpts: 1}
以下是输出:

{
"argv" : [
    "mongod",
    "--bind_ip",
    "0.0.0.0"
],
"parsed" : {
    "net" : {
        "bindIp" : "0.0.0.0"
    }
},
"ok" : 1
}
因此,Mongodb服务器实际上应该可以远程访问

我不知道这个问题是由Kubernetes还是Mongodb引起的

作为一个测试,我完全按照相同的步骤使用MySQL,这是有效的(也就是说,我运行了一个MySQL pod,并使用Kubernetes服务公开了它,使它可以远程访问,然后我成功地从笔记本电脑连接到它)。这会让我认为罪魁祸首是Mongodb,但我不确定。也许我只是在某个地方犯了个愚蠢的错误

有人能帮我解释一下吗?或者告诉我如何调试这个问题

编辑:

以下是根据您的请求发出的
kubectl descripe deployment
命令的输出:

Name:                   mongo-remote
Namespace:              default
CreationTimestamp:      Thu, 25 Oct 2018 06:31:24 +0000
Labels:                 name=mongo-remote
Annotations:            deployment.kubernetes.io/revision=1
Selector:               name=mongo-remote
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  1 max unavailable, 1 max surge
Pod Template:
  Labels:  name=mongo-remote
  Containers:
   mongocontainer:
    Image:      mongo:4.0.3
    Port:       5000/TCP
    Host Port:  0/TCP
    Command:
      mongod
      --bind_ip
      0.0.0.0
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  <none>
NewReplicaSet:   mongo-remote-655478448b (1/1 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  15m   deployment-controller  Scaled up replica set mongo-remote-655478448b to 1
我发现了错误(正如我所怀疑的,这是一个愚蠢的错误)。
问题出在部署的yaml描述中。由于在
mongod
命令中未指定任何端口,因此mongodb正在侦听默认端口(27017),但容器正在侦听另一个指定端口(5000)

因此,解决方案是将containerPort设置为mongodb的默认端口,如下所示:

       command:
      - "mongod"
      - "--bind_ip"
      - "0.0.0.0"
      ports:
      - containerPort: 27017
        name: mongocontainer
或者将mongodb的端口设置为containerPort的端口,如下所示:

      command:
      - "mongod"
      - "--bind_ip"
      - "0.0.0.0"
      - "--port"
      - "5000"
      ports:
      - containerPort: 5000
        name: mongocontainer

你的mongodb/Kubernetes在哪里?您是否也可以发布
kubectl描述部署
?或者
statefulset
如果mongo在statefulset上运行,那么它在哪里运行是什么意思?正如我所说,pod运行在虚拟机上(更具体地说,是Kubernetes集群的工作节点)。如果你还想知道什么,请告诉我。我编辑了我的原始帖子来回答你的第二个问题,因为它不适合这里。你能通过节点端口访问任何其他Kubernetes服务吗?节点的操作系统是什么?是的,我可以。正如我在最初的帖子中所说:“作为一个测试,我遵循了完全相同的步骤,使用了MySQL,这是有效的(也就是说,我运行了一个MySQL pod,并使用Kubernetes服务公开了它,使它可以远程访问,然后我成功地从笔记本电脑连接到它)。”所有节点的操作系统都是Ubuntu 16.04。配置看起来不错。看起来像是节点上的防火墙规则。我问你的虚拟机运行在哪个云上?你自己的云?您是否允许从笔记本电脑向运行pod的任何地方发送
节点端口
      command:
      - "mongod"
      - "--bind_ip"
      - "0.0.0.0"
      - "--port"
      - "5000"
      ports:
      - containerPort: 5000
        name: mongocontainer