首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Kubernetes中运行复制的MongoDB 4.2 :未接收复制配置

在Kubernetes中运行复制的MongoDB 4.2 :未接收复制配置
EN

Stack Overflow用户
提问于 2020-03-23 22:42:25
回答 2查看 1.6K关注 0票数 1

我正在AWS上运行一个Kubernetes集群,需要配置一个复制的MongoDB 4.2数据库。我使用StatefulSets是为了让其他Pods (例如REST Pod)能够轻松地连接到mongo实例(例如dsn:"mongodb://mongo-0.mongo,mongo-1 mongo,mongo-2 mongo:27017/app“)。

mongo configmap.yaml(提供一个shell脚本,用于在mongo容器创建时执行复制初始化):

代码语言:javascript
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: mongo-init
data:
  init.sh: |
    #!/bin/bash
    # wait for the readiness health check to pass 
    until ping -c 1 ${HOSTNAME}.mongo; do
      echo "waiting for DNS (${HOSTNAME}.mongo)..."
      sleep 2
    done
    until /usr/bin/mongo --eval 'printjson(db.serverStatus())'; do
      echo "connecting to local mongo..."
      sleep 2
    done
    echo "connected to local."
    HOST=mongo-0.mongo:27017
    until /usr/bin/mongo --host=${HOST} --eval 'printjson(db.serverStatus())'; do
      echo "connecting to remote mongo..."
      sleep 2
    done
    echo "connected to remote."
    if [[ "${HOSTNAME}" != 'mongo-0' ]]; then
      until /usr/bin/mongo --host=${HOST} --eval="printjson(rs.status())" \
            | grep -v "no replset config has been received"; do
        echo "waiting for replication set initialization"
        sleep 2
      done
      echo "adding self to mongo-0"
      /usr/bin/mongo --host=${HOST} --eval="printjson(rs.add('${HOSTNAME}.mongo'))"
    fi
    if [[ "${HOSTNAME}" == 'mongo-0' ]]; then
      echo "initializing replica set"
      /usr/bin/mongo --eval="printjson(rs.initiate(\
          {'_id': 'rs0', 'members': [{'_id': 0, \
           'host': 'mongo-0.mongo:27017'}]}))"
    fi
    echo "initialized"
    while true; do
      sleep 3600
    done

蒙古-服务公司:

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: mongo
  labels:
    app: mongo
spec:
  clusterIP: None
  ports:
  - port: 27017
  selector:
    app: mongo

other (两个容器在一个Pod中,一个用于实际DB,另一个用于复制的初始化):

代码语言:javascript
复制
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongo
  labels:
    app: mongo
spec:
  selector:
    matchLabels:
      app: mongo
  serviceName: "mongo"
  replicas: 3
  template:
    metadata:
      labels:
        app: mongo
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: mongodb
        image: mongo:4.2
        command:
        - mongod
        args:
        - --replSet
        - rs0
        - "--bind_ip_all"
        ports:
        - containerPort: 27017
          name: web
        volumeMounts:
        - name: database
          mountPath: /data/db
        livenessProbe:
          exec:
            command:
            - /usr/bin/mongo
            - --eval
            - db.serverStatus()
          initialDelaySeconds: 10
          timeoutSeconds: 10
      - name: init-mongo
        image: mongo:4.2
        command:
        - bash
        - /config/init.sh
        volumeMounts:
        - name: config
          mountPath: /config
      volumes:
      - name: config
        configMap:
          name: "mongo-init"
  volumeClaimTemplates:
  - metadata:
      name: database
      annotations:
        volume.beta.kubernetes.io/storage-class: mongodb-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 5Gi

应用这些配置后,3个芒果荚开始运行( mongo -0,mongo-1,mongo-2).然而,其他的荚不能连接到这些芒果荚。进一步研究mongo-0pods(应该是主要实例)可以发现复制不起作用。

kubectl exec -it mongo-0 - /bin/bash

然后运行' mongo‘启动mongo,并在mongo中输入'rs.status()’,得到以下输出:

代码语言:javascript
复制
{
    "info" : "run rs.initiate(...) if not yet done for the set",
    "ok" : 0,
    "errmsg" : "no replset config has been received",
    "code" : 94,
    "codeName" : "NotYetInitialized"
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-24 18:35:23

显然,mongo-4.x映像没有安装'ping‘,因此脚本的其余部分没有执行。在mongo-configmap.yaml中将这两行代码添加到脚本中可以解决以下问题:

代码语言:javascript
复制
apt-get update
apt-get install iputils-ping --yes
票数 1
EN

Stack Overflow用户

发布于 2020-10-21 12:44:43

在开始运行所有豆荚之后,然后按下以下命令

代码语言:javascript
复制
 kubectl exec -it mongo-0 -- /bin/bash

(这里的mongo-0是荚名)

现在开始芒果壳,

代码语言:javascript
复制
mongo

现在检查吊舱是否启动

代码语言:javascript
复制
rs.status()

如果不是这样,那么通过一个接一个地按下这些命令来启动并使其成为主命令。

代码语言:javascript
复制
rs.initiate()

var cfg = rs.conf()

cfg.members[0].host=”mongo-0.mongo:27017”

(这里是mongo-0是荚名,mongo是序列化名。)

现在重新配置主节点

代码语言:javascript
复制
rs.reconfig(cfg)

将所有从节点添加到主节点

代码语言:javascript
复制
rs.add(“mongo-1.mongo:27017”)

rs.add(“mongo-2.mongo:27017”)

(这是mongo-1,mongo-2是荚名,mongo是序列名。)

现在检查状态

代码语言:javascript
复制
rs.status()

现在退出主shell并转到次要(从)节点

代码语言:javascript
复制
exit

exit

kubectl exec -it mongo-1 -- /bin/bash

mongo

rs.secondaryOk()

检查状态和出口

代码语言:javascript
复制
rs.status()
exit
exit

现在,对其他辅助(从)节点执行同样的操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60822543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档