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节点。
  • 相关阅读:
    mysql数据库常用命令
    二维码的生成--后台版
    软件构建--目录
    软件构建--项目总结
    软件构建--产品测试
    软件构建--产品研发
    软件构建--系统设计
    百度分享代码
    JS定时跳转URL并输出剩余秒数
    c#生成word文档
  • 原文地址:https://www.cnblogs.com/itzgr/p/11926689.html
Copyright © 2011-2022 走看看