没时间解释了,赶紧上车。。。
This project is maintained by andarly
Docker Swarm使得分布式、集群的搭建部署速度提升了指数级别,原本的部署方式可能要用一天的时间,改用docker部署后可以减少到十分钟以内。
Docker swarm一般用来部署无状态应用,应用可以在任何节点上运行,以便达到横向扩展。当然,我们也可以使用docker swarm部署有状态应用,但是有个限制问题就是:Docker 默认存档到本地文件系统,有状态应用节点转移后,数据部分不能跟着转移。
Docker提供的解决方案是使用volume plugin,把数据存储到统一的地方,使得不同节点上的不同容器之间可以共享数据。
下面搭建为了避免swarm相关知识和操作,仅仅基于docker,如果有swarm相关知识,很容易把它应用到swarm中。
官方插件列表
插件 | 缺点 | 优点 |
---|---|---|
DigitalOcean、Virtuozzo、blockbridge | 收费 | |
Beegfs、convoy、drbd、Infinit、ipfs、OpenStorage | 小众、难以学习 | |
contiv | 无法使用,断更两年 | 支持ceph |
fuxi | 基于openstack,研究成本高 | |
flocker | 没有合适的backends | 大众化 |
gce-docker | 基于google云,收费 | |
Quobyte | 不支持分布式 | Docker安装 |
GlusterFS | 无法docker部署 | 官方文档好 |
Horcrux | 无法成功搭建,文档支持差 | Minio还是比较好搭建的 |
REX-Ray |
在查看、对比完官方所有的可用方案后,并没有马上得到一个可行易用的方案。经过大量搜索,国内来说,rexray、flocker、glusterfs是volume plugin推荐方案top3。通过进一步对比,并且发现rexray支持ceph后,认为rexray+ceph的方案比较符合我们的需求。
ceph包含文件存储、块存储、对象存储三种存储服务,rexray/rbd使用的是块存储,使用该插件之后,原本存储到本地文件的方式变成存储到ceph服务中。另外两个可当作附加服务,在业务应用内直接使用。另外,Ceph搭建比较简单,支持docker搭建,支持分布式,支持横向拓展(添加硬件后启动osd服务加入ceph集群即可)。
Ceph官方只有k8s上的搭建教程,但是docker store上有ceph的镜像,上面有比较详细的搭建说明。虽然玩不转k8s,但是有了容器镜像的使用说明,把它部署成swarm mode是轻而易举的事情。该镜像集成多个组件的镜像,通过启动命令参数,指定组件的类型。另外有针对不同组件的独立镜像。
三个docker节点。标记为
docker run -d --net=host --name=mon \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
-e MON_IP=10.32.3.147 \
-e CEPH_PUBLIC_NETWORK=10.32.3.0/24 \
ceph/daemon mon
docker exec mon ceph -s
查看集群状态,显示不存在mgr、osd服务的警告在集群的情况下,其他服务要加入mon初始化的集群,需要把mon生成的相关文件复制到相应节点上再启动服务。 注意mon服务类似于zookeeper,可在B2、B3运行多个mon防止单点故障,
scp -r root@10.32.3.147:/etc/ceph/* /etc/ceph/
scp -r root@10.32.3.147:/var/lib/ceph/bootstrap* /var/lib/ceph/
docker run -d --net=host --name=mgr \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
ceph/daemon mgr
docker exec mon ceph -s
查看集群状态。osd是ceph中接受,存储数据的服务。
scp -r root@10.32.3.147:/etc/ceph/* /etc/ceph/
scp -r root@10.32.3.147:/var/lib/ceph/bootstrap* /var/lib/ceph/
sudo docker run -d --net=host --name=osd \
--privileged=true \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph:/var/lib/ceph \
ceph/daemon osd
进入mon容器,执行ceph -s查看服务状态。快速命令
docker exec ${mon_container_id} ceph -s
当集群状态为
health HEALTH_OK
pgmap active+clean
表示集群可用
基于ceph的搭建比较繁杂,如果想测试rexray/ceph插件的可用性,可以使用以下命令启动一个包含所有服务的容器。
docker run -d --net=host --name=ceph \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
-e MON_IP=10.32.3.147 \
-e CEPH_PUBLIC_NETWORK=10.32.3.0/24 \
ceph/demo
一门技术的入门难免会遇到很多问题,以下命令用于重新搭建前做清理。
rm -rf /etc/ceph/* && rm -rf /var/lib/ceph/ && \
docker rm -f mon osd mgr
firewall-cmd --zone=public --add-port=6789/tcp --permanent && \
firewall-cmd --zone=public --add-port=6800-7300/tcp --permanent && \
firewall-cmd --reload
插件使用的要求前提是安装rbd、ceph相关包,使命令可用,按照官方文档,可以通过官方安装教程使用ceph-deploy install client-ip 在指定节点进行安装,但是安装的包比较多而且容易报错。经过偶然发现,安装ceph-common包,即可满足要求,而且安装依赖少,时间快。如果能解决报错问题,推荐使用官方方法,避免以后出现意想不到的事情。
安装前,首先确保docker宿主机器上/etc/ceph/存在集群配置文件。因为之前ceph集群搭建后,B1-3三台机器都已经存在了配置文件,所以可用忽略这一步。对新加入swarm的机器,需要注意这个步骤。
B1-3安装rbd、ceph包:执行yum install ceph-common -y
rbd ls
ceph -s
docker plugin install rexray/rbd
docker plugin install --alias 10.32.3.112:5011/rexray/rbd rexray/rbd
docker push 10.32.3.112:5011/rexray/rbd
有两个方式创建数据卷、启动容器:
1.自动
docker run --volume-driver 10.32.3.112:5011/rexray/rbd -v test:/test -it --rm busybox sh
2.手动
docker volume create -d 10.32.3.112:5011/rexray/rbd test
docker run -v test:/test -it --rm busybox sh
rbd map test --name client.admin
rbd ls
查看到B1上创建的目录。
一个数据卷被多个节点使用过,只要在一个节点删除,ceph上也就同时删除,但是其他节点还保留着对这个数据卷的映射,导致无法重新创建删除的数据卷,除非手动删除映射关系或者修改数据集名称。