ceph docker
Ceph是一个完全开源的分布式对象存储,网络块设备和文件系统,旨在实现从TB到TB的可靠性,性能和可伸缩性。 Ceph利用新颖的放置算法( CRUSH ),活动存储节点和对等八卦协议来避免与集中式控制器和查找表相关的可伸缩性和可靠性问题。 Ceph是一个庞大且不断发展的生态系统的一部分,它集成在虚拟化平台(Proxmox),云平台(OpenStack,CloudStack,OpenNebula),容器(Docker)和大数据(Hadoop,作为HDFS的服务器)中。
自从我第一次尝试在Docker中运行Ceph以来,已经过去了将近两年。 直到最近,我才真正有时间恢复这项工作。 在过去的几个月中,我一直在花一些时间为在Docker中部署Ceph做出贡献。
(在开始之前,我想强调一下,如果没有SeánC. McCord的帮助,将无法完成任何这项工作。确实,当前的ceph-docker存储库基于Seán的最初工作。)
现在,让我们深入研究如何运行它!
基本原理
在Docker中运行Ceph有点争议,因为许多人可能认为这样做是没有意义的。 对于监视器,元数据服务器和RADOS网关来说,虽然这并不是真正的问题,但是在OSD(对象存储守护程序)方面却变得有些棘手。 Ceph OSD已针对其运行的机器进行了优化,并且与硬件有着密切的关系。 如果OSD依赖的磁盘耗尽,则OSD无法工作,这在此容器世界中是一个问题。
老实说,有一次我发现自己在思考:
我不知道为什么要这么做。 我只知道外面的人想要它(是的,他们可能也不知道为什么)。 我认为无论如何都要尝试很重要,所以让我们开始吧。
我知道这听起来并不乐观,但这是事实。 不过,我的观点略有变化,因此,让我解释一下它的价值。 也许它也会改变您的想法。 (是的,我的解释不仅仅在于:Docker非常有趣,所以让我们对所有内容进行Dockerize。)
人们已经开始投入大量的工程工作来在其平台上运行容器化软件。 因此,他们一直在使用各种工具来构建和协调环境。 看到Kubernetes作为解决问题的协调工具,我不会感到惊讶。 有些人还喜欢在生产中使用尖端技术,因为他们可能会发现其他东西很无聊。 因此,采用“ 一切都容器化”方法,他们将很高兴自己喜欢的开源存储解决方案上发生了一些事情。
与yum
或apt-get
并不总是很容易回滚的容器不同,容器有所不同。 升级和回滚变得更加容易,因为您可以轻松地使用docker stop
和docker run
推出新版本的守护程序。 您还可以在同一台计算机上以隔离方式运行不同的群集。 这是发展的理想选择。
该项目
如前所述,一切都是从塞恩·麦考德(SeánC. McCord)的工作开始的,我们一起围绕他的工作进行了迭代。 当前,如果您使用ceph-docker,则可以在Ubuntu或CentOS上运行每个Ceph守护程序。 Docker Hub上有很多可用的映像。 我们使用Ceph命名空间,因此我们的图像以ceph/<daemon>
为前缀。 我们使用自动化构建; 结果,每次我们合并一个新的补丁程序时,都会触发新的构建并生成新版本的容器映像。 由于我们目前正在进行重构,因此您会看到很多图像可用。 从历史上看,每个守护进程只有一个映像(并且直到合并该补丁之前,我们仍然这样做)。 因此,一个用于监视,osd,mds和radosgw的容器映像。 这不是很理想,在实践中不需要。 这就是为什么我们处理单个名为daemon
容器映像的原因。 该映像包含所有Ceph守护进程,您可以在调用docker run
命令时使用参数激活所需的守护进程。 话虽如此,如果您想开始,我鼓励您直接使用ceph/daemon
映像。 在下一节中,我将显示一个如何运行它的示例。
容器化Ceph
监控器
鉴于监视器无法通过NATed网络进行通信,我们需要使用--net=host
公开Docker的主机网络堆栈:
$ sudo docker run -d --net=host \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
-e MON_IP=192.168.0.20 \
-e CEPH_PUBLIC_NETWORK=192.168.0.0/24 \
ceph/daemon mon
这是您可以使用的选项。
-
MON_IP
是运行Docker的主机的IP地址。 -
MON_NAME
是监视器的名称(默认值:$(主机名))。 -
CEPH_PUBLIC_NETWORK
是运行Docker的主机的CIDR。 它应该与MON_IP
在同一网络中。 -
CEPH_CLUSTER_NETWORK
是运行Docker的主机的辅助接口的CIDR。 用于OSD复制流量。
对象存储守护进程
当前的实现允许您为每个容器运行一个OSD进程。 遵循微服务的思维方式,我们不应在容器内运行多个服务。 在我们的情况下,在单个容器中运行多个OSD进程会破坏该规则,并且可能会引入不良行为。 这也将增加解决方案的设置和维护复杂性。
在此配置中,严格要求使用--privileged=true
因为我们需要对/dev/
和其他内核函数的完全访问权限。 但是,我们支持基于公开OSD目录的另一种配置,操作员将在其中适当地准备设备。 然后,他或她将简单地公开OSD目录,并通过入口点填充OSD( ceph-osd mkfs
)。 我现在要介绍的配置更容易开始,因为您只需要指定一个块设备,其余就由入口点完成。
那些不想使用--privileged=true
可以依靠第二个示例。
$ sudo docker run -d --net=host \
--privileged=true \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
-v /dev/:/dev/ \
-e OSD_DEVICE=/dev/vdd \
ceph-daemon osd_ceph_disk
如果您不想使用--privileged=true
,则始终可以在选择的配置管理的帮助下--privileged=true
准备OSD。
没有特权模式的示例,在此示例中,我们假设您已分区,放置了文件系统并安装了OSD分区。 要创建OSD,只需运行以下命令:
$ sudo docker exec <mon-container-id> ceph osd create.
然后像这样运行容器:
docker run -v /osds/1:/var/lib/ceph/osd/ceph-1 -v /osds/2:/var/lib/ceph/osd/ceph-2
$ sudo docker run -d --net=host \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
-v /osds/1:/var/lib/ceph/osd/ceph-1 \
ceph-daemon osd_disk_directory
这是您可以使用的选项。
-
OSD_DEVICE
是OSD设备,即:/dev/sdb
-
OSD_JOURNAL
是将用于存储OSD日志的设备,即:/dev/sdz
-
HOSTNAME
是OSD运行所在容器的主机名的主机名(默认值:$(hostname)) -
OSD_FORCE_ZAP
将强制切换给定设备的内容(DEFAULT:0和1强制执行该操作) -
OSD_JOURNAL_SIZE
是OSD日志的大小(默认值:100)
元数据服务器
这是一个非常简单易懂的引导程序。 目前唯一的警告是,我们要求Ceph管理员密钥在Docker中可用。 该密钥将用于创建CephFS池和文件系统。
如果您运行的是旧版本的Ceph(低于0.87),则不需要此功能,但您可能想知道,因为最好始终运行最新版本!
$ sudo docker run -d --net=host \
-v /var/lib/ceph/:/var/lib/ceph \
-v /etc/ceph:/etc/ceph \
-e CEPHFS_CREATE=1 \
ceph-daemon mds
这是您可以使用的选项。
-
MDS_NAME
是元数据服务器的名称(默认值:mds-$(主机名))。 -
CEPHFS_CREATE
将为您的元数据服务器创建一个文件系统(默认值:0和1启用它)。 -
CEPHFS_NAME
是元数据文件系统的名称(默认值:cephfs)。 -
CEPHFS_DATA_POOL
是元数据服务器的数据池的名称(默认值:cephfs_data)。 -
CEPHFS_DATA_POOL_PG
是数据池的放置组数(默认值:8)。 -
CEPHFS_DATA_POOL
是元数据服务器的元数据池的名称(默认值:cephfs_metadata)。 -
CEPHFS_METADATA_POOL_PG
是元数据池的放置组数(默认值:8)。
RADOS网关
对于RADOS网关,我们在默认情况下启用civetweb
部署它。 但是,可以通过简单地提供远程地址和端口来使用不同的CGI前端。
$ sudo docker run -d --net=host \
-v /var/lib/ceph/:/var/lib/ceph \
-v /etc/ceph:/etc/ceph \
ceph-daemon rgw
这是您可以使用的选项。
-
RGW_REMOTE_CGI
定义是否使用RADOS网关的嵌入式Web服务器(默认值:0和1禁用它)。 -
RGW_REMOTE_CGI_HOST
是运行CGI进程的远程主机。 -
RGW_REMOTE_CGI_PORT
是运行CGI进程的主机的远程端口。 -
RGW_CIVETWEB_PORT
是RGW_CIVETWEB_PORT
的侦听端口(默认值:80)。 -
RGW_NAME
是RADOS网关实例的名称(默认值:$ {hostname))。
进一步的工作
配置存储后端
默认情况下, ceph.conf
和所有Ceph密钥都是在初始监视器引导期间生成的。 该过程假设要将群集扩展到多个节点,则必须在所有节点上分布这些配置。 这不是很灵活,我们希望对此进行改进。 我将很快提出的一件事是使用Ansible生成配置/密钥并将其分发到所有计算机上。
另外,我们希望能够在不同的后端(例如etcd和consul)上存储各种配置文件。
编排部署
第一步是使用ceph-ansible ,其中已经实现了逻辑。 我仍然需要推动一些更改,但是大多数工作已经存在。 对于Kubernetes ,已经提供了有关如何引导监视器的预览。
扩展到火箭之外
这里没有什么可做的,因为您可以简单地将Docker映像移植到Rocket中并启动它们(双关语意)。
想了解更多? 以下是该过程的视频演示。
翻译自: https://opensource.com/business/15/7/running-ceph-inside-docker
ceph docker