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

Mik*_*esi 6 remote-connection mongodb kubernetes kubernetes-service

我有一些远程虚拟机,我想在其中部署一些 Mongodb 实例,然后使它们可以远程访问,但由于某种原因,我似乎无法完成这项工作。

这些是我采取的步骤:

  • 我启动了一个在远程虚拟机上运行 Mongodb 的 Kubernetes pod。
  • 然后我通过 Kubernetes NodePort 服务公开它。
  • 然后我尝试从笔记本电脑连接到 Mongodb 实例,但没有成功。

这是我用来尝试连接的命令:

$ mongo host:NodePort   
Run Code Online (Sandbox Code Playgroud)

(“主机”是指 Kubernetes master)。

这是它的输出:

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
Run Code Online (Sandbox Code Playgroud)

从 Kubernetes master 处,我确保 Mongodb pod 正在运行。然后我在容器中运行 shell 并检查 Mongodb 服务器是否正常工作。此外,我之前通过在 yaml 描述中指定“--bind-ip=0.0.0.0”选项来授予对 Mongodb 服务器的远程访问权限。为了确保已应用此选项,我从同一个 shell 在 Mongodb 实例内运行此命令:

db._adminCommand( {getCmdLineOpts: 1}
Run Code Online (Sandbox Code Playgroud)

这是输出:

{
"argv" : [
    "mongod",
    "--bind_ip",
    "0.0.0.0"
],
"parsed" : {
    "net" : {
        "bindIp" : "0.0.0.0"
    }
},
"ok" : 1
}
Run Code Online (Sandbox Code Playgroud)

所以 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
Run Code Online (Sandbox Code Playgroud)

为了完整起见,以下是部署的 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
Run Code Online (Sandbox Code Playgroud)

Mik*_*esi 4

我发现了这个错误(正如我所怀疑的,这是一个愚蠢的错误)。
问题出在部署的 yaml 描述中。由于命令中未指定端口mongod,因此 mongodb 正在侦听默认端口(27017),但容器正在侦听另一个指定端口(5000)。

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

       command:
      - "mongod"
      - "--bind_ip"
      - "0.0.0.0"
      ports:
      - containerPort: 27017
        name: mongocontainer
Run Code Online (Sandbox Code Playgroud)

或者将 mongodb 的端口设置为 containerPort 之一,如下所示:

      command:
      - "mongod"
      - "--bind_ip"
      - "0.0.0.0"
      - "--port"
      - "5000"
      ports:
      - containerPort: 5000
        name: mongocontainer
Run Code Online (Sandbox Code Playgroud)