Ceph容器部署

容器化、容器化、容器化。。。都说重要的事情说三遍,那么Ceph部署有必要容器化吗?

有必要,非常有必要。容器化以后,不仅不会损失性能,而且对以后更新、回退都很方便。而且一个物理机(或虚拟机)上可以跑多个Ceph集群。对于一个开发人员,修改调试都实在是太方便了~~~~~!

闲言碎语不要讲,先拉个集群起来看看吧。

mimic

镜像

ceph/daemon:latest-mimic

网络

使用docker bridge网络,每个容器指定静态IP。

1
docker network create --subnet 192.168.44.0/24 cephnet

拉起Ceph集群

MON

1
docker run -d --net cephnet --ip 192.168.44.11 -v /Users/zhoub/temp/etc_ceph/:/etc/ceph -v /Users/zhoub/temp/var_lib_ceph/:/var/lib/ceph -e MON_IP=192.168.44.11 -e CEPH_PUBLIC_NETWORK=192.168.44.0/24 --name mon --hostname mon  ceph/daemon:latest-mimic mon

MGR

MGR节点很重要,如果没有MGR节点,你就看不到OSD的使用量了。现在的MON真是翻身农奴把歌唱啊,一心只做心跳了。

1
docker run -d --net cephnet --ip 192.168.44.12 -v /Users/zhoub/temp/etc_ceph/:/etc/ceph -v /Users/zhoub/temp/var_lib_ceph/:/var/lib/ceph --name mgr --hostname mgr ceph/daemon:latest-mimic mgr

OSD

OSD有两种部署方式,一种是将硬盘部署;另一种是目录部署。由于本人使用mac版本docker,所以在映射硬盘过程不太方便,所以使用目录部署。后面会给出硬盘部署的方式。

目录

1
docker run -d --net cephnet --ip 192.168.44.13 -v /Users/zhoub/temp/etc_ceph/:/etc/ceph -v /Users/zhoub/temp/var_lib_ceph/:/var/lib/ceph --name osd --hostname osd -e OSD_TYPE=directory ceph/daemon:latest-mimic osd

由于mac上的docker是运行在一个虚拟机中的,目前不太清楚该虚拟机使用的文件系统是什么,所以osd会暴如下错误:

1
2
3
4
5
6
7
8
9
10
11
$ docker logs -f osd
2019-09-23 10:59:14 /opt/ceph-container/bin/entrypoint.sh: static: does not generate config
2019-09-23 10:59:14 /opt/ceph-container/bin/entrypoint.sh: Creating osd
2019-09-23 10:59:14 /opt/ceph-container/bin/entrypoint.sh: OSD created with ID: 0
2019-09-23 10:59:14 /opt/ceph-container/bin/entrypoint.sh: created folder /var/lib/ceph/osd/ceph-0/
creating /var/lib/ceph/osd/ceph-0//keyring
added entity osd.0 auth auth(auid = 18446744073709551615 key=AQCCpYhdbE1EGxAAxX2Av3Gzez/5j8sijQg1jQ== with 0 caps)
2019-09-23 10:59:15.014 7f255136fd80 -1 filestore(/var/lib/ceph/osd/ceph-0) WARNING: max attr value size (1024) is smaller than osd_max_object_name_len (2048). Your backend filesystem appears to not support attrs large enough to handle the configured max rados name size. You may get unexpected ENAMETOOLONG errors on rados operations or buggy behavior
2019-09-23 10:59:15.084 7f255136fd80 -1 filestore(/var/lib/ceph/osd/ceph-0) mkjournal(1101): error creating journal on /var/lib/ceph/osd/ceph-0//journal: (22) Invalid argument
2019-09-23 10:59:15.084 7f255136fd80 -1 OSD::mkfs: ObjectStore::mkfs failed with error (22) Invalid argument
2019-09-23 10:59:15.084 7f255136fd80 -1 ** ERROR: error creating empty object store in /var/lib/ceph/osd/ceph-0: (22) Invalid argument

硬盘

在硬盘部署以前,需要先对硬盘进行格式化

1
docker run -d --privileged=true --rm -v /dev/:/dev/ -e OSD_DEVICE=/dev/sdb ceph/daemon:latest-mimic zap_device

格式化后再启动容器

1
docker run -d --net cephnet --ip 192.168.44.13 --hostname osd --name=osd --privileged  -v /Users/zhoub/temp/etc_ceph/:/etc/ceph -v /Users/zhoub/temp/var_lib_ceph/:/var/lib/ceph -v /dev/:/dev/ -e OSD_DEVICE=/dev/sdb ceph/daemon:latest-mimic osd

总结

集群除OSD服务外其它服务均可以正常容器化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@mon /]# ceph -s
cluster:
id: 61a4f9d8-fdc7-4883-8b71-7f93c2017f86
health: HEALTH_OK

services:
mon: 1 daemons, quorum mon
mgr: mgr(active)
osd: 1 osds: 0 up, 0 in

data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:

OSD目录部署不能正常提供服务主要是因为宿主机的文件系统类型未知,若宿主机可正常登录操作,此问题可解;
OSD硬盘部署不能正常提供服务主要是因为宿主机不能增加硬盘设备,若宿主机可以添加硬盘,此问题可解。

综上所述,问题根本在于对宿主机的操作了解不够清晰。

参考&鸣谢