Ceph:关于Ceph 中对象存储集群组件管理的一些笔记整理
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
写在前面
+
- 理解不足小伙伴帮忙指正
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
创建对象存储集群组件
使用逻辑卷创建 BlueStore OSD
BlueStore 简介
BlueStore
取代 FileStore
作为 OSD 的存储后端。FileStore 现已弃用
FileStore 将对象存储为块设备基础上的文件系统(通常是 XFS)中的文件。
BlueStore 将对象直接存储在原始块设备
上,免除了对文件系统层的需要,从而提高了读写操作速度,通过直接操作底层块设备来管理数据,而不是传统的文件系统。
这种方法提供了更好的性能和可靠性,因为可以将数据划分为较小的块并使用校验和来检测错误。此外,BlueStore可以直接与Solid State Drive(SSD)交互,并利用其快速读写速度。
BlueStore还具有可扩展性,可以处理数百万个物理盘和千亿个对象。它实现了动态负载平衡和自动恢复机制,以确保高可用性和数据可靠性。
BlueStore 架构
Ceph 集群中存储的对象具有:
- 集群范围的唯一标识符
- 二进制对象数据
- 对象元数据
BlueStore 将 对象元数据
存储在块数据库
中,块数据库将元数据作为键值对存储在 RocksDB
数据库中,这是一种高性能的键值存储,块数据库驻留于存储设备上的一个小型 BlueFS
分区,BlueFS 是一种最小的文件系统,设计用于保存 RocksDB
文件,BlueStore 利用预写式日志 (WAL)
以原子式将数据写入到块设备。预写式日志执行日志记录功能,并记录所有事务
BlueStore 性能
FileStore 先写入到日志,然后从日志中写入到块设备。
BlueStore 可避免这种双重写入的性能损失,直接将数据写入块设备,同时使用单独的数据流将事务记录到预写式日志。
当工作负载相似 时,BlueStore 的写操作速度约为 FileStore 的 两倍
,如果在集群中混用不同的存储设备,您可以自定义BlueStore OSD
来提入性能。
创建新的 BlueStore OSD
时,默认为将数据、块数据库和预写式日志
都放置到同一个块设备上
。从数据中分离块数据库和预写式日志,并将它们放入更快速的 SSD 或 NVMe 设备,或许能提高性能。
如果将块数据库或预写式日志放置到与对象数据不同的存储设备上,或许能够提升性能,但条件是这个设备的速度要快于主要存储设备。
例如,如果对象数据位于 HDD
设备上,可以通过将块数据库放在 SSD
设备上并将预写式日志放到 NVMe
设备上来提高性能
使用服务规范文件定义 BlueStore
数据、块数据库和预写日志设备的 位置。示例如下:
指定 OSD 服务对应的 BlueStore 设备
1 | service_type: osd |
BlueStore 存储后端提供下列功能:
- 允许将不同的设备用于数据、块数据库和预写式日志 (WAL)
- 支持以虚拟方式使用 HDD、SSD 和 NVMe 设备的任意组合
- 通过提高元数据效率,可以消除对存储设备的双重写入
BlueStore 在用户空间内运行,管理自己的缓存,并且其内存占用比 FileStore 少。如有需要,可以手动调优 BlueStore 参数,BlueStore 使用 RocksDB 存储键值元数据,BlueStore默认是自调优
,但如果需要,可以手动调优BlueStore参数
BlueStore 分区写数据的块大小为 bluestore_ min_alloc_size
参数的大小,缺省值为4kib
.
bluestore_min_alloc_size
参数指定了每个对象分配所需的最小空间量,即使对象实际大小较小也会分配该数量的空间。如果要写入的数据小于该大小,则 BlueStore 将剩余空间用0填充。
设置较小的 bluestore_min_alloc_size
可能会导致过多的碎片和浪费,因为一些较小的对象在分配时仍然需要使用与较大对象相同的空间。但是,如果设置较大的 bluestore_min_alloc_size ,则可能会浪费更多的空间,因为对象可能只使用其中的一部分空间。
总之,bluestore_min_alloc_size
参数应根据特定的工作负载和性能需求进行调整。对于需要存储许多小型对象的应用程序,可能需要将此值设置得较小,而对于需要存储大型对象的应用程序,可能需要将此值设置得较大。
BlueStore 数据库分片
BlueStore
可以限制存储在 RocksDB
中的大型 map
对象的大小,并将它们分布到多个列族中,这个过程被称为分片。
使用 sharding(分片) 时,将访问修改频率相近的密钥分组,以提高性能
和节省磁盘空间
。Sharding 可以缓解RocksDB压缩的影响,压缩数据库之前,RocksDB 需要达到一定的已用空间,这会影响 OSD 性能,这些操作与已用空间级别无关,可以更精确地进行压缩,并将对 OSD 性能的影响降到最低
Red Hat建议配置的 RocksDB 空间至少为数据设备大小的 4%
在Red Hat Ceph Storage 5(Ceph Nautilus(14.x)) 中,默认启用分片,从早期版本迁移过来的集群的osd中没有启用分片,从以前版本迁移过来的集群中的osd将不会启用分片
使用 ceph config get
验证一个 OSD 是否启用了 sharding ,并查看当前的定义
1 | [ceph: root@clienta /]# ceph \ |
为 true 的时候说明默认启用了分片
osd 分片的参数定义
1 | [ceph: root@clienta /]# ceph \ |
block_cache={type=binned_lru}
: 这是 RocksDB
的缓存设置。这里使用了 binned LRU 策略作为块缓存的替换策略。
L
: 这是 BlueStore 的 日志设置
,表示将日志写入硬盘而不是内存。这对数据持久性非常重要,因为任何未同步的写操作都会在下次启动时丢失。
P
: 这是 BlueStore 的 预分配设置
。预分配是一种优化技术,可以在写入新对象时事先分配足够的磁盘空间,以减少写入延迟和碎片。此处,“P”表示预分配已启用。
m(3) p(3,0-12) O(3,0-13)
:在这个映射中
- m(3) 表示使用 mon0、mon1 和 mon2 作为监视器。
- p(3,0-12) 表示
数据池
中有 13 个 PG,它们被分配到了 OSD 0 到 OSD 12 上 - O(3,0-13) 表示
对象池
中也有 13 个 PG,它们被分配到了 OSD 0 到 OSD 13 上
数据池(Data Pools)
:数据池用于存储客户端的数据。例如,如果您想在Ceph中创建一个文件系统或块设备,就必须将其存储在数据池中。数据池通常会经过复制或编码以提高容错性和可靠性。
对象池(Object Pools)
:对象池用于存储Ceph内部使用的对象,如 PG Map、OSD Map、Mon Map
等。这些对象也可以被视为元数据,因为它们包含了关于Ceph集群的配置信息和状态信息。与数据池不同,对象池通常不需要复制或编码,因为它们已经具有容错性和可靠性。
在大多数 Ceph
用例中,默认值
会带来良好的性能。生产集群的最佳分片定义取决于几个因素,Red Hat建议使用默认值,除非面临显著的性能问题。
在生产升级的集群中,可能需要权衡在大型环境中为 RocksDB 启用分片所带来的性能优势和维护工作
可以使用 BlueStore
管理工具 ceph-bluestore-tool
重新共享 RocksDB
数据库,而无需重新配置 osd
。要重新共享一个 OSD
,需要停止守护进程并使用 --sharding
选项传递新的 sharding
定义。--path
选项表示 OSD
数据 Location,默认为/var/lib/ceph/$fsid/osd.$ID/
1 | [ceph: root@node /]# ceph-bluestore-tool \ |
提供 BlueStore OSD
作为存储管理员,可以使用 Ceph Orchestrator
服务在集群中添加或删除osd,添加OSD时,需要满足以下条件:
- 设备不能有分区
- 设备不能被挂载
- 设备空间要求5GB以上
- 设备不能包含
Ceph BlueStore OSD
使用ceph orch device ls命令列出集群中主机中的设备
1 | [ceph: root@clienta /]# ceph orch device ls |
Available 列中标签为Yes的节点为OSD发放的候选节点。如果需要查看已使用的存储设备,请使用 ceph device ls
命令
使用ceph orch device zap命令准备设备,该命令删除所有分区并清除设备中的数据,以便将其用于资源配置,使用–force选项确保删除上一个OSD可能创建的任何分区
1 | [ceph: root@node /]# ceph orch \ |
回顾BlueStore配置方法
在rhcs5中,cephadm是提供和管理osd的推荐工具,它在后台使用cephvolume工具来进行OSD操作,cephadm工具可能看不到手动操作使用ceph -volume,建议仅为故障排除手动执行ceph-volume OSD
以 root 用户执行 ceph orch daemon add osd
命令,在指定主机上使用指定设备创建 osd
1 | [ceph: root@admin /]# ceph orch \ |
有多种方式提供OSDs与cephadm,根据需要的集群行为考虑适当的方法
基于Orchestrator提供
Orchestrator服务可以发现集群主机之间的可用设备,添加设备,并创建OSD守护进程。Orchestrator处理在主机之间平衡的新osd的放置,以及处理BlueStore设备选择
使用ceph orch apply osd –all-available-devices命令提供所有可用的、未使用的设备
1 | [ceph: root@node /]# ceph \ |
该命令创建一个OSD服务,名为osd.all-available-devices,使Orchestrator服务能够管理所有OSD供应。
Orchestrator从集群中的新磁盘设备和使用ceph orch设备zap命令准备的现有设备自动创建osd
若要禁用Orchestrator自动供应osd,请将非托管标志设置为true
1 | [ceph: root@node /]# ceph \ |
基于指定目标提供
可以使用特定的设备和主机创建OSD进程,使用ceph orch daemon add命令创建带有指定主机和存储设备的单个OSD守护进程
1 | [ceph: root@node /]# ceph orch daemon add osd node:/dev/vdb |
停止OSD进程,使用带OSD ID的ceph orch daemon stop命令
1 | [ceph: root@node /]# ceph arch daemon stop osd.12 |
使用ceph orch daemon rm命令移除OSD守护进程
1 | [ceph: root@node /)# ceph orch daemon rm osd.12 |
释放一个OSD ID,使用ceph osd rm命令
1 | [ceph: root@node /]# ceph osd rm 12 |
基于服务规范文件提供
使用服务规范文件描述OSD服务的集群布局,可以使用过滤器自定义服务发放,通过过滤器,可以在不知道具体硬件架构的情况下配置OSD服务,这种方法在自动化集群引导和维护窗口时很有用
下面是一个示例服务规范YAML文件,它定义了两个OSD服务,每个服务使用不同的过滤器来放置和BlueStore设备位置
1 | service_type: osd |
osd_size_and_model服务指定任何主机都可以用于放置,并且该服务将由存储管理员管理,数据设备必须有一个100gb或更多的设备,提前写日志必须有一个10 - 20gb的设备。数据库设备必须是My-Disk型号
osd_host_and_path服务指定目标主机必须在node6和node10之间的节点上提供,并且服务将由协调器服务管理,数据、数据库和预写日志的设备路径必须 /dev/sdb、 /dev/sdc 和 /dev/sdd,此服务中的设备将被加密
执行ceph orch apply命令应用服务规范
1 | [ceph: root@node /]# ceph orch apply -i service_spec.yaml |
其他OSD实用工具
ceph-volume命令是将逻辑卷部署为osd的模块化工具,它在框架类型中使用了插件,ceph -volume实用程序支持lvm插件和原始物理磁盘,它还可以管理由遗留的ceph-disk实用程序提供的设备
使用ceph-volume lvm命令手动创建和删除BlueStore osd,在块存储设备/dev/vdc上创建一个新的BlueStore OSD:
1 | [ceph: root@node /]# ceph-volume \ |
create子命令的另一种选择是使用ceph-volume lvm prepare和ceph -volume lvm activate子命令,通过这种方法,osd逐渐引入到集群中,可以控制新的osd何时处于up或in状态,因此可以确保大量数据不会意外地在osd之间重新平衡
prepare子命令用于配置OSD使用的逻辑卷,可以指定逻辑卷或设备名称,如果指定了设备名,则会自动创建一个逻辑卷
1 | [ceph: root@node /]# ceph-volume \ |
activate子命令为OSD启用一个systemd单元,使其在启动时启动,使用activate子命令时,需要从命令ceph-vo lume lvm list的输出信息中获取OSD的fsid (UUID)。提供唯一标识符可以确保激活正确的OSD,因为OSD id可以重用
1 | [ceph: root@node /]# ceph-volume \ |
创建OSD后,使用systemctl start ceph-osd@$id命令启动OSD,使其在集群中处于up状态
batch子命令可以同时创建多个osd。
1 | [ceph: root@node /]# ceph-volume \ |
inventory子命令用于查询节点上所有物理存储设备的信息
1 | [ceph: root@node /]# ceph-volume inventory |
4.2 创建和配置池
了解池的含义
池是存储对象的逻辑分区。Ceph客户端将对象写入池
Ceph客户机需要集群名称(默认情况下是Ceph)和一个监视器地址来连接到集群,Ceph客户端通常从Ceph配置文件中获取这些信息,或者通过指定为命令行参数来获取
Ceph客户端使用集群映射检索到的池列表来确定存储新对象的位置
Ceph客户端创建一个输入/输出上下文到一个特定的池,Ceph集群使用CRUSH算法将这些池映射到放置组,然后放置组映射到特定的osd
池为集群提供了一层弹性,因为池定义了可以在不丢失数据的情况下发生故障的osd的数量
池类型
可用的池类型有复制池和纠删代码池,工作负载的用例和类型可以帮助您确定要创建复制池还是纠删代码池
复制池是默认的池类型,通过将各个对象复制到多个 OSD 来发挥作用,它们需要更多的存储空间, 因为会创建多个对象副本,但读取操作不受副本丢失的影响
对于经常访问并且需要快速读取性能的数据,复制池通常都是更好的选择。纠删代码池需要的存储空间和网络带宽较小,但因为奇偶校验计算,计算开销会更高一些
对于不需要频繁访问且不需要低延迟的数据,纠删代码池通常是更好的选择。
每一种池的恢复时间取决于特定的部署和故障情景
创建池后,不能修改池的类型
池属性
在创建池时,您必须指定特定的属性:
pool name,必须在集群中唯一
pool type,决定了池用于确保数据持久性的保护机制
replicated 类型,将每个对象的多个副本分发到集群中
erasure coded 类型,将每个对象分割为多个区块,并将它们与额外的纠删代码区块一起分发,以使用自动纠错机制来保护对象
池中的 placement groups (PG) 数量,这将其对象存储到由 CRUSH 算法决定的一组 OSD 中
可选的 CRUSH rule set,Ceph 使用它来标识要用于存储池对象的放置组
更改 osd_pool_default_pg_num 和 osd_pool_default_pgp_num 配置设置,以设置池的默认 PG 数
创建复制池
Ceph通过为每个对象创建多个副本来保护复制池中的数据,Ceph使用CRUSH故障域来确定作用集的主要osd来存储数据,然后,Ceph使用CRUSH 故障域来决定主OSD来存储数据,然后住OSD查找当前的池副本数量并计算辅助OSD来写入数据,当主OSD收到写响应并完成写操作后,主OSD确认写成功到Ceph客户端,这样可以在一个或多个osd失效时保护对象中的数据
使用以下命令创建一个复制池
1 | [ceph: root@node /]# ceph osd pool create pool-name pg-num pgp-num replicated crush-rule-name |
其中:
pool_name 是新池的名称
pg_num 是为这个池配置的放置组 (PG) 总数
pgp_num 是这个池的有效放置组数量,将它设置为与 pg_num 相等
replicated 指定这是复制池,如果命令中未包含此参数,这是默认值
crush-rule-name 是想要⽤于这个池的 CRUSH 规则集的名称,osd_pool_default_crush_replicated_ruleset 配置参数设置其默认值
在初始配置池之后,可以调整池中放置组的数量,如果pg_num和pgp_num被设置为相同的数字,那么以后任何对pg_num的调整都会自动进行调整pgp_num的值。如果需要,对pgp_num的调整会触发跨osd的pg移动,以实现更改,使用以下命令在池中定义新的pg数量
1 | [ceph: root@node /]# ceph osd pool set my_pool pg_num 32 |
使用ceph osd pool create命令创建池时,不指定副本个数(size),osd_pool _default size配置参数定义了副本的数量,默认值为3
1 | [ceph: root@node /]# ceph config get mon osd_pool_default_size |
使用ceph osd pool set pooI-name size number-of-replica 命令修改池大小,或者,更新osd_pool_default_size配置设置的默认设置
osd_pool_default_min_size参数设置一个对象的拷贝数,必须可以接受I/O的请求,缺省值为2
配置Erasure编码池
Erasure编码池使用擦除编码代替复制来保护对象数据
存储在Erasure编码池中的对象被划分为多个数据块,这些数据块存储在单独的osd中,编码块的数量是根据数据块计算出来的,并存储在不同的osd中,当OSD出现故障时,编码块用于重建对象的数据,主OSD接收到写操作后,将写载荷编码成K+M块,通过Erasure编码池发送给备OSD
Erasure编码池使用这种方法来保护它们的对象,并且与复制池不同,它不依赖于存储每个对象的多个副本
总结Erasure编码池的工作原理:
每个对象的数据被划分为k个数据块
计算M个编码块
编码块大小与数据块大小相同
该对象总共存储在k + m个osd上
Erasure编码比复制更有效地利用存储容量,复制池维护一个对象的n个副本,而纠删编码只维护k + m块,例如,3副本的复制池使用3倍的存储空间,k=4和m=2的Erasure编码池只使用1.5倍的存储空间
Red Hat支持以下k+m值,从而产生相应的可用到原始比率:
4 + 2(1:1.5比率)
8 + 3(1:1.375比率)
8 + 4(1:1.5比率)
erasure code开销的计算公式为nOSD * k / (k+m) * 0SD大小,例如,如果您有64个4TB的osd(总共256 TB), k=8, m=4,那么公式是64 * 8 /(8+4)* 4 = 170.67,然后将原始存储容量除以开销,得到这个比率。256TB /170.67 TB = 1.5
与复制池相比,Erasure编码池需要更少的存储空间才能获得类似级别的数据保护,从而降低存储集群的成本和规模。但是,计算编码块会增加Erasure编码池的CPU处理和内存开销,从而降低整体性能
使用以下命令创建Erasure编码池
1 | [ceph: root@node /]# ceph \ |
其中:
pool-name 是新池的名称
pg-num 是这个池的放置组 (PG) 总数
pgp-num 是这个池的有效放置组数量,通常而言,这应当与 PG 总数相等
erasure 指定这是纠删代码池
erasure-code-profile 要使⽤的配置文件的名称,可以使用ceph osd erasure-code-profile set 命令创建新的配置⽂件,配置文件定义 k 和 m 值,以及要使用的纠删代码池插件。默认情况下,Ceph 使用default 配置文件
crush-rule-name 是要用于这个池的 CRUSH 规则集的名称。如果不设置,Ceph 将使用纠删代码池配置文件中定义的规则集
可以在池上配置放置组自动伸缩,自动缩放允许集群计算放置组的数量,并自动选择适当的pg_num值,自动缩放在Red Hat Ceph Storage 5中是默认启用的
集群中的每个池都有一个pg_autoscale_mode选项,其值为on、off或warn
on:启用自动调整池的PG计数
off:禁用池的PG自动伸缩
warn:当PG计数需要调整时,引发健康警报并将集群健康状态更改为HEALTH_WARN
本例在Ceph MGR节点上启用pg_autoscaler模块,并将池的自动缩放模式设置为on:
1 | [ceph: root@node /]# ceph mgr module enable pg_autoscaler |
纠删代码池不能使用对象映射特性,对象映射是一个对象索引,跟踪rbd对象块的分配位置,拥有池的对象映射可以提高调整大小、导出、扁平化和其他操作的性能。
Erasure Code配置文件
Erasure Code配置文件配置你的Erasure Code池用来存储对象的数据块和编码块的数量,以及使用哪些Erasure Code插件和算法
创建配置文件来定义不同的纠删编码参数集,Ceph在安装过程中自动创建默认概要文件,这个配置文件被配置为将对象分为两个数据块和一个编码块
使用以下命令创建一个新的概要文件
1 | [ceph: root@node /]# ceph \ |
以下是可用的参数:
k
跨osd分割的数据块的数量,缺省值为2
m
数据不可用前可能发生故障的osd数量,缺省值为1
directory
这个可选参数是插件库的位置,默认值为/usr/lib64/ceph/erasure-code
plugin
此可选参数定义要使用的纠删编码算法
crush-failure-domain
这个可选参数定义了CRUSH故障域,它控制块的放置,默认情况下,它被设置为host,这确保一个对象的块被放置在不同主机的osd上,如果设置为osd,那么一个对象的chunk可以放置在同一主机上的osd上,将故障域设置为osd,会导致主机上所有的osd故障,弹性较差,主机失败,可以定义并使用故障域,以确保块放置在不同数据中心机架或其他指定的主机上的osd上
crush-device-class
此可选参数仅为池选择由该类设备支持的osd,典型的类可能包括hdd、ssd或nvme
crush-root
该可选参数设置CRUSH规则集的根节点
key=value
插件可能具有该插件特有的键值参数
technique
每个插件提供一组不同的技术,用于实现不同的算法
不能修改已存在存储池的erasure code配置文件
使用ceph osd erasure-code-profile ls 命令列出已存在的配置文件
使用ceph osd erasure-code-profile get命令查看已创建配置文件的详细信息
使用ceph osd erasure-code-profile rm删除已存在的配置文件
管理和操作池
可以查看、修改已创建的存储池,并修改存储池的配置信息
使用ceph osd pool rename命令重命名池,这不会影响存储在池中的数据,如果重命名池,并且为经过身份验证的用户提供了每个池的功能,则必须使用新的池名称更新用户的功能
使用ceph osd pool delete命令删除osd池
使用ceph osd pool set pool_name nodelete true命令可以防止指定池被删除,使用实例将nodedelete设置为false以允许删除池
使用ceph osd pool set和ceph osd pool get命令查看和修改池配置
使用ceph osd lspoolls和ceph osd pool ls detail命令列出池和池配置设置
使用ceph df和ceph osd pool stats命令列出池的使用情况和性能统计信息
使用ceph osd pool application enable命令启用池中的Ceph应用,应用类型为Ceph File System的 cepfs、Ceph Block Device的rbd、RADOS Gateway的rgw
使用ceph osd pool set-quota命令设置池配额,限制池中最大字节数或最大对象数
当存储池达到设置的配额时,将阻止操作,可以通过将配额值设置为0来删除配额
配置这些设置值的示例,以启用对池重新配置的保护:
osd_ pool _default flag_nodelete
设置池上的nodedelete标志的默认值,设置该值为true,以防止删除池
osd_pool_default_flag_nopgchange
设置池上的nopgchange标志的默认值,设置为true可以防止pg_ num和pgp_num的变化
osd_pool_default_flag_nosizechange
设置池的nosizechange标志的默认值。设置该值为true,以防止池的大小变化
池名称空间
命名空间是池中对象的逻辑组,可以限制对池的访问,以便用户只能在特定的名称空间中存储或检索对象,名称空间的一个优点是限制用户访问池的一部分,名称空间对于限制应用程序的存储访问非常有用,它们允许对池进行逻辑分区,并将应用程序限制到池中的特定名称空间。
可以为每个应用程序专用一个完整的池,但是拥有更多的池意味着每个OSD拥有更多的pg,而pg在计算上是非常昂贵的,随着负载的增加,这可能会降低OSD的性能,使用名称空间,可以保持池的数量相同,而不必为每个应用程序专用整个池
要在名称空间中存储对象,客户机应用程序必须提供池和名称空间名称。默认情况下,每个池包含一个名称为空的名称空间,称为默认名称空间。
使用rados命令从池中存储和检索对象。使用-n name和–namespace=name选项指定要使用的池和命名空间
下面以将/etc/services文件作为srv对象存储在系统命名空间下的mytestpool池中为例
1 | [ceph: root@node /]# rados \ |
使用–all选项列出池中所有名称空间中的所有对象,要获得JSON格式的输出,请添加–format=j son-pretty选项
下面的例子列出了mytestpool池中的对象。mytest对象有一个空的名称空间。其他对象属于system或flowers名称空间
1 | [ceph: root@node /]# rados \ |
4.3 管理Ceph认证
用户身份验证
Red Hat Ceph Storage使用cephx协议对集群中客户端、应用程序和守护进程之间的通信进行授权。cephx协议基于共享密钥
安装过程默认启用cephx,因此集群需要所有客户端应用程序进行用户身份验证和授权,Ceph使用用户帐户有以下几个目的:
用于Ceph守护进程之间的内部通信
对于通过librados库访问集群的客户机应用程序
为集群管理员
Ceph守护进程使用的帐户名称与其关联的守护进程osd.1或mgr.serverc相匹配,并且其在安装过程中创建
使用librados的客户端应用程序所使用的帐户具有client.
名称前缀,例如,在集成OpenStack和Ceph时,通常会创建一个专用的client.openstack用户帐户。对于Ceph对象网关,安装会创建一个专用的client.rgw.hostname用户帐号,在librados之上创建定制软件的开发人员应该创建具有适当功能的专用帐户
管理员帐户名也具有client.前缀。在运行ceph、rados等命令时使用,安装程序创建超级用户帐户client.admin,具有允许帐户访问所有内容和修改集群配置的功能。Ceph使用client.admin帐户用于运行管理命令,除非使用–name或–id选项明确指定用户名
可以设置CEPH_ARGS环境变量来定义诸如集群名称或用户ID等参数
1 | [ceph: root@node /]# export CEPH_ARGS="--id cephuser" |
Ceph-aware应用程序的最终用户没有Ceph集群上的帐户。相反,他们访问应用程序,然后应用程序代表他们访问Ceph。从Ceph的角度来看,应用程序就是客户端。应用程序可以通过其他机制提供自己的用户身份验证
下图概述了应用程序如何提供自己的用户身份验证
Ceph对象网关有自己的用户数据库来认证Amazon S3和Swift用户,但使用client.rgw.hosttname用于访问集群的帐号
Keyring 文件
对于身份验证,客户端配置一个Ceph用户名和一个包含用户安全密钥的密钥环文件,Ceph在创建每个用户帐户时为其生成密匙环文件,但是,必须将此文件复制到需要它的每个客户机系统或应用程序服务器
在这些客户机系统上,librados使用来自/etc/ceph/ceph.conf的密匙环参数。Conf配置文件以定位密钥环文件。默认值为/etc/ceph/$cluster.$name.keyring
密匙环。例如,对于client.openstack帐户,密钥环文件/etc/ceph/ceph.client.openstack.keyring密匙环
密钥环文件以纯文本的形式存储密钥,对文件进行相应的Linux文件权限保护,仅允许Linux授权用户访问,只在需要Ceph用户的密匙环文件进行身份验证的系统上部署它
传输密钥
cephx协议不以纯文本的形式传输共享密钥,相反,客户机从Monitor请求一个会话密钥,Monitor使用客户机的共享密钥加密会话密钥,并向客户机提供会话密钥,客户机解密会话密钥并从Monitor请求票据,以对集群守护进程进行身份验证。这类似于Kerberos协议,cephx密钥环文件类似于Kerberos keytab文件
配置用户身份验证
使用命令行工具,如ceph、rados和rbd,管理员可以使用–id和–keyring选项指定用户帐户和密钥环文件。如果没有指定,命令作为client.admin进行身份验证
在本例中,ceph命令作为client.operator3进行身份验证列出可用的池
1 | [ceph: root@node /]# ceph \ |
在使用–id 的时候不适用client.的前缀,–id会自动使用client.前缀,而使用–name的时候就需要使用client.的前缀
如果将密钥环文件存储在默认位置,则不需要–keyring选项。cephadm shell自动从/etc/ceph/目录挂载密钥环
配置用户授权
创建新用户帐户时,授予群集权限,以授权用户的群集任务,cephx中的权限被称为能力,可以通过守护进程类型(mon、osd、mgr或mds)授予它们,使用功能来根据应用程序标记限制或提供对池、池的名称空间或一组池中的数据的访问。功能还允许集群中的守护进程相互交互
Cephx能力
在cephx中,对于每个守护进程类型,有几个可用的功能:
R 授予读访问权限,每个用户帐户至少应该对监视器具有读访问权限,以便能够检索CRUSH map
W 授予写访问权限,客户端需要写访问来存储和修改osd上的对象。对于manager (MGRs), w授予启用或禁用模块的权限
X 授予执行扩展对象类的授权,这允许客户端对对象执行额外的操作,比如用rados lock get或list列出RBD图像
***** 授予完全访问权
class-read和class-write 是x的子集,你通常在RBD池中使用它们
本例创建了formyappl用户帐户,并赋予了从任意池中存储和检索对象的能力:
1 | [ceph: root@node /]# ceph auth \ |
使用配置文件设置能力
Cephx提供预定义的功能配置文件,在创建用户帐户时,利用配置文件简化用户访问权限的配置
本例通过rbd配置文件定义新的forrbd用户帐号的访问权限,客户端应用程序可以使用该帐户使用RADOS块设备对Ceph存储进行基于块的访问
1 | [ceph: root@node /]# ceph auth \ |
rbd-read-only配置文件的工作方式相同,但授予只读访问权限,Ceph利用其他现有的配置文件在守护进程之间进行内部通信,不能创建自己的配置文件,Ceph在内部定义它们
下表列出了默认安装下Ceph的功能
能力 | 描述 |
---|---|
allow |
授予允许能力 |
r |
赋予用户读访问权限,需要监视器来检索CRUSH map |
w |
赋予用户对对象的写访问权 |
x |
使用户能够调用类方法(即读取和写入)并在监视器上执行身份验证操作 |
class-read | 赋予用户调用类读取方法的能力,x的子集 |
class-write | 赋予用户调用类写入方法的能力,x的子集 |
* | 为用户提供特定守护进程或池的读、写和执行权限,以及执行管理命令的能力 |
profile osd |
允许用户作为OSD连接到其他OSD或监视器,授予osd权限,使osd能够处理复制心跳流量和状态报告。 |
profile bootstrap-osd | 允许用户引导一个OSD,这样用户在引导一个OSD时就有了添加key的权限 |
profile rbd |
允许用户对Ceph块设备进行读写访问 |
profile rbd-read-only | 为用户提供对Ceph块设备的只读访问权限 |
限制访问
限制用户OSD的权限,使用户只能访问自己需要的池
下面的例子创建了formyapp2用户,并限制了他们对myapp池的读写权限:
1 | [ceph: root@node /]# ceph auth \ |
如果在配置功能时没有指定池,那么Ceph将在所有现有的池上设置它们,cephx机制可以通过其他方式限制对对象的访问:
通过对象名称前缀,下面的示例限制对任何池中名称以pref开头的对象的访问
1 | [ceph: root@node /]# ceph auth \ |
通过namespace,实现namespace来对池中的对象进行逻辑分组,然后可以将用户帐户限制为属于特定namespace的对象:
1 | [ceph: root@node /)# ceph auth \ |
通过路径,Ceph文件系统(cepphfs)利用这种方法来限制对特定目录的访问,下面的例子创建了一个新的用户帐户webdesigner,它只能访问/webcontent目录及其内容:
1 | [ceph: root@node /]# ceph \ |
通过monitor命令,这种方法将管理员限制在特定的命令列表中,创建operator1用户帐户并限制其访问两个命令的示例如下:
1 | [ceph: root@node /]# ceph auth \ |
用户管理
需要查询现有用户,使用ceph auth list命令
1 | [ceph: root@node /]# ceph auth list |
要获取特定帐户的详细信息,使用ceph auth get命令:
1 | [ceph: root@node /]# ceph auth get client.admin |
可以打印密钥:
1 | [ceph: root@node /]# ceph auth print-key client.adrnin |
需要导出和导入用户帐号,使用ceph auth export和ceph auth import命令
1 | [ceph: root@node /]# ceph auth \ |
创建新用户帐户
ceph auth get-or-create命令创建一个新用户帐户并生成它的密钥,该命令默认将该密钥打印到stdout,因此通常会添加-o选项来将标准输出保存到密钥环文件中。
本例创建了对所有池具有读写权限的app1用户帐户,并将密钥环文件存储在 /etc/ceph/ceph.client.app1.keyring
1 | [ceph: root@node /]# ceph auth \ |
身份验证需要密匙环文件,因此必须将该文件复制到使用此新用户帐户操作的所有客户端系统
修改用户能力
用 ceph auth caps 命令修改用户帐户的能力,这个例子修改了 osd 上的 appuser account 功能,只允许对myapp池进行读写访问:
1 | [ceph: root@node /]# ceph auth \ |
ceph auth caps
命令覆盖现有功能,使用该命令时,必须为所有守护进程指定完整的功能集,而不仅仅是要修改的那些。定义一个空字符串来删除所有功能。
1 | [ceph: root@node /]# ceph auth caps client.app1 osd '' |
删除用户帐号
ceph auth del命令用于删除用户帐号
1 | [ceph: root@node /]# ceph auth del client.app1 |
然后可以删除相关的密钥环文件
博文部分内容参考
© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知,这是一个开源项目,如果你认可它,不要吝啬星星哦 :)
© 2018-至今 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)
Ceph:关于Ceph 中对象存储集群组件管理的一些笔记整理
https://liruilongs.github.io/2023/04/16/rhca/CL260/ceph/Ceph:关于Ceph-中对象存储集群组件管理的一些笔记整理/