注意
本文档适用于 Ceph 的开发版本。
块设备和 OpenStack
您可以通过 libvirt 将 Ceph 块设备镜像附加到 OpenStack 实例,libvirt 会配置 QEMU 接口以使用 librbd。Ceph 会将块卷条带化分布在集群中的多个 OSD 上,这意味着大型卷可以比独立服务器上的本地驱动器实现更好的性能!
要将 Ceph 块设备与 OpenStack 配合使用,您必须首先安装 QEMU、libvirt 和 OpenStack。我们建议为您的 OpenStack 安装使用单独的物理节点。OpenStack 建议最低配置为 8GB 内存和四核处理器。下图描绘了 OpenStack/Ceph 技术栈。
重要
要将 Ceph 块设备与 OpenStack 配合使用,您必须能够访问正在运行的 Ceph 存储集群。
OpenStack 的三个部分与 Ceph 的块设备集成:
镜像:OpenStack Glance 管理 VM 的镜像。镜像不可变。OpenStack 将镜像视为二进制大对象 (binary blobs) 并相应地下载它们。
卷:卷是块设备。OpenStack 使用卷来引导 VM,或将卷附加到正在运行的 VM。OpenStack 使用 Cinder 服务管理卷。
访客磁盘:访客磁盘是访客操作系统的磁盘。默认情况下,当您引导虚拟机时,其磁盘在 hypervisor 的文件系统上显示为文件(通常位于
/var/lib/nova/instances/<uuid>/下)。在 OpenStack Havana 之前,在 Ceph 中引导 VM 的唯一方法是使用 Cinder 的 boot-from-volume 功能。然而,现在可以直接在 Ceph 内部引导每个虚拟机而无需使用 Cinder,这很有优势,因为它允许您通过实时迁移过程轻松执行维护操作。此外,如果您的 hypervisor 发生故障,触发nova evacuate并在其他地方几乎无缝地恢复虚拟机也很方便。在此过程中,独占锁可防止多个计算节点同时访问访客磁盘。
您可以使用 OpenStack Glance 将镜像存储为 Ceph 块设备,并且可以使用 Cinder 使用镜像的写时复制克隆来引导 VM。
下面的说明详细介绍了 Glance、Cinder 和 Nova 的设置,尽管它们不必一起使用。您可以将镜像存储在 Ceph 块设备中,同时使用本地磁盘运行 VM,反之亦然。
重要
不推荐使用 QCOW2 来托管虚拟机磁盘。如果您想在 Ceph 中引导虚拟机(临时后端或从卷引导),请在 Glance 中使用 raw 镜像格式。
创建池
默认情况下,Ceph 块设备位于 rbd 池中。您可以通过明确指定来使用任何合适的池。我们建议为 Cinder 创建一个池,为 Glance 创建一个池。确保您的 Ceph 集群正在运行,然后创建这些池。
ceph osd pool create volumes
ceph osd pool create images
ceph osd pool create backups
ceph osd pool create vms
有关为池指定放置组数量的详细信息,请参阅创建池,有关应为池设置的放置组数量的详细信息,请参阅放置组。
新创建的池在使用前必须进行初始化。使用 rbd 工具初始化池:
rbd pool init volumes
rbd pool init images
rbd pool init backups
rbd pool init vms
配置 OpenStack Ceph 客户端
运行 glance-api、cinder-volume、nova-compute 和 cinder-backup 的节点充当 Ceph 客户端。每个节点都需要 ceph.conf 文件。
ssh {your-openstack-server} sudo tee /etc/ceph/ceph.conf </etc/ceph/ceph.conf
安装 Ceph 客户端包
在 glance-api 节点上,您需要 librbd 的 Python 绑定:
sudo apt-get install python-rbd
sudo yum install python-rbd
在 nova-compute、cinder-backup 和 cinder-volume 节点上,同时使用 Python 绑定和客户端命令行工具:
sudo apt-get install ceph-common
sudo yum install ceph-common
设置 Ceph 客户端认证
如果您启用了 cephx 认证,请为 Nova/Cinder 和 Glance 创建一个新用户。执行以下操作:
ceph auth get-or-create client.glance mon 'profile rbd' osd 'profile rbd pool=images' mgr 'profile rbd pool=images'
ceph auth get-or-create client.cinder mon 'profile rbd' osd 'profile rbd pool=volumes, profile rbd pool=vms, profile rbd-read-only pool=images' mgr 'profile rbd pool=volumes, profile rbd pool=vms'
ceph auth get-or-create client.cinder-backup mon 'profile rbd' osd 'profile rbd pool=backups' mgr 'profile rbd pool=backups'
将 client.cinder、client.glance 和 client.cinder-backup 的 keyring 文件添加到相应的节点并更改其所有权:
ceph auth get-or-create client.glance | ssh {your-glance-api-server} sudo tee /etc/ceph/ceph.client.glance.keyring
ssh {your-glance-api-server} sudo chown glance:glance /etc/ceph/ceph.client.glance.keyring
ceph auth get-or-create client.cinder | ssh {your-volume-server} sudo tee /etc/ceph/ceph.client.cinder.keyring
ssh {your-cinder-volume-server} sudo chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring
ceph auth get-or-create client.cinder-backup | ssh {your-cinder-backup-server} sudo tee /etc/ceph/ceph.client.cinder-backup.keyring
ssh {your-cinder-backup-server} sudo chown cinder:cinder /etc/ceph/ceph.client.cinder-backup.keyring
运行 nova-compute 的节点需要 nova-compute 进程的 keyring 文件:
ceph auth get-or-create client.cinder | ssh {your-nova-compute-server} sudo tee /etc/ceph/ceph.client.cinder.keyring
它们还需要将 client.cinder 用户的密钥存储在 libvirt 中。libvirt 进程需要它来访问集群,以便在附加 Cinder 的块设备时进行身份验证。
在运行 nova-compute 的节点上创建密钥的临时副本:
ceph auth get-key client.cinder | ssh {your-compute-node} tee client.cinder.key
然后,在计算节点上,将密钥添加到 libvirt 并删除密钥的临时副本:
uuidgen
457eb676-33da-42ec-9a8c-9293d545c337
cat > secret.xml <<EOF
<secret ephemeral='no' private='no'>
<uuid>457eb676-33da-42ec-9a8c-9293d545c337</uuid>
<usage type='ceph'>
<name>client.cinder secret</name>
</usage>
</secret>
EOF
sudo virsh secret-define --file secret.xml
Secret 457eb676-33da-42ec-9a8c-9293d545c337 created
sudo virsh secret-set-value --secret 457eb676-33da-42ec-9a8c-9293d545c337 --base64 $(cat client.cinder.key) && rm client.cinder.key secret.xml
保存密钥的 UUID 以供稍后配置 nova-compute 时使用。
重要
您不一定需要在所有计算节点上都使用 UUID。然而,从平台一致性的角度来看,最好保持相同的 UUID。
配置 OpenStack 以使用 Ceph
配置 Glance
Glance 可以使用多个后端来存储镜像。要默认使用 Ceph 块设备,请按如下方式配置 Glance。
Kilo 及更高版本
编辑 /etc/glance/glance-api.conf 并在 [glance_store] 部分添加:
[glance_store]
stores = rbd
default_store = rbd
rbd_store_pool = images
rbd_store_user = glance
rbd_store_ceph_conf = /etc/ceph/ceph.conf
rbd_store_chunk_size = 8
有关 Glance 中可用配置选项的更多信息,请参阅 OpenStack 配置参考:https://docs.openstack.net.cn/。
启用镜像的写时复制克隆
请注意,这会通过 Glance 的 API 公开后端位置,因此启用此选项的端点不应公开访问。
任何 OpenStack 版本(Mitaka 除外)
如果要启用镜像的写时复制克隆,请在 [DEFAULT] 部分也添加:
show_image_direct_url = True
禁用缓存管理(任何 OpenStack 版本)
禁用 Glance 缓存管理以避免镜像缓存在 /var/lib/glance/image-cache/ 下,前提是您的配置文件中有 flavor = keystone+cachemanagement。
[paste_deploy]
flavor = keystone
镜像属性
我们建议为您的镜像使用以下属性:
hw_scsi_model=virtio-scsi:添加 virtio-scsi 控制器并获得更好的性能和对 discard 操作的支持。hw_disk_bus=scsi:将每个 cinder 块设备连接到该控制器。hw_qemu_guest_agent=yes:启用 QEMU 访客代理。os_require_quiesce=yes:通过 QEMU 访客代理发送 fs-freeze/thaw 调用。
配置 Cinder
OpenStack 需要一个驱动程序来与 Ceph 块设备进行交互。您还必须指定块设备的池名称。在您的 OpenStack 节点上,通过添加以下内容编辑 /etc/cinder/cinder.conf:
[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
如果您使用 cephx 认证,还要配置您之前添加到 libvirt 的密钥的用户和 UUID:
[ceph]
...
rbd_user = cinder
rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
请注意,如果您配置了多个 cinder 后端,则 glance_api_version = 2 必须在 [DEFAULT] 部分中。
配置 Cinder 备份
OpenStack Cinder Backup 需要一个特定的守护程序,所以不要忘记安装它。在您的 Cinder Backup 节点上,编辑 /etc/cinder/cinder.conf 并添加:
backup_driver = cinder.backup.drivers.ceph
backup_ceph_conf = /etc/ceph/ceph.conf
backup_ceph_user = cinder-backup
backup_ceph_chunk_size = 134217728
backup_ceph_pool = backups
backup_ceph_stripe_unit = 0
backup_ceph_stripe_count = 0
restore_discard_excess_bytes = true
配置 Nova 以附加 Ceph RBD 块设备
为了附加 Cinder 设备(无论是普通块设备还是通过从卷引导),您必须告知 Nova(和 libvirt)在附加设备时要引用哪个用户和 UUID。libvirt 将在连接 Ceph 集群并进行身份验证时引用此用户。
[libvirt]
...
rbd_user = cinder
rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
Nova 临时后端也使用这两个标志。
配置 Nova
为了直接从 Ceph 卷引导虚拟机,您必须配置 Nova 的临时后端。
建议在 Ceph 配置文件中启用 RBD 缓存;自 Giant 版本以来,这已默认启用。此外,启用客户端 admin socket 允许收集指标,对于故障排除非常宝贵。
可以在 hypervisor(Nova compute)节点上访问此 socket:
ceph daemon /var/run/ceph/ceph-client.cinder.19195.32310016.asok help
要启用 RBD 缓存和 admin socket,请确保每个 hypervisor 的 ceph.conf 包含:
[client]
rbd cache = true
rbd cache writethrough until flush = true
admin socket = /var/run/ceph/guests/$cluster-$type.$id.$pid.$cctid.asok
log file = /var/log/qemu/qemu-guest-$pid.log
rbd concurrent management ops = 20
配置这些目录的权限:
mkdir -p /var/run/ceph/guests/ /var/log/qemu/
chown qemu:libvirtd /var/run/ceph/guests /var/log/qemu/
请注意,用户 qemu 和组 libvirtd 可能会根据您的系统而有所不同。提供的示例适用于基于 RedHat 的系统。
提示
如果您的虚拟机已经在运行,您可以简单地重启它以启用 admin socket:
重启 OpenStack
要激活 Ceph 块设备驱动程序并将块设备池名称加载到配置中,您必须重启相关的 OpenStack 服务。对于基于 Debian 的系统,在相应的节点上执行这些命令:
sudo glance-control api restart
sudo service nova-compute restart
sudo service cinder-volume restart
sudo service cinder-backup restart
对于基于 Red Hat 的系统,执行:
sudo service openstack-glance-api restart
sudo service openstack-nova-compute restart
sudo service openstack-cinder-volume restart
sudo service openstack-cinder-backup restart
一旦 OpenStack 启动并运行,您应该能够创建卷并从它引导。
从块设备引导
您可以使用 Cinder 命令行工具从镜像创建卷:
cinder create --image-id {id of image} --display-name {name of volume} {size of volume}
您可以使用 qemu-img 从一种格式转换为另一种格式。例如:
qemu-img convert -f {source-format} -O {output-format} {source-filename} {output-filename}
qemu-img convert -f qcow2 -O raw precise-cloudimg.img precise-cloudimg.raw
当 Glance 和 Cinder 都使用 Ceph 块设备时,镜像是一个写时复制克隆,因此新卷创建速度很快。在 OpenStack 仪表板中,您可以通过执行以下步骤从该卷引导:
启动一个新实例。
选择与写时复制克隆关联的镜像。
选择“从卷引导”。
选择您创建的卷。