一 前期准备

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. spring boot 中的路径映射

    在spring boot中集成thymeleaf后,我们知道thymeleaf的默认的html的路径为classpath:/templates也就是resources/templates,那如何访问这 ...

  2. 玩转u8g2 OLED库,一篇就够(分篇)

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

  3. java中多线程 - 如何创建多线程

    线程 什么是线程: 线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源 表面上 ...

  4. Java多线程编程(三)线程间通信

    线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...

  5. 时针.html

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. Python能做什么,自学Python效果怎么样?

    短时间掌握一门技能是现代社会的需求.生活节奏越来越快,现在不是大鱼吃小鱼,而是快鱼吃慢鱼的时代,人的时间比机器的时间更值钱.Python作为一种轻量级编程语言,语言简洁开发快,没那么多技巧,受到众多追 ...

  7. 【MySQL】MySQL服务启动失解决方法

    写在前面的话:前段时间,为了更加流畅愉快的玩PUBG,我在任务管理器中,关闭了mysqld服务.后来我在使用MySQL数据库服务的时候,发现去到MySQL安装目录下双击运行mysqld.exe(数据库 ...

  8. Mui 微信支付、支付宝支付

    利用mui 发起手机微信和支付宝支付 payStatement :调起微信支付接口的参数 参考文档: https://pay.weixin.qq.com/wiki/doc/api/app/app.ph ...

  9. 8、pytest -- 捕获告警信息

    目录 1. 告警信息的默认捕获行为 2. @pytest.mark.filterwarnings 3. 去使能告警信息的展示 4. 去使能告警的捕获行为 5. DeprecationWarning和P ...

  10. 爬取bing背景图片

    因为工作环境的原因,没办法用梯子,也不喜欢用某度,只能用bing,发现背景图片蛮好看的,刚好最近在学习摄影,需要提高审美,就想着把bing背景图片都爬去下来做桌面背景.写的代码比较入门,只是做个记录, ...