【发布时间】:2018-10-24 21:59:19
【问题描述】:
我有一些远程虚拟机,我想在其上部署一些 Mongodb 实例,然后使它们可以远程访问,但由于某种原因,我似乎无法完成这项工作。
这些是我采取的步骤:
- 我在远程虚拟机上启动了一个运行 Mongodb 的 Kubernetes pod。
- 然后我通过 Kubernetes NodePort 服务公开了它。
- 然后我尝试从我的笔记本电脑连接到 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 实例中从同一个 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 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
【问题讨论】:
-
你的 mongodb/Kubernetes 在哪里运行?你也可以发
kubectl describe deployment <mongo-deployment>吗?或者statefulset如果 mongo 在 StatefulSet 上运行 -
它在哪里运行是什么意思?正如我所说,Pod 在虚拟机上运行(更具体地说,是我的 Kubernetes 集群的工作节点)。让我知道您是否想了解其他信息。我编辑了我原来的帖子来回答你的第二个问题,因为它不适合这里。
-
可以通过Node Port访问其他Kubernetes服务吗?节点的操作系统是什么?
-
是的,我可以。正如我在原始帖子中所说:“作为测试,我使用 MySQL 遵循完全相同的步骤,并且效果很好(也就是说,我运行了一个 MySQL pod 并使用 Kubernetes 服务公开它,以使其可以远程访问,然后我成功地从我的笔记本电脑连接到它)。”所有节点的操作系统都是 Ubuntu 16.04。
-
配置看起来不错。看起来像您节点上的防火墙规则。我问你你的虚拟机在哪个云上运行?你自己的云?您是否允许将笔记本电脑上的
NodePort发送到您运行 pod 的任何位置?
标签: mongodb kubernetes remote-connection kubernetes-service