使用 cephadm 部署 Ceph 集群并配置 NFS 存储
myluzh 发布于 阅读:16 Kubernetes
0x00 环境说明
这篇记录一下使用 cephadm 部署 Ceph 集群的过程,后面顺手把 CephFS 和 NFS 也配置好,方便给其他业务挂载使用。
我这里的环境是 5 台节点,每台节点 4 块 500G 数据盘:
| 主机名 | IP | 角色 |
|---|---|---|
| ceph1 | 192.168.2.101 | bootstrap / mon / mgr / osd |
| ceph2 | 192.168.2.102 | mon / mgr / osd |
| ceph3 | 192.168.2.103 | mon / mgr / osd |
| ceph4 | 192.168.2.104 | mon / mgr / osd |
| ceph5 | 192.168.2.105 | mon / mgr / osd |
版本和规划:
- Ceph 版本:
17.2.7 - 部署方式:
cephadm - 容器运行时:
docker - 默认副本数:
3 - 原始容量:
5 * 4 * 500G = 10T - 三副本后可用容量:约
10T / 3 = 3.33T
Ceph 默认是三副本机制,不是说集群里有 10T 磁盘就能给业务用 10T。生产上要提前把副本、故障域、磁盘数量都算清楚,不然后面扩容会比较被动。
下面命令默认使用 root 执行,管理节点默认是 ceph1。
关于容量公式计算
1、Bennet Gallein Ceph Calculator
https://bennetgallein.de/tools/ceph-calculator
- 输入节点数、每节点容量、副本数
- 算出可用容量和安全容量(考虑节点故障场景)
2、 Zdalny Admin Ceph Calculator
https://zdalnyadmin.com.pl/ceph-calculator - 更全面,支持副本和纠删码两种模式
- 还会算 PG 数量建议
3、 Florian Ceph Calculator
https://florian.ca/ceph-calculator - 侧重"安全可用容量",计算坏掉最大节点后还能剩多少
手动算也很快,公式就是:
可用容量 = (节点数 × 每节点盘数 × 单盘容量) / 副本数
举例 3 台 × 4 块 × 500G / 3 副本 = 2T 可用
0x01 Ceph 组件简单说明
先把几个常见组件过一下,后面看命令会比较清楚。
| 组件 | 说明 |
|---|---|
| MON | Monitor,维护集群 map、选举、仲裁,保证集群状态一致 |
| MGR | Manager,负责 Dashboard、Prometheus、orchestrator 等管理能力 |
| OSD | Object Storage Daemon,真正负责数据读写、复制、恢复、平衡 |
| MDS | Metadata Server,CephFS 元数据服务,只有用 CephFS 时才需要 |
| RADOS | Ceph 底层对象存储系统,块、文件、对象最终都落到 RADOS |
| RGW | Rados Gateway,提供 S3 / Swift 这种对象存储接口 |
| CephFS | Ceph 文件系统,可以像普通文件系统一样挂载使用 |
| cephadm | 官方部署和运维工具,基于容器管理 Ceph daemon |
这篇主要用到 MON、MGR、OSD、CephFS、NFS 这几块。
0x02 所有节点初始化
配置 hosts
所有节点写同一份 hosts,主机名和解析一定要对齐。
cat >>/etc/hosts <<'EOF'
192.168.2.101 ceph1
192.168.2.102 ceph2
192.168.2.103 ceph3
192.168.2.104 ceph4
192.168.2.105 ceph5
EOF
如果 hostname 还没固定,可以顺手改掉:
hostnamectl set-hostname ceph1
# hostnamectl set-hostname ceph2
# hostnamectl set-hostname ceph3
# hostnamectl set-hostname ceph4
# hostnamectl set-hostname ceph5
安装基础依赖
所有节点安装基础工具、时间同步和 LVM。
apt-get update
apt-get install -y curl chrony lvm2
systemctl enable --now chrony
systemctl status chrony --no-pager
Ceph 对时间比较敏感,尤其是 MON,如果时间漂移太大,后面会出现各种奇怪的健康告警。
安装 docker
所有节点安装 docker,我这里直接用自己的安装脚本。
# 海外机器
curl -s https://oss.zywjjj.vip/docker-install.sh | bash -
# 国内机器
curl -s https://oss.zywjjj.vip/docker-install.sh | bash -s -- --mirror Aliyun
安装完检查一下:
docker version
systemctl enable --now docker
0x03 安装 cephadm
这里只需要在管理节点 ceph1 执行。
CEPH_RELEASE=17.2.7
curl --silent --remote-name --location \
https://download.ceph.com/rpm-${CEPH_RELEASE}/el9/noarch/cephadm
chmod +x cephadm
mv cephadm /usr/sbin/cephadm
cephadm version
如果下载比较慢,可以提前把 ceph 镜像拉下来:
docker pull quay.io/ceph/ceph:v17.2.7
0x04 bootstrap 初始化集群
后面的集群初始化操作都在 ceph1 执行。
cephadm bootstrap --mon-ip 192.168.2.101
正常会看到类似输出:
Creating directory /etc/ceph for ceph.conf
Verifying podman|docker is present...
Verifying lvm2 is present...
Verifying time synchronization is in place...
Host looks OK
Cluster fsid: 44982f32-6c23-11ef-8e35-f1d0f3adcf6f
Creating initial keys...
Creating mon...
Creating mgr...
Enabling cephadm module...
Setting orchestrator backend to cephadm...
Generating ssh key...
Adding host ceph1...
Deploying mon service with default placement...
Deploying mgr service with default placement...
Deploying prometheus service with default placement...
Deploying grafana service with default placement...
Deploying alertmanager service with default placement...
Enabling the dashboard module...
Ceph Dashboard is now available at:
URL: https://ceph1:8443/
User: admin
Password: <bootstrap 输出的随机密码>
Bootstrap complete.
这里会生成几类关键文件:
/etc/ceph/ceph.conf/etc/ceph/ceph.client.admin.keyring/etc/ceph/ceph.pub
ceph.client.admin.keyring 是管理员 key,不要贴到公网文章或者聊天群里。
Dashboard 地址:
https://ceph1:8443/

