簡體   English   中英

無法連接到Kubernetes中的Mongodb Pod(拒絕連接)

[英]Cannot connect to a Mongodb pod in Kubernetes (Connection refused)

我有一些遠程虛擬機,我想在這些虛擬機上部署一些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實例中運行了此命令:

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

我發現了錯誤(而且我懷疑這是一個愚蠢的錯誤)。
問題出在部署的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM