024.掌握Pod部署MongoDB

编程

一 前期准备

1.1 前置条件

  • 集群部署:Kubernetes集群部署参考003——019。
  • glusterfs-Kubernetes部署:参考《附010.Kubernetes永久存储之GlusterFS超融合部署》。

1.2 部署规划

本实验使用StatefulSet部署MongoDB集群,同时每个MongoDB实例使用glusterfs实现永久存储。从而部署无单点故障、高可用、可动态扩展的MongoDB集群。

部署架构如下:

二 创建StatefulSet

2.1 创建storageclass存储类型

  1 [root@k8smaster01 ~]# vi heketi-secret.yaml			#创建用于保存密码的secret

2 apiVersion: v1

3 kind: Secret

4 metadata:

5name: heketi-secret

6 namespace: heketi

7 data:

8 # base64 encoded password. E.g.: echo -n "mypassword" | base64

9 key: YWRtaW4xMjM=

10 type: kubernetes.io/glusterfs

  1 [root@k8smaster01 heketi]# kubectl create -f heketi-secret.yaml	#创建heketi

2 [root@k8smaster01 heketi]# kubectl get secrets -n heketi

3 NAME TYPE DATA AGE

4default-token-6n746 kubernetes.io/service-account-token 3 144m

5 heketi-config-secret Opaque 3 142m

6 heketi-secret kubernetes.io/glusterfs 1 3m1s

7 heketi-service-account-token-ljlkb kubernetes.io/service-account-token 3 143m

8 [root@k8smaster01 ~]# mkdir mongo

9 [root@k8smaster01 ~]# cd mongo

  1 [root@k8smaster01 heketi]# vi storageclass-fast.yaml

2 apiVersion: storage.k8s.io/v1

3 kind: StorageClass

4 metadata:

5name: fast

6 parameters:

7 resturl: "http://10.254.82.26:8080"

8 clusterid: "d96022e907f82045dcc426a752adc47c"

9 restauthenabled: "true"

10 restuser: "admin"

11 secretName: "heketi-secret"

12 secretNamespace: "default"

13 volumetype: "replicate:3"

14 provisioner: kubernetes.io/glusterfs

15 reclaimPolicy: Delete

  1 [root@k8smaster01 heketi]# kubectl create -f storageclass-fast.yaml

2 [root@k8smaster01 heketi]# kubectl get storageclasses/fast

2.2 授权ServiceAccount

本实验2.4步骤需要使用mongo-sidecar的pod来配置管理mongo pod。

由于默认的service account仅仅只能获取当前Pod自身的相关属性,无法观察到其他名称空间Pod的相关属性信息。如果想要扩展Pod,或者一个Pod需要用于管理其他Pod或者是其他资源对象,是无法通过自身的名称空间的serviceaccount进行获取其他Pod的相关属性信息的,因此需要进行手动创建一个serviceaccount,并在创建Pod时进行定义。或者直接将默认的serviceaccount进行授权。

  1 [root@uk8s-m-01 mongo]# vi defaultaccout.yaml

2 ---

3 apiVersion: rbac.authorization.k8s.io/v1beta1

4 kind: ClusterRoleBinding

5 metadata:

6name: DDefault-Cluster-Admin

7 subjects:

8 - kind: ServiceAccount

9 # Reference to upper"s `metadata.name`

10name: default

11 # Reference to upper"s `metadata.namespace`

12 namespace: default

13 roleRef:

14 kind: ClusterRole

15name: cluster-admin

16 apiGroup: rbac.authorization.k8s.io

17

18 [root@uk8s-m-01 mongo]# kubectl apply -f defaultaccout.yaml

2.3 创建headless Service

  1 [root@k8smaster01 mongo]# vi mongo-headless-service.yaml

提示:本实验直接将headless结合在StatefulSet同一个yaml文件中,参考2.4。

2.4 创建StatefulSet

  1 [root@k8smaster01 mongo]# vi statefulset-mongo.yaml

2 ---

3 apiVersion: v1

4 kind: Service

5 metadata:

6name: mongo

7 labels:

8name: mongo

9 spec:

10 ports:

11 - port: 27017

12 targetPort: 27017

13 clusterIP: None

14 selector:

15 role: mongo

16 --- #以上为headless-service

17 apiVersion: apps/v1beta1

18 kind: StatefulSet

19 metadata:

20name: mongo

21 spec:

22 serviceName: "mongo"

23 replicas: 3

24 template:

25 metadata:

26 labels:

27 role: mongo

28 environment: test

29 spec:

30 terminationGracePeriodSeconds: 10

31 containers:

32 - name: mongo

33 image: mongo:3.4 #新版可能不支持smallfiles参数,因此指定为3.4版本

34 command:

35 - mongod

36 - "--replSet"

37 - rs0

38 - "--bind_ip"

39 - 0.0.0.0

40 - "--smallfiles" #使用较小的默认文件

41 - "--noprealloc" #禁用数据文件预分配

42 ports:

43 - containerPort: 27017

44 volumeMounts:

45 - name: mongo-persistent-storage

46 mountPath: /data/db

47 - name: mongo-sidecar

48 image: cvallance/mongo-k8s-sidecar

49 env:

50 - name: MONGO_SIDECAR_POD_LABELS

51 value: "role=mongo,environment=test"

52 - name: KUBERNETES_MONGO_SERVICE_NAME

53 value: "mongo"

54 volumeClaimTemplates:

55 - metadata:

56name: mongo-persistent-storage

57 annotations:

58 volume.beta.kubernetes.io/storage-class: "fast"

59 spec:

60 accessModes: [ "ReadWriteOnce" ]

61 resources:

62 requests:

