Ceph是一个免费的存储平台,它在单个分布式计算机集群上实现对象存储,并为对象、块和文件级存储提供接口。Ceph的主要目标是完全分布式操作,没有单点故障。Ceph存储管理数据复制,通常是相当容错的。作为其设计的结果,该系统是自我修复和自我管理的。
Ceph有大量的好处和伟大的功能,但主要的缺点是你必须自己托管和管理它。在这篇文章中,我们将检查两种不同的虚拟机部署的方法与Ceph。
剖析Ceph集群
在我们深入到实际的部署过程之前,让我们看看我们需要为我们自己的Ceph集群启动什么。
有三个服务构成了集群的骨干部分
- ceph监控器(ceph-mon)维护集群状态的地图,也负责管理守护进程和客户端之间的认证
- 管理者(ceph-mgr)负责跟踪运行时的指标和Ceph集群的当前状态
- 对象存储守护进程(ceph-osd)存储数据,处理数据复制、恢复、再平衡,并提供一些ceph监控信息。
此外,我们可以在集群中添加更多的部分来支持不同的存储方案
- 元数据服务器(ceph-mds)代表Ceph文件系统存储元数据
- rados网关(ceph-rgw)是一个HTTP服务器,用于与Ceph存储集群互动,提供与OpenStack Swift和Amazon S3兼容的接口。
有多种方法来部署这些服务。我们将检查其中的两个。
- 首先,使用
ceph/deploy工具。 - 然后是基于docker-swarm的虚拟机部署。
让我们开始吧!
Ceph设置
好的,首先是一个免责声明。由于这不是一个生产基础设施,我们将削减一些角落。
你不应该在同一台主机上运行多个不同的Ceph恶魔,但为了简单起见,我们将只使用3个虚拟机为整个集群。
在OSD的情况下,你可以在同一台主机上运行多个OSD,但为多个实例使用同一存储驱动器是一个坏主意,因为磁盘的I/O速度可能会限制OSD守护程序的性能。
对于这个教程,我在AWS创建了4个EC2机器。3个用于Ceph本身和1个管理节点。对于ceph-deploy的工作,管理节点需要无密码的SSH访问节点和SSH用户必须有无密码的sudo权限。
在我的案例中,由于所有的机器都在AWS的同一个子网中,它们之间的连接不是一个问题。然而,在其他情况下,编辑hosts文件可能是必要的,以确保正确的连接。
根据你部署Ceph安全组的地方,防火墙设置或其他资源必须被调整以打开这些端口
- 22用于SSH
- 6789用于监视器
- 6800:7300用于OSD,管理器和元数据服务器
- 8080用于仪表板
- 7480用于rados网关
不多说了,让我们开始部署。
Ceph存储的部署
在所有机器上安装先决条件
$ sudo apt update
$ sudo apt -y install ntp python
对于Ceph的无缝工作,我们必须确保系统的时钟不被歪曲。建议的解决方案是在所有的机器上安装ntp,它将照顾到这个问题。同时,让我们在所有主机上安装python,因为ceph-deploy依赖于它在目标机器上的可用性。
准备好管理节点
$ ssh -i ~/.ssh/id_rsa -A ubuntu@13.53.36.123
由于所有的机器都有我的公钥添加到known_hosts ,感谢AWS,我可以使用ssh代理转发,从管理节点访问Ceph机器。第一行确保我的本地ssh代理有适当的密钥在使用,而-A标志则负责转发我的密钥。
$ wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -
echo deb https://download.ceph.com/debian-nautilus/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
$ sudo apt update
$ sudo apt -y install ceph-deploy
在这个例子中,我们将使用最新的 nautilus 版本。如果你想部署一个不同的版本,只需将debian-nautilus 部分改为你想要的版本(luminous, mimic, 等等)。
$ echo "StrictHostKeyChecking no" | sudo tee -a /etc/ssh/ssh_config > /dev/null
或者
$ ssh-keyscan -H 10.0.0.124,10.0.0.216,10.0.0.104 >> ~/.ssh/known_hosts
Ceph-deploy使用SSH连接来管理我们提供的节点。每次你 SSH 到一台不在 known_hosts 列表中的机器(~/.ssh/known_hosts) ,你都会被提示是否要继续连接。这种中断与部署过程不相吻合,所以我们要么使用ssh-keyscan 来抓取所有目标机的指纹,要么直接禁用严格的主机密钥检查。
10.0.0.124 ip-10-0-0-124.eu-north-1.compute.internal ip-10-0-0-124
10.0.0.216 ip-10-0-0-216.eu-north-1.compute.internal ip-10-0-0-216
10.0.0.104 ip-10-0-0-104.eu-north-1.compute.internal ip-10-0-0-104
尽管目标机和我们的管理员在同一个子网中,而且它们可以互相访问,但我们必须把它们添加到主机文件(/etc/hosts)中,以使ceph-deploy正常工作。Ceph-deploy通过提供的主机名来创建监控器,所以要确保它与机器的实际主机名相匹配,否则监控器将无法加入法定人数,部署就会失败。不要忘了重新启动管理节点以使变化生效。
$ mkdir ceph-deploy
$ cd ceph-deploy
作为准备工作的最后一步,让我们创建一个专门的文件夹,因为ceph-deploy将在这个过程中创建多个配置文件和密钥文件。
部署资源
$ ceph-deploy new ip-10-0-0-124 ip-10-0-0-216 ip-10-0-0-104
命令ceph-deploy new ,为部署创建必要的文件。把监控节点的主机名传给它,它将创建cepf.conf 和ceph.mon.keyring 以及一个日志文件。
ceph-conf应该是这样的
[global]
fsid = 0572e283-306a-49df-a134-4409ac3f11da
mon_initial_members = ip-10-0-0-124, ip-10-0-0-216, ip-10-0-0-104
mon_host = 10.0.0.124,10.0.0.216,10.0.0.104
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
它有一个独特的ID,叫做fsid ,监视器的主机名和地址以及认证模式。Ceph 提供了两种认证模式:无(任何人都可以访问数据,无需认证)或 cephx(基于密钥的认证)。
另一个文件,监视器的钥匙圈是另一个重要的拼图,因为在一个有多个监视器的集群中,所有的监视器必须有相同的钥匙圈。幸运的是 ceph-deploy 在虚拟部署期间照顾到了密钥文件的传播。
$ ceph-deploy install --release nautilus ip-10-0-0-124 ip-10-0-0-216 ip-10-0-0-104
你可能已经注意到了,到目前为止,我们还没有在目标节点上安装ceph。我们可以一个一个地做,但更方便的方法是让 ceph-deploy 来处理这个任务。不要忘记指定你选择的版本,否则你可能会遇到管理员和目标之间的不匹配。
$ ceph-deploy mon create-initial
最后,集群的第一块已经开始运行了!create-initial ,将部署我们之前生成的ceph.conf 中指定的监视器,同时收集各种关键文件。该命令只有在所有的监控器都启动并在quorum中才会成功完成。
$ ceph-deploy admin ip-10-0-0-124 ip-10-0-0-216 ip-10-0-0-104
执行 ceph-deploy admin 将推送一个 Ceph 配置文件和ceph.client.admin.keyring 到节点的/etc/ceph 目录,所以我们可以使用 ceph CLI 而不需要每次执行命令时都提供 ceph.client.admin.keyring。
在这一点上,我们可以偷看一下我们的集群。让我们通过SSH进入目标机(由于代理转发,我们可以直接从管理节点做)并运行sudo ceph status 。
$ sudo ceph status
cluster:
id: 0572e283-306a-49df-a134-4409ac3f11da
health: HEALTH_OK
services:
mon: 3 daemons, quorum ip-10-0-0-104,ip-10-0-0-124,ip-10-0-0-216 (age 110m)
mgr: no daemons active
osd: 0 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:
在这里,我们可以快速了解到我们目前的情况。我们的集群似乎是健康的,所有三个监视器都列在服务下。让我们回到管理员那里,继续添加部件。
$ ceph-deploy mgr create ip-10-0-0-124
对于luminous+的构建,需要一个管理器守护程序。它负责监控集群的状态,同时也管理模块/插件。
好了,现在我们已经有了所有的管理,让我们为集群添加一些存储,使其真正有用,好吗?
首先,我们必须找出(在每个目标机上)我们要使用的驱动器的标签。要获取一个特定节点上的可用磁盘列表,请运行
$ ceph-deploy disk list ip-10-0-0-104
这里有一个输出样本。

