【问题标题】:No connection error when attempting to connect to a stateful set Mongodb Kubernetes deployment尝试连接到有状态集 Mongodb Kubernetes 部署时没有连接错误
【发布时间】:2018-08-27 19:25:29
【问题描述】:

我有以下服务...

apiVersion: v1
kind: Service
metadata:
  name: mongo
  labels:
    app: mongo
spec:
  ports:
  - name: mongo
    port: 27017
  clusterIP: None
  selector:
    app: mongo

还有下面的有状态集...

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongo
spec:
  serviceName: mongo
  selector:
    matchLabels:
      app: mongo
  replicas: 3
  template:
    metadata:
      labels:
        app: mongo
    spec:
      terminationGracePeriodSeconds: 10
      containers:
        - name: mongo
          image: mongo
          command:
            - mongod
            - "--replSet"
            - rs0
            - "--smallfiles"
            - "--noprealloc"
          ports:
            - name: mongo
              containerPort: 27017
        - name: mongo-sidecar
          image: cvallance/mongo-k8s-sidecar
          env:
            - name: "VERSION"
              value: "2"
            - name: MONGO_SIDECAR_POD_LABELS
              value: "role=mongo"

但是,我的代码无法使用 URL mongo:27017 建立连接。我试过连接到mongomongo-0.mongo:27017,还有很多其他人。如果我执行到容器中并运行$ nslookup mongo 我会得到...

Name:      mongo
Address 1: 10.1.0.80 mongo-0.mongo.default.svc.cluster.local
Address 2: 10.1.0.81 mongo-1.mongo.default.svc.cluster.local
Address 3: 10.1.0.82 mongo-2.mongo.default.svc.cluster.local

点击$ curl mongo:27017$ telnet mongo 27017 会给我一个连接被拒绝错误。

【问题讨论】:

  • telnet mongo 27017 是正确的语法
  • 你是在应用容器中运行telnet还是curl?
  • @FarhadFarahi 与正确的 telnet 调用相同的错误,是的,这是来自应用程序容器。
  • 使用netstat -tlpn 然后看一下 :27017 之前的 ip,是 0.0.0.0 吗?我确保 mongo 没有在本地主机上监听,因此您面临的问题。
  • net: bindIp: 0.0.0.0 port: 27017

标签: mongodb docker kubernetes gcloud


【解决方案1】:

bind_ip 添加到命令中:

      command:
        - mongod
        - "--replSet"
        - rs0
        - "--smallfiles"
        - "--noprealloc"          
        - "--bind_ip"
        - "0.0.0.0"

option 告诉 monogodb 守护进程侦听所有 IPv4 地址,而不是默认的 localhost

【讨论】:

  • 我已经尝试过了,当我尝试连接到 mongo:27017 时,我仍然从我的 go 应用程序中得到:Error connecting to datastore mongo:27017: no reachable servers。如果我从另一个容器中 curl mongo:27017,我现在会得到 curl: (56) Recv failure: Connection reset by peer,而不是像以前那样出现通用无法连接错误。所以感觉更近了一点。
【解决方案2】:

好的,所以我解决了这个问题,这是设置 bind_ip=0.0.0.0 的情况,但我也必须将服务中的选择器更改为 role: mongo,而不是 app: mongo。然后在我的部署中,我必须在我的元数据中包含role: mongo,比如......

template:
    metadata:
      labels:
        app: mongo
        role: mongo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 2018-01-31
    • 2017-12-27
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    相关资源
    最近更新 更多