什么是 CephFS
CephFS 是一个基于 Ceph 集群且兼容 POSIX 标准的文件系统。创建 cephfs 文件系统时需要在 Ceph 集群中添加 mds 服务,该服务负责处理 POSIX 文件系统中的 metadata 部分,实际的数据部分交由 ceph 集群中的 OSD 处理。
cephfs 支持以内核模块方式加载,也支持 fuse(普通用户) 方式加载。无论是内核模式还是 fuse 模式,都是通过调用 libcephfs 库来实现 cephfs 文件系统的加载,而 libcephfs 库又调用 librados 库与 ceph 集群进行通信,从而实现 cephfs 的加载。
实验环境
Ceph 集群部署方式: Cephadm
主机名 | 系统 | Public 地址 | Cluster 地址 | 配置 | 角色 |
---|---|---|---|---|---|
ceph-mon01 | Rocky Linux 9.5 | 172.31.100.181 | 172.31.100.221 | 2C 4G | mon,mgr,mds |
ceph-mon02 | Rocky Linux 9.5 | 172.31.100.182 | 172.31.100.222 | 2C 4G | mon,mgr,mds |
ceph-mon03 | Rocky Linux 9.5 | 172.31.100.183 | 172.31.100.223 | 2C 4G | mon,mgr,mds |
ceph-osd01 | Rocky Linux 9.5 | 172.31.100.184 | 172.31.100.224 | 2C 4G | osd |
ceph-osd02 | Rocky Linux 9.5 | 172.31.100.185 | 172.31.100.225 | 2C 4G | osd |
ceph-osd03 | Rocky Linux 9.5 | 172.31.100.186 | 172.31.100.226 | 2C 4G | osd |
创建 CephFS
自动创建 CephFS
使用 CephFS 文件系统需要一个或多个 MDS 守护进程。如果使用较新的 ceph fs volume
接口创建新文件系统,则会自动创建这些文件系统。
创建一个 CephFS 卷
1
ceph fs volume create k8sfs --placement="<placement spec>"
–placement: 是 MDS 守护进程的放置,例如,要将新 k8sfs 卷的 MDS 守护程序放置在标有 mds 的主机上
1
ceph fs volume create k8sfs --placement="label:mds"
查看集群状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# ceph -s
cluster:
id: 5c06da72-ae24-11ef-adb0-005056814a7e
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-mon01,ceph-mon02,ceph-mon03 (age 29m)
mgr: ceph-mon01.opohnu(active, since 28m), standbys: ceph-mon02.ufqfgy
mds: 1/1 daemons up
osd: 3 osds: 3 up (since 28m), 3 in (since 34m)
data:
volumes: 1/1 healthy
pools: 3 pools, 145 pgs
objects: 24 objects, 451 KiB
usage: 92 MiB used, 300 GiB / 300 GiB avail
pgs: 145 active+clean查看文件系统
1
2# ceph fs ls
name: k8sfs, metadata pool: cephfs.k8sfs.meta, data pools: [cephfs.k8sfs.data ]查看 MDS 状态
1
2# ceph mds stat
k8sfs:1 {0=k8sfs.ceph-mon03.chlgzu=up:active} 2 up:standby
手动创建
Ceph 文件系统至少需要两个 RADOS 池,一个用于数据(data),一个用于元数据(metadata)。
创建两个 pool 供文件系统使用
1
2ceph osd pool create cephfs.k8sfs.data
ceph osd pool create cephfs.k8sfs.meta元数据池通常最多保存几 GB 的数据。因此,通常建议使用较小的 PG 数。 64 或 128 在实践中通常用于大型集群。
创建文件系统,创建池后,可以使用
fs new
命令启用文件系统:1
ceph fs new k8sfs cephfs.k8sfs.meta cephfs.k8sfs.data
查看文件系统
1
2
3
4
5
6
7
8
9
10
11
12# ceph fs status
k8sfs - 0 clients
=====
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active k8sfs.ceph-mon03.chlgzu Reqs: 0 /s 10 13 12 0
POOL TYPE USED AVAIL
cephfs.k8sfs.meta metadata 96.0k 94.9G
cephfs.k8sfs.data data 0 94.9G
STANDBY MDS
k8sfs.ceph-mon01.xcdglr
k8sfs.ceph-mon02.gybxqv
MDS version: ceph version 18.2.4 (e7ad5345525c7aa95470c26863873b581076945d) reef (stable)创建文件系统后,MDS 将能够进入活动状态。查看 MDS 状态
1
2# ceph mds stat
k8sfs:1 {0=k8sfs.ceph-mon03.chlgzu=up:active} 2 up:standby
创建文件系统并且 MDS 处于活动状态后,就可以挂载文件系统了。如果创建了多个文件系统,则在挂载时将选择使用哪一个。
挂载 CephFS
Cephfs 有用户态 fuse 和 内核态 mount 两种挂载使用方式,FUSE 客户端是最容易访问并且最容易升级到存储集群使用的Ceph版本的,而内核客户端总是会提供更好的性能。
先决条件
在挂载 CephFS 之前,请确保客户端主机(必须挂载和使用 CephFS 的客户端主机)具有 Ceph 配置文件(即 ceph.conf)的副本以及有权访问 MDS 的 CephX 用户的密钥环。这两个文件必须已存在于 Ceph MON 所在的主机上。
为客户端主机生成一个最小的conf文件并将其放置在标准位置:
1
2mkdir -p -m 755 /etc/ceph
ssh root@172.31.100.181 "ceph config generate-minimal-conf" | tee /etc/ceph/ceph.conf确保conf具有适当的权限:
1
chmod 644 /etc/ceph/ceph.conf
创建一个 CephX 用户并获取其密钥:
1
ssh root@172.31.100.181 "ceph fs authorize k8sfs client.k8sfs / rw" | tee /etc/ceph/ceph.client.k8sfs.keyring
在上面的命令中,将 cephfs 替换为您的 CephFS 名称,将 foo 替换为您想要的 CephX 用户名称,将 / 替换为您希望允许访问客户端主机的 CephFS 中的路径,rw 代表读取和写入权限。或者,您可以将 Ceph 密钥环从 MON 主机复制到位于 /etc/ceph 的客户端主机,但创建特定于客户端主机的密钥环会更好。创建 CephX 密钥环/客户端时,在多台计算机上使用相同的客户端名称是完全可以的。
确保密钥环具有适当的权限:
1
chmod 600 /etc/ceph/ceph.client.k8sfs.keyring
使用内核驱动程序挂载 CephFS
CephFS 内核驱动程序是 Linux 内核的一部分。它允许将 CephFS 安装为具有本机内核性能的常规文件系统。它是大多数用例的首选客户端
安装
ceph-common
软件包1
apt install ceph-common -y
创建挂载目录,并挂载 k8sfs 文件系统
1
2
3mkdir /data
mount -t ceph k8sfs@.k8sfs=/ /data查看挂载的目录
1
2# df -Th |grep /data
k8sfs@6a90277a-b14d-11ef-b6a5-005056814a7e.k8sfs=/ ceph 95G 0 95G 0% /data配置开机自动挂载,写入
/etc/fstab
文件1
echo 'k8sfs@.k8sfs=/ /data ceph noatime,_netdev 0 0' >> /etc/fstab
使用 fuse 方式挂载 CephFS
ceph-fuse 是挂载 CephFS 的另一种方法,尽管它挂载在用户空间中。因此,FUSE 的性能可能相对较低,但 FUSE 客户端更易于管理,尤其是在升级 CephFS 时。
安装
ceph-fuse
软件包1
apt install -y ceph-fuse
创建挂载目录,并挂载 k8sfs 文件系统
1
2
3
4
5
6
7
8
9mkdir /data
ceph-fuse --id client.k8sfs /data
2024-12-04T16:44:03.841+0800 7a4c790843c0 -1 init, newargv = 0x6273d8c2dc80 newargc=13
2024-12-04T16:44:03.841+0800 7a4c790843c0 -1 init, args.argv = 0x6273d8c2de50 args.argc=4
ceph-fuse[386773]: starting ceph client
ceph-fuse[386773]: starting fuse
Ignoring invalid max threads value 4294967295 > max (100000).查看挂载的目录
1
2# df -Th |grep /data
ceph-fuse fuse.ceph-fuse 95G 0 95G 0% /data配置开机自动挂载,写入
/etc/fstab
文件1
echo 'none /data fuse.ceph ceph.id=k8sfs,_netdev,defaults 0 0' >> /etc/fstab