63 storage: 2Gi

释义:

  1. 该StatefulSet定义了两个容器:mingo和mongo-sidecar。mongo是主服务程序,mongo-sidecar是将多个mongo实例进行集群设置的工具。同时mongo-sidecar中设置了如下环境变量:

    • MONGO_SIDECAR_POD_LABELS:设置为mongo容器的标签,用于sidecar查询它所要管理的MongoDB集群实例。
    • KUBERNETES_MONGO_SERVICE_NAME:它的值为mongo,表示sidecar将使用mongo这个服务名来完成MongoDB集群的设置。

  1. replicas=3表示MongoDB集群由3个mongo实例组成。
  2. volumeClaimTemplates是StatefulSet最重要的存储设置。在annotations段设置volume.beta.kubernetes.io/storage-class="fast"表示使用名为fast的StorageClass自动为每个mongo Pod实例分配后端存储。
  3. resources.requests.storage=2Gi表示为每个mongo实例都分配2GiB的磁盘空间。


  1 [root@k8smaster01 mongo]# kubectl create -f statefulset-mongo.yaml	#创建mongo

提示:由于国内mongo镜像可能无法pull,建议通过VPN等方式提前pull镜像,然后上传至所有node节点。

  1 [root@VPN ~]# docker pull cvallance/mongo-k8s-sidecar:latest

2 [root@VPN ~]# docker pull mongo:3.4.4

3 [root@VPN ~]# docker save -o mongo-k8s-sidecar.tar cvallance/mongo-k8s-sidecar:latest

4 [root@VPN ~]# docker save -o mongo_3_4_4.tar mongo:3.4.4

5 [root@k8snode01 ~]# docker load -i mongo-k8s-sidecar.tar

6 [root@k8snode01 ~]# docker load -i mongo.tar

7 [root@k8snode01 ~]# docker images

创建异常可通过如下方式删除,重新创建:

  1 kubectl delete -f statefulset-mongo.yaml

2 kubectl delete -f mongo-headless-service.yaml

3 kubectl delete pvc -l role=mongo

三 确认验证

3.1 查看资源

  1 [root@k8smaster01 mongo]# kubectl get pod -l role=mongo			#查看集群pod

2 NAME READY STATUS RESTARTS AGE

3 mongo-0 2/2 Running 0 9m44s

4 mongo-1 2/2 Running 0 7m51s

5 mongo-2 2/2 Running 0 6m1s

StatefulSet会用volumeClaimTemplates中的定义为每个Pod副本都创建一个PVC实例,每个PVC的名称由StatefulSet定义中volumeClaimTemplates的名称和Pod副本的名称组合而成。

  1 [root@k8smaster01 mongo]# kubectl get pvc

  1 [root@k8smaster01 mongo]# kubectl get pods mongo-0 -o yaml | grep -A 3 volumes	#查看挂载

3.2 查看mongo集群

登录任意一个mongo Pod,在mongo命令行界面用rs.status()命令查看MongoDB集群的状态,该mongodb集群已由sidecar完成了创建。在集群中包含3个节点 每个节点的名称都是StatefulSet设置的DNS域名格式的网络标识名称:

mongo-0.mongo.default.svc.cluster.local

mongo-1.mongo.default.svc.cluster.local

mongo-2.mongo.default.svc.cluster.local

同时,可以查看每个mongo实例各自的角色(PRIMARY或SECONDARY)。

  1 [root@k8smaster01 mongo]# kubectl exec -ti mongo-0 -- mongo

2 ……

3 rs0:PRIMARY> rs.status()

四 集群常见管理

4.1 MongoDB扩容

运行环境过程中,若3个mongo实例不足以满足业务的要求,可对mongo集群进行扩容。仅需要通过对StatefulSet进行scale操作,从而实现在mongo集群中自动添加新的mongo节点。

  1 [root@k8smaster01 ~]# kubectl scale statefulset mongo --replicas=4	#扩容为4个

2 [root@k8smaster01 ~]# kubectl get pod -l role=mongo

3 NAME READY STATUS RESTARTS AGE

4 mongo-0 2/2 Running 0 105m

5 mongo-1 2/2 Running 0 103m

6 mongo-2 2/2 Running 0 101m

7 mongo-3 2/2 Running 0 50m

4.2 查看集群成员

  1 [root@k8smaster01 mongo]# kubectl exec -ti mongo-0 -- mongo

2 ……

3 rs0:PRIMARY> rs.status()

4 ……

4.3 故障自动恢复

若在系统运行过程中,某个mongo实例或其所在主机发生故障,则StatefulSet将会自动重建该mongo实例,并保证其身份(ID)和使用的数据(PVC) 不变。以下为mongo-0实例发生故障进行模拟,StatefulSet将会自动重建mongo-0实例,并为其挂载之前分配的PVC“mongo-persistent-storage-mongo-0”。新的服务“mongo-0”在重新启动后,原数据库中的数据不会丢失,可继续使用。

  1 [root@k8smaster01 ~]# kubectl get pvc

2 [root@k8smaster01 ~]# kubectl delete pod mongo-0

3 [root@k8smaster01 mongo]# kubectl exec -ti mongo-0 -- mongo

4 ……

5 rs0:PRIMARY> rs.status()

6 ……

提示:进入某个实例查看mongo集群的状态,mongo-0发生故障前在集群中的角色为PRIMARY,在其脱离集群后,mongo集群会自动选出一个SECONDARY节点提升为PRIMARY节点(本例中为mongo-2)。重启后的mongo-0则会成为一个新的SECONDARY节点。

以上是 024.掌握Pod部署MongoDB 的全部内容, 来源链接: utcz.com/z/511141.html

回到顶部