Ceph块设备 和 OpenStack
通过 libvirt
将 Ceph
块设备映像附加到 OpenStack
实例,它将 QEMU
接口配置为 librbd
。 Ceph在集群内的跨多个OSD,这意味着大卷可以实现比独立服务器上的本地驱动器更好的性能!
要将 Ceph 块设备与 OpenStack 一起使用,则必须先安装 QEMU
、libvirt
和 OpenStack
。 我们建议为 OpenStack 安装使用单独的物理节点。 OpenStack 推荐至少 8GB 内存和四核处理器。 下图描述了 OpenStack/Ceph 技术架构。
重要的:
要将 Ceph 块设备与 OpenStack 一起使用,你必须有权访问正在运行的 Ceph 存储集群。
OpenStack 的三个部分与 Ceph 的块设备集成:
Images: OpenStack Glance管理着虚拟机的镜像。镜像是不可改变的。OpenStack将映像视为二进制Blobs,并相应地下载它们。
Volumes: Volumes是块设备,OpenStack 使用它来引导VM,或将卷附加到正在运行的VM。OpenStack使用Cinder服务管理卷。
Guest Disks: 客户磁盘是客户操作系统的磁盘。默认情况下,当你启动一个虚拟机时,它的磁盘会作为一个文件出现在管理程序的文件系统中(通常在
/var/lib/nova/instances/<uuid>/
下)。在OpenStack Havana之前,在Ceph中启动虚拟机的唯一方法是使用 Cinder 的 boot-from-volume 功能。然而,现在可以直接启动Ceph里面的每一个虚拟机,而不需要使用Cinder,这很有优势,因为它可以让你在实时迁移过程中轻松执行维护操作。此外,如果你的 hypervisor 宕了,也可以方便地触发nova evacuate
,在其他地方几乎无缝地恢复虚拟机。在这样做的时候,独占锁可以防止多个计算节点同时访问客户磁盘。
你可以使用 OpenStack Glance 将镜像存储到 Ceph 块设备,并且可以使用 Cinder 通过映像的写时复制克隆来启动 VM。
下面的说明详细介绍了Glance、Cinder和Nova的设置,尽管它们不一定要一起使用。你可以在Ceph块设备中存储镜像,同时使用本地磁盘运行虚拟机,或者反之亦然。
重要的
不建议使用 QCOW2 来托管虚拟机磁盘。如果你想在Ceph中启动虚拟机(ephemeral backend或从卷中启动),请在Glance中使用原始镜像格式。
创建Pool
默认情况下,Ceph 块位于rbd池中。推荐为 Cinder 创建一个pool,为 Glance 创建一个pool。
ceph osd pool create volumes
ceph osd pool create images
ceph osd pool create backups
ceph osd pool create vms
新创建的pool必须在使用前进行初始化,使用 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
/etc/ceph/ceph.conf 的内容如下:
[global]
fsid = 4ce7b524-ab7f-11ed-8356-00505686a3b8
mon_initial_members = ceph-0
mon_host = 10.0.19.176
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
安装 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 的密钥添加到适当的节点并更改其所有权:
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 进程的密钥文件:
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
保存 secret 的 uuid,用于稍后配置 nova-compute。
重要
不一定需要所有计算节点上的 UUID。 但是从平台一致性的角度来看,最好保持相同的 UUID。
配置OpenStack
配置Glance
Glance 可以使用多个后端来存储镜像。要默认使用 Ceph 块设备,请像下面这样配置 Glance。
编辑 /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 的 API 公开后端位置,因此启用此选项的端点不应公开访问。
除 Mitaka 之外的任何 OpenStack 版本
如果要启用镜像的写时复制克隆,还要在 [DEFAULT]
部分下添加:
show_image_direct_url = True
禁用缓存管理(任何 OpenStack 版本)
禁用 Glance 缓存管理以避免镜像缓存在 /var/lib/glance/image-cache/
下,假设你的配置文件有 flavor = keystone+cachemanagement
:
[paste_deploy]
flavor = keystone
Image属性
我们建议为图像使用以下属性:
hw_scsi_model=virtio-scsi
: add the virtio-scsi controller and get better performance and support for discard operationhw_disk_bus=scsi
: connect every cinder block devices to that controllerhw_qemu_guest_agent=yes
: enable the QEMU guest agentos_require_quiesce=yes
: send fs-freeze/thaw calls through the QEMU guest agent
配置 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 Backup
OpenStack Cinder Backup 需要一个特定的守护进程,所以不要忘记安装它。在你的 Cinder 备份节点上,编辑 /etc/cinder/cinder.conf
并添加:
backup_driver = cinder.backup.drivers.ceph.CephBackupDriver
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。 在与 Ceph 集群连接和验证时,libvirt 将引用此用户。
[libvirt]
...
rbd_user = cinder
rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
Nova 临时后端也使用这两个。
配置 Nova
为了直接从 Ceph 卷启动虚拟机,您必须为 Nova 配置临时后端。
建议在 Ceph 配置文件中启用 RBD 缓存; 自 Giant 版本以来,这已默认启用。 此外,启用客户端管理套接字允许收集指标并且对于故障排除非常宝贵。
可以在管理程序(Nova compute)节点上访问此套接字:
ceph daemon /var/run/ceph/ceph-client.cinder.19195.32310016.asok help
要启用 RBD 缓存和admin sockets,请确保每个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
配置完成后,重启相关模块。
对于基于 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
从块设备引导
您可以使用 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 仪表板中,可以通过执行以下步骤从该卷启动:
- 启动一个新实例。
- 选择与写时复制克隆关联的图像。
- 选择「从卷启动」。
- 选择您创建的卷。