无法连接到Kubernetes中的Mongodb pod(连接被拒绝)
我有一些远程虚拟机,我想在这些虚拟机上部署一些Mongodb实例,然后远程访问它们,但由于某些原因,我似乎无法做到这一点 以下是我采取的步骤:无法连接到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
- 我启动了一个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