一 前期准备

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. 说说Object类下面有几种方法呢?

    今天说一道基础题型,不过很多人会忽略或者至少说不完整,但是面试时被问到的几率还是很大的. 面试题 Object有几种方法呢? Java语言是一种单继承结构语言,Java中所有的类都有一个共同的祖先.这 ...

  2. 判断一字串String中是否包含某一串字符串

    String ostype = data.getString("osType").toUpperCase(); //转换为大写 if (ostype.contains(" ...

  3. C#事件浅淡(1)

    最近在写C#,感觉事件这个机制很好,可是怎么实现自己定义的事件呢?查了资料有的不全有的不完整,有的太深,自己写一个简单的例子. 原则 1,定义一个事件信息类(标准的都继承EventArgs) 2.定义 ...

  4. 使用animate.css

    今天有个一前辈来看了一下我的小程序啊,说写的还行就是可以不用只按照ui给的图写界面,自己可以添加一些动态的炫酷效果,不用不知道一用吓一跳啊,用之前觉得好好一个界面为什么要搞那些花里胡哨的东西,单纯一点 ...

  5. Springboot 系列(十五)如何编写自己的 Springboot starter

    1. 前言 Springboot 中的自动配置确实方便,减少了我们开发上的复杂性,那么自动配置原理是什么呢?之前我也写过了一篇文章进行了分析. Springboot 系列(三)Spring Boot ...

  6. Graylog源码分析

    上文主要介绍了Graylog的功能与架构,本篇我们来看看Graylog的源码 一. 项目启动(CmdLineTool) 启动基本做了这几件事:初始化logger,插件加载(这里用到了Java SPI机 ...

  7. 【问题记录】VMware Tools是灰色的,不能安装

    一.VMware Tools简介 VMware Tools 中包含一系列服务和模块,可在 VMware 产品中实现多种功能,从而使用户能够更好地管理客户机操作系统,以及与客户机操作系统进行无缝交互. ...

  8. 设计模式C++描述----15.策略(Strategy)模式

    一. 举例说明 以前做了一个程序,程序的功能是评价几种加密算法时间,程序的使用操作不怎么变,变的是选用各种算法. 结构如下: Algorithm:抽象类,提供算法的公共接口. RSA_Algorith ...

  9. leetcode算法小题(1)

    题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数 ...

  10. Markdown 编辑图片居中

    Markdown 编辑图片居中 <center><p>![](https://www.zybuluo.com/cmd/img/code%20render.png)</p& ...