我有一些远程虚拟机,我想在这些虚拟机上部署一些Mongodb实例,然后使其可以远程访问,但是由于某些原因,我似乎无法使它工作。
这些是我采取的步骤:
这是我用来尝试连接的命令:
$ mongo host:NodePort
(“主机”是指Kubernetes主机)。
这是它的输出:
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 pod处于运行状态。然后,我在容器中运行了一个shell,并检查了Mongodb服务器是否正常运行。此外,我以前通过在Yaml描述中指定“ --bind-ip = 0.0.0.0”选项来授予对Mongodb服务器的远程访问权限。为了确保已应用此选项,我在同一外壳的Mongodb实例中运行了此命令:
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 describe deployment <mongo-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描述:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mongo-remote
spec:
replicas: 1
template:
metadata:
labels:
name: mongo-remote
spec:
containers:
- name: mongocontainer
image: mongo:4.0.3
imagePullPolicy: Always
command:
- "mongod"
- "--bind_ip"
- "0.0.0.0"
ports:
- containerPort: 5000
name: mongocontainer
nodeSelector:
kubernetes.io/hostname: xxx
答案 0 :(得分: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