我正在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容器创建时执行复制初始化):
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蒙古-服务公司:
apiVersion: v1
kind: Service
metadata:
name: mongo
labels:
app: mongo
spec:
clusterIP: None
ports:
- port: 27017
selector:
app: mongoother (两个容器在一个Pod中,一个用于实际DB,另一个用于复制的初始化):
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()’,得到以下输出:
{
"info" : "run rs.initiate(...) if not yet done for the set",
"ok" : 0,
"errmsg" : "no replset config has been received",
"code" : 94,
"codeName" : "NotYetInitialized"
}发布于 2020-03-24 18:35:23
显然,mongo-4.x映像没有安装'ping‘,因此脚本的其余部分没有执行。在mongo-configmap.yaml中将这两行代码添加到脚本中可以解决以下问题:
apt-get update
apt-get install iputils-ping --yes发布于 2020-10-21 12:44:43
在开始运行所有豆荚之后,然后按下以下命令
kubectl exec -it mongo-0 -- /bin/bash(这里的mongo-0是荚名)
现在开始芒果壳,
mongo现在检查吊舱是否启动
rs.status()如果不是这样,那么通过一个接一个地按下这些命令来启动并使其成为主命令。
rs.initiate()
var cfg = rs.conf()
cfg.members[0].host=”mongo-0.mongo:27017”(这里是mongo-0是荚名,mongo是序列化名。)
现在重新配置主节点
rs.reconfig(cfg)将所有从节点添加到主节点
rs.add(“mongo-1.mongo:27017”)
rs.add(“mongo-2.mongo:27017”)(这是mongo-1,mongo-2是荚名,mongo是序列名。)
现在检查状态
rs.status()现在退出主shell并转到次要(从)节点
exit
exit
kubectl exec -it mongo-1 -- /bin/bash
mongo
rs.secondaryOk()检查状态和出口
rs.status()
exit
exit现在,对其他辅助(从)节点执行同样的操作。
https://stackoverflow.com/questions/60822543
复制相似问题