使用Kubernetes快速部署MongoDB高可用集群

单个节点
使用Kubernetes ReplicationController

在GCE环境中使用Kubernetes和持久存储构建单个节点的副本集:

20160720203827

在公司的私有环境中,选择Ceph RBD作为永久性存储是个好的选择。

使用yaml文件定义一个单节点的MongoDB副本集:

20160720203930

20160720203949

图一展示了一个Pod、ReplicationController和Service之间的关系:

  • 最重要是先启动一个叫mongo-node-1的容器,它的镜像采用Docker Hub上的官方镜像。容器暴露27017端口用于外部访问
  • Kubernetes的副本控制器(ReplicationController) mongo-node-1使用Ceph RBD作为永久数据存储。 容器中的”/data/db”会被挂载在被称为“mongo-node-1″的一个RBD的块设备上,它的文件系统被格式化为ext4。如果mongo的容器被重新调度,新的容器会重新挂载上”mongo-node-1”这个块设备,数据不会丢失。
  • 负载均衡器(LoadBalancer)暴露了一个固定的IP地址用于外部访问,这个固定IP的27017端口已经被映射到那些mongo的容器的27017端口上了。负载均衡服务可以通过选择器(Selector)来自动选择那些合适的pod。
使用Kubernetes的Service组件作为一个负载均衡器

通过一个yaml文件定义“mongo—svc-1”服务:

20160720204003

创建一个块设备并使用它

在您只用rbd命令之前,您需要安装一个ceph的集群在您的计算集群中。

创建一个10GB大小的RBD Image,并将它挂载:

20160720204018

使用ext4来格式化块设备:

mkfs.ext4/dev/rbd0

卸载这个块设备:

rbd unmap /dev/rbd0

按照这种方式,分别创建另外两个块设备mongo-node-2和mongo-node-3

创建对应RC和Service:
kubect1 create -f mongo-rc -rbd-1.yam1
kubect1 create -f mongo -svc -1.yam1
三个节点

图二显示了如何配置另外一个replica set的成员:

20160720204032

 


图三显示了整个目标集群的示意图:

2016072020414220160720204225

创建三个节点的Replica Set:
kubect1 create -f mongo -rc -rbd -1.yam1
kubect1 create -f mongo -rc -rbd -2.yam1
kubect1 create -f mongo -rc -rbd -3.yam1
为每个mongodb的容器节点创建一个对应的服务:
kubect1 create -f mongo -svc -1.yaml
kubect1 create -f mongo -svc -2.yaml
kubect1 create -f mongo -svc -3.yaml

还可以创建一个统一的服务,让用户使用起来更加方便:

kubectl creat -f mongo -svc.yaml
初始化MongDB集群

得到统一服务(Service)的IP地址:

2016072020423920160720204251

还可以通过如下命令添加或删除已经加入replica set集群的节点

rs.add("172.16.7.3")
rs.remove("172.16.7.3:27017")
参考文献及致谢
  • A MongoDB White Paper: <Enabling Microservices Containers & Orchestration Explained March 2016>
  • Thanks to Sandeep Dinesh(@SandeepDinesh) and his article

本文原标题:使用容器云快速部署MongoDB高可用集群

K8S中文社区微信公众号
分享到:更多 ()

评论 抢沙发

评论前必须登录!