使用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號