zoukankan      html  css  js  c++  java
  • 024.Kubernetes掌握Pod-部署MongoDB

    一 前期准备

    1.1 前置条件

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

    1.2 部署规划

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

    二 创建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
    clipboard

    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
    clipboard
      1 [root@k8smaster01 mongo]# kubectl get pods mongo-0 -o yaml | grep -A 3 volumes	#查看挂载
    clipboard

    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()
    clipboard

    四 集群常见管理

    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 ……
    clipboard

    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 ……
    clipboard
    提示:进入某个实例查看mongo集群的状态,mongo-0发生故障前在集群中的角色为PRIMARY,在其脱离集群后,mongo集群会自动选出一个SECONDARY节点提升为PRIMARY节点(本例中为mongo-2)。重启后的mongo-0则会成为一个新的SECONDARY节点。
  • 相关阅读:
    HDOJ 1207 汉诺塔II
    [转]写代码的小女孩
    POJ Subway tree systems
    HDOJ 3555 Bomb (数位DP)
    POJ 1636 Prison rearrangement (DP)
    POJ 1015 Jury Compromise (DP)
    UVA 10003
    UVA 103 Stacking Boxes
    HDOJ 3530 Subsequence
    第三百六十二、三天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/itzgr/p/11926689.html
Copyright © 2011-2022 走看看