$ ceph-deploy osd create --data /dev/nvme1n1 ip-10-0-0-124
$ ceph-deploy osd create --data /dev/nvme1n1 ip-10-0-0-216
$ ceph-deploy osd create --data /dev/nvme1n1 ip-10-0-0-104
在我的例子中,所有3台机器上的标签都是nvme1n1 (AWS提供的),所以为了向集群添加OSD,我只需运行这3条命令。
在这一点上,我们的集群基本上已经准备好了。我们可以运行ceph status ,看看我们的监视器、管理器和OSD是否已经启动和运行。但是没有人愿意每次都用SSH进入一台机器来检查集群的状态。幸运的是,Ceph有一个相当整洁的仪表板,我们只需要启用它。
...或者至少我是这么想的。仪表盘是在luminous版本中引入的,并在mimic中进一步改进。然而,目前我们正在部署nautilus,最新版本的Ceph。在尝试了通过管理器启用仪表板的常规方法后
$ sudo ceph mgr module enable dashboard
我们得到一个错误信息:Error ENOENT: all mgr daemons do not support module 'dashboard', pass --force to force enablement 。
原来,在nautilus中,仪表盘包已经不再默认安装了。我们可以通过运行以下程序检查可用的模块
$ sudo ceph mgr module ls
而正如预期的那样,仪表盘并不在那里,它是以一个单独的包的形式出现的。所以我们必须先安装它,幸运的是这很容易。
$ sudo apt install -y ceph-mgr-dashboard
现在我们可以启用它了,对吗?没那么快。有一个依赖项必须安装在所有的管理员主机上,否则我们会得到一个略带神秘的错误信息:Error EIO: Module 'dashboard' has experienced an error and cannot handle commands: No module named routes 。
$ sudo apt install -y python-routes
我们现在可以启用仪表板模块了。由于这是一个面向公众的页面,需要登录,我们应该为SSL设置一个证书。为了简单起见,我只是禁用了SSL功能。你不应该在生产中这样做,请查看官方文档以了解如何正确设置证书。另外,我们需要创建一个管理员用户,这样我们就可以登录到我们的仪表板。
$ sudo ceph mgr module enable dashboard
$ sudo ceph config set mgr mgr/dashboard/ssl false
$ sudo ceph dashboard ac-user-create admin secret administrator
默认情况下,仪表板在运行管理器的主机上可用,端口为8080。登录后,我们会得到一个集群状态的概述,在集群菜单下,我们会得到每个正在运行的守护程序的真正详细的概述。


