手把手教你用 cephadm 在 Ubuntu 22.04 上部署生产级 Ceph 集群(Quincy/Reef 版本通用)
最近公司要上一套分布式存储,想要用 Ceph。说实话,我之前虽然接触过 Ceph,但都是测试环境玩玩,这次可是真刀真枪要上生产环境,压力山大。不过好在现在 Ceph 的部署工具已经成熟很多了,尤其是 cephadm 这套基于容器的部署方式,比早年手动编译、配置一堆服务省心太多了。
今天这篇文章就把我从零开始搭建 Ceph 集群的过程完整记录下来,全程基于 Ubuntu 22.04 LTS,使用的是官方推荐的 cephadm 工具。无论是 Quincy(17.2.x)还是 Reef(18.2.x)版本,流程基本一致,你可以直接照着操作,部署完就能跑业务。
一、先搞清楚你要搭什么
在动手部署之前,先花一分钟搞清楚:Ceph 到底是个啥?
简单说,Ceph 是一个开源的 软件定义存储(SDS)系统,它能把你一堆普通服务器的硬盘“揉”成一个超大、高可用、自动修复的统一存储池。最牛的是,它一套系统同时支持三种存储接口:
- 块存储(RBD):像云硬盘一样挂给虚拟机或容器用;
- 文件存储(CephFS):提供标准的 POSIX 文件系统,多个客户端可同时读写;
- 对象存储(RGW):兼容 AWS S3 和 OpenStack Swift,适合存图片、视频、备份等海量非结构化数据。
这种“三合一”的设计,在业内非常少见。
那有没有同类产品?有,比如:
- GlusterFS:也是开源分布式文件系统,主打文件存储,架构比 Ceph 简单,但扩展性和一致性稍弱,大规模场景下容易出现元数据瓶颈。
- MinIO / OpenIO:专注对象存储,轻量、易用,但不支持块和文件存储,功能单一。
- 商业方案如 VMware vSAN、Dell PowerScale:功能强、服务好,但贵得离谱,还得绑定硬件。
而 Ceph 的优势就很明显了:
✅ 真正去中心化:没有元数据服务器单点瓶颈,靠 CRUSH 算法智能分布数据;
✅ 线性扩展:加机器就能扩容,性能和容量同步涨;
✅ 自愈能力强:硬盘坏了?节点宕了?Ceph 自己默默重建副本,业务无感;
✅ 完全开源免费:社区活跃,Red Hat、SUSE、Canonical 都深度集成,连 OpenStack 和 Kubernetes 原生都支持它。
当然,Ceph 也不是没缺点——配置复杂、学习曲线陡、对网络要求高。但一旦跑稳了,那就是“省心又省钱”的代名词。尤其在私有云、边缘计算、AI 训练这些需要 EB 级存储的场景里,Ceph 几乎成了事实标准。
所以,别被它吓住。只要方法对,部署其实没那么难。接下来,咱们就一步步把它跑起来。
Ceph 不是随便几台机器就能跑起来的。它有几个核心角色:
- Monitor(mon):负责维护集群状态,至少3个节点(奇数),不能挂。
- Manager(mgr):提供监控、仪表盘等功能,一般和 mon 混部或单独部署2个。
- OSD(osd):真正存数据的,每个节点挂一块或多块硬盘,越多越好。
- 可选:MDS(用于 CephFS 文件系统)、RGW(对象存储网关)。
我们这次的目标是:3 节点最小高可用集群,每台既是 mon/mgr,也跑 OSD,适合中小规模生产环境。
硬件建议(别抠门):
- CPU:每台至少 4 核
- 内存:OSD 节点建议 8GB 起,最好 16GB+
- 硬盘:每台至少 1 块 ≥1TB 的数据盘(SSD/HDD 都行,但别用系统盘)
- 网络:千兆起步,万兆更佳,所有节点互通
二、系统准备(所有节点都要做)
1. 设置主机名和 hosts
假设三台机器 IP 分别是:
- 192.168.1.10 → ceph1
- 192.168.1.11 → ceph2
- 192.168.1.12 → ceph3
在每台机器上执行(以 ceph1 为例):
sudo hostnamectl set-hostname ceph1然后编辑 /etc/hosts,三台机器都加上:
192.168.1.10 ceph1
192.168.1.11 ceph2
192.168.1.12 ceph3⚠️ 注意:主机名必须和 hosts 里一致,否则后面 cephadm 添加 host 会报错。
2. 关闭防火墙和 SELinux
Ubuntu 默认没开 SELinux,但防火墙可能开着:
sudo ufw disable检查一下:
sudo ufw status
# 应该显示 inactive3. 时间同步(非常重要!)
Ceph 对时间敏感,不同步会出大问题:
sudo apt update
sudo apt install -y ntp
sudo systemctl enable --now ntp验证:
timedatectl
# 看 NTP synchronized: yes4. 创建统一用户并配 sudo 免密
虽然 cephadm 支持 root,但官方建议用普通用户。我们在三台机器都创建 cephadmin 用户:
sudo useradd -m -s /bin/bash cephadmin
echo "cephadmin ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephadmin再给这个用户设个密码(可选,主要是为了 ssh 登录):
sudo passwd cephadmin三、配置 SSH 免密登录(从管理节点到其他节点)
我们把 ceph1 当作管理节点,需要能无密码登录 ceph2 和 ceph3。
切换到 cephadmin 用户:
su - cephadmin生成密钥(一路回车):
ssh-keygen -t rsa -N ""把公钥复制到其他两台机器:
ssh-copy-id cephadmin@ceph2
ssh-copy-id cephadmin@ceph3测试:
ssh ceph2
ssh ceph3
# 应该不用输密码直接进💡 如果提示主机名不匹配,可能是 DNS 或 hosts 没配好,回头检查。
四、安装 Ceph 依赖(所有节点)
回到 root 或用 sudo:
sudo apt update
sudo apt install -y python3-pip git docker.io然后添加 Ceph 官方源(这里以 Reef 18.2.4 为例,Quincy 把 reef 换成 quincy 即可):
wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -
echo "deb https://download.ceph.com/debian-reef/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/ceph.list
sudo apt update📌 小技巧:国内访问慢?可以换成阿里云镜像:
echo "deb http://mirrors.aliyun.com/ceph/debian-reef/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/ceph.list
五、在管理节点初始化集群
只在 ceph1 上操作:
sudo apt install -y cephadm ceph-common然后初始化集群(注意替换 IP):
sudo cephadm bootstrap --mon-ip 192.168.1.10 --cluster-network 192.168.1.0/24参数说明:
--mon-ip:当前管理节点的 IP--cluster-network:OSD 之间通信的网段(建议和 public network 分开,这里图省事用了同一个)
执行后会看到一堆日志,最后输出类似:
Ceph Dashboard is now available at:
URL: https://ceph1:8443/
User: admin
Password: xxxxxxxx记下这个密码!后面要登录 Web 控制台。
此时 /etc/ceph/ 下会生成 ceph.conf 和 client.admin.keyring,这就是集群的“身份证”。
六、添加其他节点到集群
继续在 ceph1 上操作:
ceph orch host add ceph2
ceph orch host add ceph3✅ 注意:这里用的是主机名,不是 IP!所以前面 hosts 配置很关键。
然后指定 mon 跑在哪几个节点(必须奇数):
ceph orch apply mon ceph1,ceph2,ceph3mgr 一般自动部署两个,不用额外操作。
七、部署 OSD(关键步骤!)
Ceph 不会自动用你的硬盘,得手动告诉它哪些盘可以用来存数据。
先看看每台机器有哪些盘(在 ceph1 上远程查):
ceph orch device ls输出类似:
HOST PATH TYPE SIZE AVAILABLE REJECT REASONS
ceph1 /dev/sdb hdd 1000G Yes None
ceph2 /dev/sdb hdd 1000G Yes None
ceph3 /dev/sdb hdd 1000G Yes None如果显示 AVAILABLE: No,可能是盘有分区或文件系统,得先清掉:
sudo wipefs -a /dev/sdb
sudo sgdisk --zap-all /dev/sdb确认可用后,一键部署所有 OSD:
ceph orch apply osd --all-available-devices这条命令的意思是:“把所有标记为可用的硬盘都变成 OSD”。
等几分钟,再看:
ceph -s应该能看到:
- 3 mons
- 2 mgrs
- 3 osds up and in
- 集群状态 HEALTH_OK
八、验证和使用
1. 查看集群状态
ceph -s
ceph df
ceph osd tree2. 访问 Dashboard
浏览器打开 https://ceph1:8443,用前面 bootstrap 给的账号密码登录。
首次登录会让你改密码,改完就能看到漂亮的监控界面:OSD 状态、IOPS、容量、告警……一目了然。
3. 创建 RBD 块设备(测试用)
# 创建 pool
ceph osd pool create rbd_pool 32 32
# 初始化 RBD
rbd pool init rbd_pool
# 创建一个 10GB 的镜像
rbd create rbd_pool/testimg --size 10G
# 映射到本地(需安装 rbd-nbd 或内核支持)
sudo rbd map rbd_pool/testimg搞定!你现在已经有一个能跑虚拟机磁盘、K8s PV 的块存储了。
九、生产环境注意事项
- 网络分离:Public Network(客户端访问)和 Cluster Network(OSD 同步)最好走不同网卡,避免互相干扰。
- 硬盘规划:如果有 NVMe,可以用作 BlueStore 的 DB/WAL,大幅提升小文件性能。
- 副本数:默认是 3 副本,如果你只有 3 个 OSD,那就刚好;如果更多,可以调 CRUSH 规则。
- 监控告警:Dashboard 自带 Prometheus + Grafana,记得配置邮件或钉钉告警。
- 备份 keyring:
/etc/ceph/client.admin.keyring是命根子,丢了就管不了集群了!
最后说两句
Ceph 看似复杂,其实只要按步骤来,用 cephadm 部署并不难。我这套流程已经在多个客户现场跑了几个月,稳定得很。关键是前期规划要做好:网络、硬盘、主机名,这些细节一错,后面全是坑。
如果你觉得这篇文章对你有帮助,欢迎点赞、转发,让更多运维兄弟少走弯路。也欢迎关注我的公众号,我会持续分享真实生产环境的踩坑经验和优化技巧。
公众号:运维躬行录
个人博客:躬行笔记