验证集群状态:
# 进入 cephadm shell
cephadm shell
# 查看集群状态
ceph -s
也可以直接这样执行:
cephadm shell -- ceph -s
cephadm shell -- ceph orch ps
查看容器:
docker ps | grep ceph
0x05 添加 OSD
查看可用磁盘
先看哪些盘可以作为 OSD。
cephadm shell -- ceph orch device ls --wide --refresh
如果磁盘干净,Available 一般会显示 Yes。如果已经有分区、文件系统、LVM 信息,通常会显示 No。

我这里集群已经搭完,磁盘已经被 OSD 占用了,所以后面会看到 Available 是 No。

给当前节点添加 OSD
比如 ceph1 上的数据盘是 /dev/sdb、/dev/sdc、/dev/sdd:
ceph orch daemon add osd ceph1:/dev/sdb
ceph orch daemon add osd ceph1:/dev/sdc
ceph orch daemon add osd ceph1:/dev/sdd
也可以直接循环:
for i in {b..d}; do
ceph orch daemon add osd ceph1:/dev/sd${i}
done
创建完成后检查:
ceph osd tree
ceph -s
删除 OSD
删除 OSD 会影响数据,生产环境不要直接复制执行,先确认副本恢复、集群健康和 OSD ID。
# 查看 OSD ID
ceph osd tree
# 删除 OSD
ceph orch osd rm <osd_id>
# 擦除指定磁盘上的 Ceph/LVM 信息
ceph orch device zap <hostname> <device-path> --force
例子:
ceph orch osd rm 2
ceph orch device zap ceph1 /dev/sdd --force
如果只是实验环境要重新做一遍,建议把盘上的分区、LVM、文件系统签名都清干净:
wipefs -a /dev/sdd
sgdisk --zap-all /dev/sdd
0x06 添加其他主机
bootstrap 的时候 cephadm 会生成一把集群管理用的 SSH 公钥:
ls -l /etc/ceph/ceph.pub
把这把公钥导入到其他节点:
for i in {2..5}; do
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph${i}
done
把节点加入集群:
for i in {2..5}; do
ceph orch host add ceph${i} 192.168.2.10${i}
done
查看主机:
ceph orch host ls

