在云计算和虚拟化技术快速发展的今天,如何高效、灵活地管理存储资源,是每一个云平台架构师和运维工程师必须面对的挑战。传统的集中式存储方案在扩展性、成本和性能上往往难以兼顾,尤其是在构建私有云或超融合基础设施时。本文将深入探讨如何将开源分布式存储系统 Ceph 与 OpenStack 的核心计算组件 Nova 和块存储组件 Cinder 进行深度集成,从而实现一套稳定、可扩展的超融合云平台。无论你是正在规划云平台的技术决策者,还是负责具体实施和运维的工程师,通过本文的完整流程拆解、代码示例和避坑指南,都能掌握从环境准备到生产级部署的全套实战技能。
1. 背景与核心概念
在深入实操之前,我们首先需要理清几个关键概念,理解“为什么”要这么做,这比“怎么做”更重要。
1.1 什么是超融合基础设施
超融合基础设施将计算、存储和网络资源整合到一套标准化的服务器硬件中,并通过软件进行统一管理。其核心优势在于:
- 简化架构:告别独立的存储区域网络和存储阵列,降低硬件复杂性和采购成本。
- 线性扩展:可以通过增加标准服务器节点来同时扩展计算和存储能力。
- 易于管理:通过统一的软件界面管理所有资源,提升运维效率。
1.2 Ceph:软件定义的统一存储
Ceph 是一个开源的、软件定义的、统一的分布式存储系统。它在一个平台上同时提供了对象存储、块存储和文件系统三种服务接口。其核心特性包括:
- 高可靠性:数据通过 CRUSH 算法自动分布和复制,无单点故障。
- 高扩展性:可以轻松地从几个节点扩展到上千个节点。
- 自我修复:能自动检测故障并恢复数据副本。
- 开源与开放:拥有活跃的社区和广泛的生态支持。
在超融合场景中,我们主要利用 Ceph 的块存储服务,为虚拟机提供持久化磁盘。
1.3 OpenStack Nova 与 Cinder 的角色
- Nova:OpenStack 的计算服务,负责虚拟机实例的生命周期管理,包括创建、调度、关闭、删除等。当创建虚拟机时,Nova 需要为虚拟机挂载启动盘和数据盘。
- Cinder:OpenStack 的块存储服务,为虚拟机提供持久化的块存储设备。它管理着各种后端存储驱动,将创建卷、挂载卷等请求翻译成后端存储能理解的操作。
1.4 对接的价值:为什么选择 Ceph?
将 Ceph 作为 Nova 和 Cinder 的后端存储,可以实现:
- 统一存储池:所有虚拟机的系统盘和数据盘都来自同一个 Ceph 集群,便于容量管理和性能监控。
- 高级功能支持:无缝支持虚拟机热迁移、卷快照、卷克隆等高级功能,因为 Ceph RBD 本身支持这些特性。
- 摆脱本地磁盘限制:虚拟机磁盘不再绑定在某一台计算节点的本地硬盘上,实现了计算与存储的解耦,这是实现高可用和灵活调度的基础。
- 性能与成本平衡:利用服务器本地硬盘构建 Ceph 集群,在获得分布式存储可靠性的同时,避免了昂贵的企业级 SAN 存储。
2. 环境准备与版本说明
一个成功的部署始于清晰的环境规划。以下是一个典型的测试环境配置,生产环境需要根据负载进行扩容和优化。
2.1 硬件与网络规划
| 角色 | 数量 | 最低配置 | 推荐配置 | 网络要求 |
|---|---|---|---|---|
| Ceph/OpenStack 控制节点 | 1 | 8核 CPU, 16GB RAM, 200GB 系统盘 | 16核 CPU, 32GB RAM, SSD 系统盘 | 管理网、存储网(万兆)、外部网 |
| Ceph OSD / Nova 计算节点 | 3+ | 16核 CPU, 64GB RAM, 系统盘 + 多块数据盘(如 4x 1TB HDD) | 24核 CPU, 128GB RAM, SSD 系统盘 + 多块 NVMe/SSD 数据盘 | 管理网、存储网(强烈推荐万兆分离) |
| 注意 | 数据盘用于创建 Ceph OSD,不要使用 LVM/VG,直接使用裸盘。 | 生产环境建议至少5个节点,且控制节点与计算节点分离。 | 存储网络必须独立且低延迟,这是性能关键。 |
2.2 软件版本说明
版本兼容性是 OpenStack 和 Ceph 集成中最常见的坑点。以下组合经过广泛测试,相对稳定:
- 操作系统:Ubuntu 20.04 LTS 或 CentOS 8 Stream / Rocky Linux 8。本文以 CentOS 8 系列为例。
- OpenStack 版本:Victoria (2020.2) 或 Yoga (2023.1)。这两个版本与 Ceph 的集成非常成熟。本文示例基于 Victoria。
- Ceph 版本:Pacific (16.2.x) 或 Quincy (17.2.x)。建议选择与 OpenStack 版本对应的稳定版。本文使用 Quincy。
- Python 版本:系统自带 Python 3.6+。
重要提示:请根据你的实际需求选择版本,并务必查阅 OpenStack 和 Ceph 官方发布的版本兼容性矩阵。下文中的配置命令和路径可能需要根据具体版本进行微调。
2.3 前置条件检查
在所有节点上执行以下检查:
主机名与解析:确保每个节点有唯一的主机名,且
/etc/hosts文件或 DNS 能正确解析所有节点的主机名。# 设置主机名(以控制节点为例) hostnamectl set-hostname controller # 编辑 /etc/hosts,添加所有节点的IP和主机名映射 echo “192.168.1.10 controller” >> /etc/hosts echo “192.168.1.11 compute1” >> /etc/hosts echo “192.168.1.12 compute2” >> /etc/hosts时间同步:分布式系统对时间一致性要求极高。
# CentOS/Rocky Linux dnf install chrony -y systemctl enable --now chronyd chronyc sources禁用 SELinux 和防火墙(仅用于实验环境):生产环境需配置精细的防火墙规则。
# 临时禁用 SELinux setenforce 0 # 永久禁用 SELinux sed -i ‘s/SELINUX=enforcing/SELINUX=permissive/g’ /etc/selinux/config # 停止并禁用防火墙 systemctl stop firewalld systemctl disable firewalld
3. Ceph 集群部署与基础配置
我们将首先部署一个基础的 Ceph 集群。这里使用cephadm工具进行部署,它是 Ceph 官方推荐的现代化部署方式。
3.1 安装 cephadm
在控制节点上执行:
curl --silent --remote-name --location https://github.com/ceph/ceph/raw/quincy/src/cephadm/cephadm chmod +x cephadm ./cephadm add-repo --release quincy ./cephadm install3.2 引导新集群
使用cephadm bootstrap命令在控制节点上初始化一个单节点集群(后续再添加 OSD 节点)。
cephadm bootstrap --mon-ip 192.168.1.10命令执行成功后,会输出管理器的访问信息,包括 Dashboard 的 URL 和初始密码。请妥善保存。
3.3 添加 OSD 节点
将 Ceph 集群扩展到计算节点上,使存储与计算共存。
将 SSH 公钥复制到计算节点:允许控制节点免密登录计算节点。
ssh-copy-id -f -i /etc/ceph/ceph.pub root@compute1 ssh-copy-id -f -i /etc/ceph/ceph.pub root@compute2将主机添加到集群:
ceph orch host add compute1 192.168.1.11 ceph orch host add compute2 192.168.1.12 ceph orch host ls # 查看已添加的主机在每个计算节点上添加数据盘作为 OSD:首先查看可用磁盘。
# 在控制节点上,为 compute1 添加磁盘 /dev/sdb ceph orch daemon add osd compute1:/dev/sdb # 为 compute2 添加磁盘 /dev/sdb ceph orch daemon add osd compute2:/dev/sdb可以使用
ceph osd tree命令查看 OSD 的分布状态。
3.4 创建存储池
存储池是 Ceph 中存储数据的逻辑分区。我们需要为 OpenStack 创建专用的池。
创建用于 Cinder 卷的池:
ceph osd pool create volumes 128 128128是 PG (Placement Group) 数量,这是一个重要的性能参数。粗略估算公式:PG 总数 = (OSD 总数 * 100) / 副本数。这里创建了一个名为volumes的池。创建用于 Nova 虚拟机磁盘的池:
ceph osd pool create vms 128 128启用 RBD 功能:
ceph osd pool application enable volumes rbd ceph osd pool application enable vms rbd
4. OpenStack 基础服务安装与配置
我们使用 OpenStack 的自动化部署工具packstack来快速搭建基础服务。注意,packstack适合 PoC 和测试环境,生产环境建议使用Kolla-Ansible或OpenStack-Helm。
4.1 安装 Packstack
在控制节点上执行:
dnf install -y centos-release-openstack-victoria dnf update -y dnf install -y openstack-packstack4.2 生成应答文件并编辑
生成一个包含所有组件的默认应答文件,然后针对我们的需求进行修改。
packstack --gen-answer-file=answer-file.txt使用文本编辑器(如vi)打开answer-file.txt,修改以下关键参数:
# 配置使用 Ceph 作为后端 CONFIG_CEPH_INSTALL=n CONFIG_CINDER_BACKEND=ceph CONFIG_GLANCE_BACKEND=ceph CONFIG_NOVA_LIBVIRT_VIRT_TYPE=kvm # 配置 Ceph 集群信息 CONFIG_CEPH_CLIENT_FSID=你的Ceph集群FSID(通过`ceph fsid`命令获取) CONFIG_CEPH_CLIENT_USERNAME=client.openstack CONFIG_CEPH_CLIENT_KEY=你的client.openstack用户的密钥(通过`ceph auth get-key client.openstack`获取,如果不存在需先创建) # 配置 Ceph 存储池名称,与前面创建的一致 CONFIG_CEPH_GLANCE_POOL=images CONFIG_CEPH_CINDER_POOL=volumes CONFIG_CEPH_NOVA_POOL=vms # 指定计算节点主机名 CONFIG_COMPUTE_HOSTS=compute1,compute2 # 其他网络配置根据你的环境调整 CONFIG_KEYSTONE_ADMIN_PW=设置一个强密码 CONFIG_PROVISION_DEMO=n # 不安装演示组件注意:需要先在 Ceph 中创建client.openstack用户并授权,以及images池。
# 在Ceph控制节点执行 ceph osd pool create images 128 128 ceph osd pool application enable images rbd # 创建客户端用户并授权 ceph auth get-or-create client.openstack mon ‘profile rbd’ osd ‘profile rbd pool=images, profile rbd pool=volumes, profile rbd pool=vms’ # 获取密钥 ceph auth get-key client.openstack4.3 执行安装
使用修改后的应答文件开始安装 OpenStack。
packstack --answer-file=answer-file.txt安装过程耗时较长,请耐心等待。成功后,会输出各个服务的访问地址。
5. 配置 Nova 和 Cinder 使用 Ceph RBD
虽然packstack应答文件已经指定了后端,但我们仍需深入检查并手动确认关键配置,这是排错和深度定制的必要步骤。
5.1 配置 Cinder 使用 Ceph (控制节点)
编辑 Cinder Volume 配置:
vi /etc/cinder/cinder.conf在
[DEFAULT]部分和末尾添加/确认以下内容:[DEFAULT] enabled_backends = ceph glance_api_version = 2 [ceph] volume_driver = cinder.volume.drivers.rbd.RBDDriver volume_backend_name = ceph rbd_pool = volumes rbd_ceph_conf = /etc/ceph/ceph.conf rbd_flatten_volume_from_snapshot = false rbd_max_clone_depth = 5 rbd_store_chunk_size = 4 rados_connect_timeout = -1 rbd_user = openstack rbd_secret_uuid = 你的Secret UUIDrbd_secret_uuid需要后续在 Libvirt 中配置并填入此处。创建 Secret 文件:Libvirt 需要密钥来访问 Ceph。
cat > /etc/ceph/secret.xml << EOF <secret ephemeral=‘no’ private=‘no’> <uuid>你的Secret UUID</uuid> <usage type=‘ceph’> <name>client.openstack secret</name> </usage> </secret> EOF使用
uuidgen命令生成一个 UUID 并替换到上述文件和cinder.conf中。定义并设置 Secret:
virsh secret-define --file /etc/ceph/secret.xml virsh secret-set-value --secret {上一步生成的UUID} --base64 $(ceph auth get-key client.openstack)
5.2 配置 Nova 使用 Ceph (所有计算节点)
安装客户端软件包:
dnf install -y python3-rbd ceph-common复制 Ceph 配置文件:
scp root@controller:/etc/ceph/ceph.conf /etc/ceph/ scp root@controller:/etc/ceph/ceph.client.openstack.keyring /etc/ceph/ chown root:root /etc/ceph/ceph.client.openstack.keyring chmod 600 /etc/ceph/ceph.client.openstack.keyring配置 Nova 使用 RBD:
vi /etc/nova/nova.conf找到
[libvirt]部分,修改如下:[libvirt] virt_type = kvm images_type = rbd images_rbd_pool = vms images_rbd_ceph_conf = /etc/ceph/ceph.conf rbd_user = openstack rbd_secret_uuid = {填入与cinder.conf中相同的Secret UUID} disk_cachemodes = “network=writeback” hw_disk_discard = unmapdisk_cachemodes和hw_disk_discard的设置有助于提升性能。配置 Libvirt:编辑 Libvirt 的 QEMU 配置。
vi /etc/libvirt/qemu.conf确保以下行未被注释:
user = “root” group = “root”重启服务:
systemctl restart libvirtd systemctl restart openstack-nova-compute
5.3 重启服务并验证
在控制节点上重启相关服务使配置生效:
systemctl restart openstack-cinder-volume systemctl restart openstack-cinder-scheduler systemctl restart openstack-cinder-api systemctl restart openstack-glance-api6. 完整实战:创建基于 Ceph 后端的虚拟机
现在,我们来完成一个端到端的测试,验证整个链路是否通畅。
6.1 环境变量与镜像准备
加载管理员 OpenRC 文件:
source /root/keystonerc_admin下载并上传一个云镜像到 Glance:Glance 后端已配置为 Ceph,所以镜像会存储在 Ceph 的
images池中。wget https://download.cirros-cloud.net/0.5.2/cirros-0.5.2-x86_64-disk.img openstack image create --file cirros-0.5.2-x86_64-disk.img --disk-format qcow2 --container-format bare --public cirros openstack image list # 确认镜像已上传
6.2 创建 Cinder 卷类型与卷
创建 Cinder 卷类型(可选,用于标记存储后端):
openstack volume type create --public ceph-ssd cinder extra-specs-create ceph-ssd volume_backend_name=ceph创建一个启动卷:
openstack volume create --size 1 --image cirros --type ceph-ssd boot-from-volume-test openstack volume list # 等待状态变为 `available`此时,这个卷已经作为 RBD 镜像创建在 Ceph 的
volumes池中。
6.3 启动虚拟机
创建网络(如果尚未存在):
openstack network create test-net openstack subnet create --network test-net --subnet-range 192.168.200.0/24 test-subnet创建虚拟机,指定从我们刚创建的卷启动:
openstack server create --flavor m1.tiny --volume boot-from-volume-test --network test-net --key-name mykey test-vm-ceph关键点:这里使用了
--volume参数而非--image。Nova 会指示 Libvirt 使用rbd协议直接从这个位于 Ceph 的卷启动虚拟机。查看虚拟机状态和详细信息:
openstack server list openstack server show test-vm-ceph在
openstack server show的输出中,可以查看虚拟机的宿主机(例如compute1)。
6.4 验证与观察
在 Ceph 侧验证:登录到 Ceph 控制节点或任意安装
ceph客户端工具的节点。rbd -p volumes ls # 应能看到以 `volume-` 开头的卷 rbd -p vms ls # 应能看到以 `instance-` 开头的虚拟机磁盘(如果从镜像创建,Nova可能会在vms池中创建副本) ceph df # 查看存储池容量使用情况在计算节点验证:登录到运行该虚拟机的计算节点。
virsh list virsh dumpxml {虚拟机ID} | grep rbd在 XML 定义中,你应该能看到类似以下的磁盘配置,这证明虚拟机磁盘直接挂载了 Ceph RBD 镜像:
<disk type=‘network’ device=‘disk’> <driver name=‘qemu’ type=‘raw’ cache=‘writeback’ discard=‘unmap’/> <auth username=‘openstack’> <secret type=‘ceph’ uuid=‘你的Secret-UUID’/> </auth> <source protocol=‘rbd’ name=‘vms/instance-xxxxxx’> <host name=‘192.168.1.10’ port=‘6789’/> <host name=‘192.168.1.11’ port=‘6789’/> <host name=‘192.168.1.12’ port=‘6789’/> </source> <target dev=‘vda’ bus=‘virtio’/> <address type=‘pci’ domain=‘0x0000’ bus=‘0x00’ slot=‘0x04’ function=‘0x0’/> </disk>
7. 常见问题与排查思路
对接过程中难免遇到问题,以下是一些典型场景的排查路径。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
虚拟机创建失败,状态为ERROR,错误信息包含Cannot discover…或Connection reset by peer | 1. Ceph 集群健康状态异常。 2. 计算节点无法连接 Ceph Monitor。 3. ceph.conf或密钥文件权限错误。4. Libvirt Secret 未正确设置。 | 1.ceph -s检查集群状态是否为HEALTH_OK。2. 从计算节点 telnet <mon-ip> 6789测试网络连通性。3. 检查 /etc/ceph/下文件权限是否为600,属主为root。4. virsh secret-list查看 Secret 是否存在,virsh secret-get-value <uuid>核对密钥。 |
卷创建失败,Cinder Volume 服务日志报RBD image not found或权限错误 | 1. Cinder 配置中的rbd_user、rbd_pool错误。2. client.openstack用户对指定池没有权限。3. Ceph 集群存储空间不足。 | 1. 核对/etc/cinder/cinder.conf中[ceph]段配置。2. 在 Ceph 集群执行 ceph auth get client.openstack检查能力列表。3. ceph df检查池的剩余空间。 |
| 虚拟机启动极慢,或磁盘 IO 性能很差 | 1. 存储网络(集群网络)带宽不足或延迟高。 2. 未使用万兆网络或网络未分离。 3. OSD 磁盘性能瓶颈(如使用 HDD 且未配置 SSD 日志盘)。 4. Nova 配置中未启用 writeback缓存。 | 1. 使用iperf3测试计算节点与 Ceph OSD 节点间的网络带宽。2. 规划独立的存储网络。 3. 考虑使用 SSD 或 NVMe 作为 OSD。 4. 确认 /etc/nova/nova.conf中disk_cachemodes = “network=writeback”。 |
| 卷无法挂载到虚拟机 | 1. 卷状态非available。2. 卷类型与计算节点后端不匹配(多后端时)。 3. 虚拟机已挂载卷数量达到上限。 | 1.openstack volume show <volume-id>检查状态。2. 确保卷类型的 volume_backend_name与计算节点可用的后端匹配。3. 检查虚拟机规格。 |
Ceph Dashboard 或ceph -s显示 PG 状态不活跃 | PG (Placement Group) 数量设置不合理或 OSD 状态异常。 | 1.ceph pg stat查看 PG 详细状态。2. 根据 OSD 数量调整 PG 数,使用 ceph osd pool set <pool> pg_num <value>调整。3. 检查是否有 OSD down 或 out。 |
8. 最佳实践与工程建议
将 Ceph 与 OpenStack 对接用于生产环境超融合,除了基本功能,更需要关注稳定性、性能和安全。
8.1 存储规划与性能优化
硬件选型:
- OSD 磁盘:优先选择 SSD 或 NVMe。如果必须使用 HDD,务必为每个 OSD 配置单独的 SSD 日志盘(使用
ceph-volume部署时可指定--block.db)。 - 网络:存储网络(Cluster Network)必须与公共/管理网络分离,并使用万兆及以上网络。考虑使用 RDMA 进一步降低延迟。
- 内存:Ceph OSD 进程对内存消耗较大,建议每块 OSD 磁盘预留 3-5GB 内存。
- OSD 磁盘:优先选择 SSD 或 NVMe。如果必须使用 HDD,务必为每个 OSD 配置单独的 SSD 日志盘(使用
Ceph 配置优化:
- PG 数量:使用官方 PG 计算器进行计算,避免 PG 数量设置不当导致的性能问题和恢复缓慢。
- CRUSH Map 调优:如果硬件配置不一致(如有的节点有 SSD,有的只有 HDD),需要编辑 CRUSH Map 建立不同的故障域和存储类别,并在池中指定。
- 缓存层:对于混合存储(SSD+HDD),可以考虑为
volumes和vms池配置缓存层,将热数据缓存到 SSD。
8.2 OpenStack 配置与高可用
- 多后端支持:可以在 Cinder 中配置多个后端(如
ceph-ssd,ceph-hdd),通过卷类型让用户选择不同性能或成本的存储。 - 启用卷扩展与迁移:确保 Cinder 和 Ceph 配置支持卷在线扩展和迁移,这是云平台的必备功能。
- 计算节点高可用:结合 OpenStack Nova 的疏散功能,当某个计算节点故障时,其上运行的虚拟机可以自动在另一台拥有相同 Ceph 存储访问权限的节点上重建并启动。
- 定期快照与备份:虽然 Ceph 提供了副本保护,但仍需制定基于 RBD 快照或
rbd export的跨集群备份策略,防止逻辑错误或机房级灾难。
8.3 监控与运维
- 全面监控:
- Ceph:使用 Ceph Dashboard、Prometheus + Grafana(通过
ceph-mgr插件)监控集群健康、容量、IOPS、延迟等。 - OpenStack:使用 Ceilometer/Gnocchi 或 Prometheus 监控虚拟机、卷、镜像的数量和状态。
- 节点:监控计算/存储节点的 CPU、内存、磁盘 IO、网络流量。
- Ceph:使用 Ceph Dashboard、Prometheus + Grafana(通过
- 日志集中:将 Ceph 各组件、Nova、Cinder、Libvirt 的日志收集到 ELK 或 Loki 等日志平台,便于关联排查。
- 容量预警:为 Ceph 存储池设置使用率阈值告警(如 >80%),并建立流程及时扩容。
8.4 安全加固
- 最小权限原则:为
client.openstack用户仅授予必要的权限。我们之前使用的profile rbd是合理的。 - 网络隔离:严格限制存储网络(6789, 6800-7300 端口)的访问,仅允许计算节点和 Ceph 集群节点之间通信。
- 密钥管理:定期轮换
client.openstack的密钥,并更新所有计算节点和配置文件。 - Libvirt 沙盒:考虑使用 SELinux 或 AppArmor 对 QEMU 进程进行进一步的约束。
通过以上步骤,你不仅能够搭建起一个可用的 Ceph + OpenStack 超融合环境,更能理解其背后的原理、掌握排错方法,并建立起面向生产环境的运维意识。这套架构为构建私有云、开发测试云提供了强大的基础设施支撑,其扩展性和开放性使得后续引入容器、边缘计算等新型负载成为可能。建议在测试环境中反复演练整个流程,特别是故障模拟和恢复,这将在实际运维中带来巨大信心。