一 前期准备

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. 【RabbitMQ 实战指南】一 RabbitMQ 开发

    1.RabbitMQ 安装 RabbitMQ 的安装可以参考官方文档:https://www.rabbitmq.com/download.html 2.管理页面 rabbitmq-management ...

  2. Solidity语言系列教程

    Solidity 是一门面向合约的.为实现智能合约而创建的高级编程语言.这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在 以太坊虚拟机(EVM) 上运行. ...

  3. Zookeeper - 什么是Zookeeper,以及zookeeper的安装(1)

    Zookeeper 什么是Zookeeper? 官网传送门 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的 ...

  4. LaTeX常用篇(二)---上下标/分式/根式/求和/连乘/极限/积分/希腊字母

    目录 1. 序言 2. 上下标 3. 分式 4. 根式 5. 求和和连乘 6. 极限 7. 积分 8. 常用的希腊字母 9. 补充项 更新时间:2019.10.27 增加补充项中的内容 1. 序言   ...

  5. webpack 4.x 初级学习记录

    首先声明下,本人不擅长文字表达,文采不行,所以文章中文字较少,请看代码,初级学习,不足之处请多多指教 GitHub链接 看云kancloud [TOC] webpack 4.x 安装 首先需要在全局中 ...

  6. Javascript进阶必会

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

  7. django-MVT设计模式

    MVT:Models.Views.Templates Model:封装数据库,对数据库进行访问,对数据进行增删查改等. View:业务逻辑的一些操作. Templates:展示. 而MVC主要的流程如 ...

  8. SpringBoot接管SpringMvc

    SpringBoot接管SpringMvc Spring Web MVC framework(通常简称为“Spring MVC”)是一个丰富的“model 视图控制器”web framework. S ...

  9. pytest -- 中文文档

    pytest-chinese-doc pytest官方文档(5.1.3版本)的中文翻译,但不仅仅是简单的翻译: 更多的例子,尽量做到每一知识点都有例子: 更多的拓展阅读,部分章节添加了作者学习时,所查 ...

  10. data-*设置自定义属性注意事项一

    本人才疏学浅,偶遇一个data自定义属性应当注意的小问题,随笔记下. 1.看下面代码:首先在a标签设置自定义两个属性 <a class="btn" href="ja ...