一 前期准备

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:
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

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
  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的更多相关文章

  1. 为首次部署MongoDB做好准备:容量计划和监控

    如果你已经完成了自己新的MongoDB应用程序的开发,并且现在正准备将它部署进产品中,那么你和你的运营团队需要讨论一些关键的问题: 最佳部署实践是什么? 为了确保应用程序满足它所必须的服务层次我们需要 ...

  2. Mongodb 笔记09 备份、部署MongoDB

    备份 1. 只有在有信心能在紧急情况下完成迅速部署的情况下,备份才是有用的.所以,无论选择了哪种备份技术,一定要对备份及恢复备份的操作进行练习,知道了然于心. 2. 通常情况下,应对副本集的非主节点( ...

  3. (转)为首次部署MongoDB做好准备:容量计划和监控

    如果你已经完成了自己新的MongoDB应用程序的开发,并且现在正准备将它部署进产品中,那么你和你的运营团队需要讨论一些关键的问题: 最佳部署实践是什么? 为了确保应用程序满足它所必须的服务层次我们需要 ...

  4. (转) 线上环境部署MongoDB的官方建议

    本文主要内容来自MongoDB官方文档http://docs.mongodb.org/manual/administration/production-notes/.并结合了实际工作情况进行分享. 1 ...

  5. Docker应用五:使用Dockerfile部署MongoDB

    在Docker容器中部署MongoDB 不做铺垫,直接开撸: 一.软件准备: docker(已安装) MongoDB-3.2.0.tgz 二.准备配置文件mongo.conf port=27017 d ...

  6. 部署MongoDB复制集(副本集)

    环境 操作系统:Ubuntu 18.04 MongoDB: 4.0.3 服务器 首先部署3台服务器,1台主节点 + 2台从节点 3台服务器的内容ip分别是: 10.140.0.5 (主节点) 10.1 ...

  7. 在Docker中安装和部署MongoDB集群

    此文已由作者袁欢授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在Docker中安装mongodb 采用的mongodb镜像:https://registry.hub.doc ...

  8. Ubuntu下安装部署MongoDB以及设置允许远程连接

    最近因为项目原因需要在阿里云服务器上部署MongoDB,操作系统为Ubuntu,网上查阅了一些资料,特此记录一下步骤. 1.运行apt-get install mongodb命令安装MongoDB服务 ...

  9. (转)部署MongoDB时需要注意的调参

    部署MongoDB的生产服务器,给出如下相关建议: 使用虚拟化环境: 系统配置 1)推荐RAID配置 RAID(Redundant Array of Independent Disk,独立磁盘冗余阵列 ...

随机推荐

  1. 造轮子了!NETCore跨平台UI框架,CPF

    CPF(暂时命名)(Cross platform framework),模仿WPF的框架,支持NETCore的跨平台UI框架,暂时不够完善,只用于测试,暂时只支持Windows和Mac.支持数据绑定, ...

  2. webpack——npm -i 与npm install -s与-d的区别

    在 package.json 文件里面的[devDependencies]和[dependencies]对象有什么区别呢? devDependencies  里面的插件只用于开发环境,不用于生产环境, ...

  3. 玩转OneNET物联网平台之MQTT服务① —— OneNetMqtt全方位调试

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  4. CentOS6-Linux内核编译 详细步骤

    CentOS6-Linux内核编译 详细步骤 背景 Win10用VMwareWorkstation搭的虚拟机 CentOS6.5,内核版本2.6.32-431.el6.x86_64 在该环境下升级至4 ...

  5. mysql字段按逗号,拆分并按条件查找

    mysql字段按逗号,拆分并按条件查找 mysql 表结构 CREATE TABLE `subid` ( `id1` varchar(255) DEFAULT NULL, `id2` varchar( ...

  6. Javascript进阶必会

    概念: 局部块函数声明: ES5才承认有这个东西. function f(){return 'global';} function test(x){ var result = []; if(x) { ...

  7. 设计模式(二十三)Interpreter模式

    在Interpreter模式中,程序要解决的问题会被用非常简单的“迷你语言”表述出来,即用“迷你语言”编写的“迷你程序”把具体的问题表述出来.迷你程序是无法单独工作的,还需要用java语言编写一个负责 ...

  8. ansible模块之yum、pip、service、corn、user、group

    ansible相关模块 yum rpm 和yum 的区别 rpm:全称redhat package manager (红帽包管理器) 不能解决包之间的依赖关系 yum:可以解决依赖关系 yum 源配置 ...

  9. Unity2-投影方式

  10. 手写SpringMVC 框架

    手写SpringMVC框架 细嗅蔷薇 心有猛虎 背景:Spring 想必大家都听说过,可能现在更多流行的是Spring Boot 和Spring Cloud 框架:但是SpringMVC 作为一款实现 ...