如果想让其他节点也能直接执行管理命令,可以给节点加 _admin 标签。
ceph orch host label add ceph2 _admin
带 _admin 标签的节点会同步 /etc/ceph/ceph.conf 和 /etc/ceph/ceph.client.admin.keyring。
0x07 给所有节点添加 OSD
如果 ceph2 到 ceph5 也都是 /dev/sdb、/dev/sdc、/dev/sdd 作为数据盘,可以直接循环添加:
for h in {2..5}; do
for i in {b..d}; do
ceph orch daemon add osd ceph${h}:/dev/sd${i}
done
done
观察 OSD 创建过程:
ceph -s
ceph osd tree
ceph orch ps --daemon_type osd
如果某台机器迟迟不创建 OSD,先看设备为什么不可用:
ceph orch device ls --hostname ceph2 --wide --refresh
常见原因:
- 磁盘有分区表
- 磁盘有文件系统签名
- 磁盘上残留 LVM 信息
- 设备正在被系统挂载
- 节点时间不同步
- 容器镜像拉取失败
0x08 管理 Ceph daemon
查看所有服务:
ceph orch ps
正常情况下会看到这些服务:
monmgrcrashnode-exporterprometheusgrafanaalertmanagerosd
如果 mgr、mon 数量不符合预期,可以重新 apply。
# 先 dry-run 看看会怎么调整
ceph orch apply mgr --placement="ceph1 ceph2 ceph3 ceph4 ceph5" --dry-run
# 确认没问题再执行
ceph orch apply mgr --placement="ceph1 ceph2 ceph3 ceph4 ceph5"
删除主机前要先迁移或者删除上面的 daemon,尤其是 OSD。
# 示例,按实际 daemon 名称替换
ceph orch daemon rm mon.ceph5
ceph orch daemon rm mgr.ceph5
# 确认节点上没有 daemon 后再移除主机
ceph orch host rm ceph5
生产环境下移除 OSD 要先看数据恢复状态:
ceph -s
ceph health detail
ceph osd df tree
0x09 创建 CephFS
先确认 MDS 服务。
ceph fs volume ls
创建一个 CephFS:
ceph fs volume create cephfs
再次查看:
ceph fs volume ls
正常输出类似:
[
{
"name": "cephfs"
}
]
查看 MDS:
ceph orch ps --daemon_type mds
ceph fs status cephfs
0x0A 配置 NFS-Ganesha
开启 NFS 模块
先看 nfs 模块有没有启用:
ceph mgr module ls | grep nfs
如果没有返回,就手动启用:
ceph mgr module enable nfs
创建 NFS 集群
先查看已有的 NFS 集群:
ceph nfs cluster ls
没有的话创建一个:
ceph nfs cluster create nfs-ceph "ceph1 ceph2"
这里的意思是创建一个 nfs-ceph 集群,NFS 服务放在 ceph1 和 ceph2 上。
查看详情:
ceph nfs cluster info nfs-ceph
ceph orch ps --daemon_type nfs
创建 NFS 导出
把上面创建的 cephfs 通过 NFS 导出:
ceph nfs export create cephfs \
--cluster-id nfs-ceph \
--pseudo-path /data \
--fsname cephfs \
--path=/
查看导出:
ceph nfs export ls nfs-ceph
ceph nfs export get nfs-ceph /data
客户端挂载测试:
mkdir -p /mnt/ceph-nfs
mount -t nfs -o nfsvers=4.1,proto=tcp 192.168.2.101:/data /mnt/ceph-nfs
df -Th | grep ceph-nfs
0x0B 创建高可用 NFS VIP
如果要用 VIP 方式对外提供 NFS,可以创建带 ingress 的 NFS 集群。
ceph nfs cluster create nfs-ha "ceph1 ceph2 ceph3 ceph4" \
--port 6666 \
--ingress \
--virtual-ip 192.168.2.200
这里:
192.168.2.200是 VIP6666是对外监听端口- placement 写哪些节点,就会在哪些节点部署对应服务
查看:
ceph nfs cluster info nfs-ha
ceph orch ps | grep nfs
ceph orch ps | grep ingress
使用 VIP 挂载:
mkdir -p /mnt/ceph-nfs-ha
mount -t nfs -o port=6666,nfsvers=4.1,proto=tcp \
192.168.2.200:/data /mnt/ceph-nfs-ha
如果业务侧不想感知后端 NFS 节点变化,用 VIP 会方便很多。
0x0C 直接挂载 CephFS
除了 NFS,也可以直接用 Ceph 客户端挂载 CephFS。
客户端先安装 ceph-common:
apt-get update
apt-get install -y ceph-common
在管理节点创建一个只访问 cephfs 的 key:
ceph fs authorize cephfs client.cephfs / rw -o ceph.client.cephfs.keyring
查看 keyring:
cat ceph.client.cephfs.keyring
内容类似:
[client.cephfs]
key = <client.cephfs 的 key>
挂载时不要把 key 写死到文章里,可以用变量或者 secretfile。
CEPH_KEY=$(awk '/key =/{print $3}' ceph.client.cephfs.keyring)
mkdir -p /mnt/cephfs
mount -t ceph 192.168.2.101:6789:/ /mnt/cephfs \
-o name=cephfs,secret="${CEPH_KEY}"
也可以使用 secretfile:
awk '/key =/{print $3}' ceph.client.cephfs.keyring > /etc/ceph/cephfs.secret
chmod 600 /etc/ceph/cephfs.secret
mount -t ceph 192.168.2.101:6789:/ /mnt/cephfs \
-o name=cephfs,secretfile=/etc/ceph/cephfs.secret
验证:
df -Th | grep cephfs
touch /mnt/cephfs/test.txt
ls -l /mnt/cephfs/
0x0D 常用排错命令
集群状态:
ceph -s
ceph health detail
ceph osd status
ceph osd tree
ceph osd df tree
编排状态:
ceph orch host ls
ceph orch ps
ceph orch device ls --wide --refresh
ceph orch ls
查看某个 daemon 日志:
cephadm logs --name mon.ceph1
cephadm logs --name mgr.ceph1
cephadm logs --name osd.0
检查容器:
docker ps | grep ceph
docker logs <container_id>
设备清理:
lsblk -f
pvs
vgs
lvs
wipefs -n /dev/sdb
wipefs -n 只是查看签名,不会清除;真正清除是 wipefs -a,生产环境一定确认盘符。
0x0E 总结
cephadm 比以前手动装 Ceph 省事很多,主要流程就是:
- 所有节点准备 hosts、时间同步、docker、lvm2
- 在
ceph1安装cephadm bootstrap初始化 MON/MGR/Dashboard- 导入
/etc/ceph/ceph.pub到其他节点 ceph orch host add加节点ceph orch daemon add osd加数据盘- 按需创建 CephFS、NFS 或 RGW
真正容易踩坑的地方不在命令本身,而是磁盘不干净、主机名解析不一致、时间不同步、镜像拉不下来。先把这些基础项处理好,Ceph 集群基本就能顺利起来。