欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

024.掌握Pod-部署MongoDB

程序员文章站 2022-07-04 23:41:55
一 前期准备 1.1 前置条件 集群部署:Kubernetes集群部署参考003——019。 glusterfs-Kubernetes部署:参考《附010.Kubernetes永久存储之GlusterFS超融合部署》。 1.2 部署规划 本实验使用StatefulSet部署MongoDB集群,同时每 ......

一 前期准备

1.1 前置条件

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

1.2 部署规划

本实验使用statefulset部署mongodb集群,同时每个mongodb实例使用glusterfs实现永久存储。从而部署无单点故障、高可用、可动态扩展的mongodb集群。
部署架构如下:
024.掌握Pod-部署MongoDB

二 创建statefulset

2.1 创建storageclass存储类型

  1 [root@k8smaster01 ~]# vi heketi-secret.yaml			#创建用于保存密码的secret
  2 apiversion: v1
  3 kind: secret
  4 metadata:
  5   name: 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
  4 default-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:
  5   name: 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
024.掌握Pod-部署MongoDB

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:
  6   name: ddefault-cluster-admin
  7 subjects:
  8   - kind: serviceaccount
  9     # reference to upper's `metadata.name`
 10     name: default
 11     # reference to upper's `metadata.namespace`
 12     namespace: default
 13 roleref:
 14   kind: clusterrole
 15   name: 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:
  6   name: mongo
  7   labels:
  8     name: 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:
 20   name: 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:
 56       name: 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
024.掌握Pod-部署MongoDB
  1 [root@k8smaster01 mongo]# kubectl get pods mongo-0 -o yaml | grep -a 3 volumes	#查看挂载
024.掌握Pod-部署MongoDB

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()
024.掌握Pod-部署MongoDB

四 集群常见管理

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 ……
024.掌握Pod-部署MongoDB

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 ……
024.掌握Pod-部署MongoDB
提示:进入某个实例查看mongo集群的状态,mongo-0发生故障前在集群中的角色为primary,在其脱离集群后,mongo集群会自动选出一个secondary节点提升为primary节点(本例中为mongo-2)。重启后的mongo-0则会成为一个新的secondary节点。