如果我们试图导航到Filesystems 或Object Gateway 标签,我们会得到一个通知,说我们没有配置访问这些功能所需的资源。我们的集群现在只能作为一个块存储使用。我们必须部署一些额外的东西来扩展其可用性。
快速迂回。如果你正在寻找一家可以帮助你的Ceph公司,或者一般的DevOps公司,请随时联系我们RisingStack!
使用Ceph文件系统
回到我们的管理节点,运行
$ ceph-deploy mds create ip-10-0-0-124 ip-10-0-0-216 ip-10-0-0-104
将创建元数据服务器,现在还没有激活,因为我们还没有启用这个功能。首先,我们需要创建两个RADOS池,一个用于实际数据,一个用于元数据。
$ sudo ceph osd pool create cephfs_data 8
$ sudo ceph osd pool create cephfs_metadata 8
在创建池子的时候,有几件事情需要考虑,我们在这里不做介绍。请查阅文档以了解更多细节。
在创建了所需的池之后,我们准备启用文件系统功能了
$ sudo ceph fs new cephfs cephfs_metadata cephfs_data
MDS守护进程现在可以进入活动状态了,我们准备挂载文件系统。我们有两个选择,通过内核驱动或者以FUSE的形式,通过ceph-fuse 。
在我们继续挂载之前,让我们创建一个用户钥匙圈,我们可以在两个方案中使用授权和认证,因为我们已经启用了cephx。当创建一个新的密钥时,有多种限制,可以在文档中指定。例如。
$ sudo ceph auth get-or-create client.user mon 'allow r' mds 'allow r, allow rw path=/home/cephfs' osd 'allow rw pool=cephfs_data' -o /etc/ceph/ceph.client.user.keyring
将创建一个新的客户端密钥,名称为user 并将其输出到ceph.client.user.keyring 。它将为MDS提供对/home/cephfs 目录的写权限,而客户端将只有在cephfs_data 池内的写权限。
用内核安装
现在让我们创建一个专门的目录,然后使用之前生成的钥匙圈中的密钥,用内核挂载文件系统。
$ sudo mkdir /mnt/mycephfs
$ sudo mount -t ceph 13.53.114.94:6789:/ /mnt/mycephfs -o name=user,secret=AQBxnDFdS5atIxAAV0rL9klnSxwy6EFpR/EFbg==
用FUSE挂载
用FUSE挂载文件系统也没有什么不同。它需要安装ceph-fuse 包。
$ sudo apt install -y ceph-fuse
在我们运行这个命令之前,我们必须从Ceph主机上获取ceph.conf 和ceph.client.user.keyring 文件,并把它们放到/etc/ceph中。最简单的解决方案是使用scp 。
$ sudo scp ubuntu@13.53.114.94:/etc/ceph/ceph.conf /etc/ceph/ceph.conf
$ sudo scp ubuntu@13.53.114.94:/etc/ceph/ceph.client.user.keyring /etc/ceph/ceph.keyring
现在我们已经准备好挂载文件系统了。
$ sudo mkdir cephfs
$ sudo ceph-fuse -m 13.53.114.94:6789 cephfs
使用 RADOS 网关
为了启用集群的S3管理功能,我们必须添加最后一块,rados网关。
$ ceph-deploy rgw create ip-10-0-0-124
对于仪表盘,需要创建一个带有system 标志的radosgw-admin 用户来启用对象存储管理界面。在我们开始使用仪表盘之前,我们还必须向仪表盘提供用户的access_key 和secret_key 。
$ sudo radosgw-admin user create --uid=rg_wadmin --display-name=rgw_admin --system
$ sudo ceph dashboard set-rgw-api-access-key <access_key>
$ sudo ceph dashboard set-rgw-api-secret-key <secret_key>
使用Ceph对象存储真的很容易,因为RGW提供了一个与S3相同的接口。你可以使用你现有的S3请求和代码,无需任何修改,只需要改变连接字符串,访问和秘密密钥。
Ceph存储监控
我们部署的仪表板显示了很多关于我们集群的有用信息,但监控并不是它最强的功能。幸运的是,Ceph有一个Prometheus模块。运行Prometheus模块后,它就会被启用。
$ sudo ceph mgr module enable prometheus
在默认情况下,各种各样的指标将在9283端口的给定主机上可用。为了利用这些暴露的数据,我们必须建立一个Prometheus实例。
我强烈建议在一个独立的机器上运行下面的容器,与你的Ceph集群分开。如果你只是在做实验(像我一样),不想使用大量的虚拟机,在启动docker之前,请确保你的虚拟机上有足够的内存和CPU,因为如果资源用完了,会导致奇怪的行为和崩溃。
有多种方法可以启动Prometheus,最方便的可能是使用docker。在你的机器上安装docker后,创建一个prometheus.yml 文件,提供它可以访问我们的Ceph度量的端点。
# /etc/prometheus.yml
scrape_configs:
- job_name: 'ceph'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['13.53.114.94:9283]
然后通过运行来启动容器本身。
$ sudo docker run -p 9090:9090 -v /etc/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
普罗米修斯将开始刮取我们的数据,并在其仪表板上显示出来。我们可以在其主机上的端口9090 。普罗米修斯的仪表盘很好,但并没有提供一个非常赏心悦目的仪表盘。这就是为什么它通常与Graphana配对使用的主要原因,Graphana为Prometheus提供的数据提供了很好的可视化效果。它也可以用docker启动。
$ sudo docker run -d -p 3000:3000 grafana/grafana
在可视化方面,Grafana非常棒,但设置仪表盘可能是一项艰巨的任务。为了使我们的生活更容易,我们可以加载一个预先准备好的仪表盘,例如这个。

Ceph的部署。吸取的教训和下一步
CEPH可以是AWS S3或其他对象存储的一个很好的选择,当在公共云中运行你的服务时,在私有云中运行你的服务根本不是一个选项。事实上,它提供了一个与S3兼容的接口,使它更容易移植其他以 "云优先 "心态编写的工具。它还能与Prometheus很好地配合,因此你不需要担心为它设置适当的监控,或者你可以把它换成一个更简单、更有战斗力的解决方案,如Nagios。
在这篇文章中,我们将CEPH部署在裸露的虚拟机上,但你可能需要将它整合到你的KubernetesKubernetes(通常缩写为K8s)提供了一个框架来有效运行分布式系统。它是一个帮助管理容器化工作负载和服务的平台,甚至还负责扩展。谷歌在2014年将其开源。或Docker Swarm集群。虽然在你的容器编排工具旁边的虚拟机上安装它是完全可以的,但你可能想在部署CEPH集群时利用它们提供的服务。如果这是你的用例,请继续关注我们下一篇关于CEPH的文章,我们将看看在Docker Swarm和Kubernetes上使用CEPH所需的黑魔法。
The postHow to Deploy a Ceph Storage to Bare Virtual Machinesappeared first onRisingStack Engineering.