使用StatefulSet搭建MongoDB集群
1.目的
为每一个MongoDB实例在共享存储(本例使用GlusterFS)中都申请一片存储空间,以实现一个无单点故障,高可用,可动态发展的MongoDB集群,架构图如下

2.前提条件
在创建statuefulSet之前,需要确保在kubenetes集群中管理员已经创建好共享存储,并能够与StorageClass对接,以实现动态存储供应的模式,使用GlusterFS作为共享存储
3.部署StatufulSet
为了完成MongoDB集群的搭建,需要部署以下三个资源对象
1)一个StoragerClass:用于StatefulSet自动为各个应用pod申请pvc
2)一个Headless Service:用于设置MongoDB实例的域名
3)一个StatefulSet
首先创建StorageClass 的配置文件
apiVersion: storage.k8s.io/v1 kind: SrorageClass metadata: name: fast provisioner: kubenetes.io/glusterfs parameters: resturl: "http://<heketi-rest-url>"
apiVersion: v1
kind: Service
metadata:
name: mongo
labels:
name: mongo
spec:
ports:
- port: 27017
targePort: 27017
clusterIP: None
selector:
role: mongo
运行kubectl create -f mongo-headless-service.yaml创建Headless Service
最后创建MongoDB ,StatuefulSet,statuefulSet-mongo.yaml文件的内容
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongo
spec:
serviceName: "mongo"
replicas: 3
template:
metadata:
labels:
role: mongo
environment: test
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mongo
image: mongo
command:
- mongod
- "--replset"
- rs0
- "--smallfiles"
- "--noprealloc"
ports:
- containerPort: 27017
volumeMounts:
- name: mongo-persistent-storage
mountpath: /data/db
- name: mongo-sidecar
iamge: cvallance/mongo-k8s-sidecar
env:
- name: MONGO_SIDECAR_POD_LABELS
value: "role=mongo, environment=test"
- name: KUBERNETES_MONGO_SERVICE_NAME
value: "mongo"
volumeClaimTemplates:
- metadata:
name: mongo-persistent-storage
annotations:
volume.beta.kubernetes.io/storage-class: "fast"
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 100Gi
4.查看MongoDB集群的状态
5.StatefulSet的常见应用场景
下面对MongoDB集群常见的两种场景进行操作,说明StatefulSet对有状态应用的自动化管理功能。
5.1MongoDB集群的扩容
假设在系统运行过程中,3个mongo实例不足以满足业务的要求,这时就需要对mongo集群进行扩容,仅需要通过StatefulSet进行scale操作,就能实现在mongo集群中自动添加新的mongo节点
使用kubectl scale命令将StatefulSet设置为4个实例: kubectl scale --replicas=4 statefulet mongo
等待一会儿查看实例: kubectl get po -l role=mongo
进入某个实例查看集群状态,可以看到第四个节点已经加入 kubectl exec -it mongo-0 -- mongo rs.status()
5.2自动故障恢复(MongoDB高可用)
假设在系统运行过程中,某个mongo实例或其所在的主机发生故障, 则statefulset将会自动重建该mongo实例, 并保证其身份(id)和使用的数据(pvc)不变
以mongo-0实例发生故障为例,statefulset将会自动重建mongo-0实例,并为其挂载之前分配的pvc“mongo-persistent-storager-mongo-0”。mongo-0服务在重新启动后,原数据库中的数据不会丢失,可继续使用
kubectl get po -l role=mongo -o yaml

浙公网安备 33010602011771号