RBD 和 OPENSTACK(mimic版本)

您可以通过 OpenStack libvirt使用 Ceph 块设备映像,它将 QEMU 接口配置为librbd. Ceph 将块设备映像条带化为整个集群中的对象,这意味着大型 Ceph 块设备映像比独立服务器具有更好的性能!

要将 Ceph 块设备与 OpenStack 一起使用,您必须先安装 QEMU 、libvirt 和 OpenStack。我们建议为您的 OpenStack 安装使用单独的物理节点。OpenStack 建议至少 8GB 的​​ RAM 和四核处理器。下图描述了 OpenStack/Ceph 技术栈。

../../_images/51dd72cbc0174196f75f96e252d70d62bfe28ed6392c31d85e5a4975a0f4c564.png

重要:要将 Ceph 块设备与 OpenStack 一起使用,您必须有权访问正在运行的 Ceph 存储集群。

OpenStack 的三个部分与 Ceph 的块设备集成:

  • 映像(Images):OpenStack Glance 管理 VM 的映像。图像是不可变的。OpenStack 将图像视为二进制 blob 并相应地下载它们。

  • 卷(Volumes):卷是块设备。OpenStack 使用卷来引导 VM,或者将卷附加到正在运行的 VM。OpenStack 使用 Cinder 服务管理卷。

  • 访客磁盘(Guest Disks):访客(虚拟机)磁盘是访客操作系统磁盘。默认情况下,当你启动一个虚拟机时,它的磁盘作为一个文件出现在管理程序的文件系统上(通常在/var/lib/nova/instances/<uuid>/ 下)。在 OpenStack Havana 之前,在 Ceph 中启动 VM 的唯一方法是使用 Cinder 的 boot-from-volume 功能。但是,现在可以在不使用 Cinder 的情况下直接启动 Ceph 中的每个虚拟机,这是有利的,因为它允许您通过实时迁移过程轻松执行维护操作。此外,如果您的虚拟机管理程序死机,nova evacuate也可以方便地在其他地方几乎无缝地触发和运行虚拟机。

您可以使用 OpenStack Glance 将镜像存储在 Ceph 块设备中,并且可以使用 Cinder 使用镜像的写时复制克隆来引导 VM。

下面的说明详细说明了 Glance、Cinder 和 Nova 的设置,尽管它们不必一起使用。您可以在使用本地磁盘运行 VM 时将映像存储在 Ceph 块设备中,反之亦然。

重要:Ceph 不支持 QCOW2 托管虚拟机磁盘。因此,如果您想在 Ceph 中引导虚拟机(临时后端或从卷引导),Glance 映像格式必须为RAW.

提示:本文档描述了将 Ceph 块设备与 OpenStack Havana 结合使用。对于早期版本的 OpenStack,请参见 块设备和 OpenStack(Dumpling

1. 创建一个池

默认情况下,Ceph 块设备使用rbd池。您可以使用任何可用的池。我们建议为 Cinder 创建一个池,为 Glance 创建一个池。确保您的 Ceph 集群正在运行,然后创建池。

ceph osd pool create volumes 128
ceph osd pool create images 128
ceph osd pool create backups 128
ceph osd pool create vms 128

有关为池指定归置组数量的详细信息,请参阅创建池,有关应为池设置的归置数量的详细信息,请参阅归置组。

新创建的池必须在使用前进行初始化。使用rbd工具初始化池:

rbd pool init volumes
rbd pool init images
rbd pool init backups
rbd pool init vms

2. 配置 OPENSTACK CEPH 客户端

运行glance-apicinder-volumecinder-backupnova-compute的 节点充当 Ceph 客户端。每个都需要ceph.conf文件:

ssh {your-openstack-server} sudo tee /etc/ceph/ceph.conf </etc/ceph/ceph.conf

2.1 安装 CEPH 客户端包

glance-api节点上,您将需要 Python 绑定librbd

sudo apt-get install python-rbd
sudo yum install python-rbd

nova-computecinder-volumecinder-backup节点上,使用 Python 绑定和客户端命令行工具:

sudo apt-get install ceph-common
sudo yum install ceph-common

2.2 设置 CEPH 客户端身份验证

如果您启用了cephx 身份验证,请为 Nova/Cinder 和 Glance 创建一个新用户。执行以下操作:

ceph auth get-or-create client.glance mon 'profile rbd' osd '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 pool=images'
ceph auth get-or-create client.cinder-backup mon 'profile rbd' osd 'profile rbd pool=backups'

client.cinderclient.glanceclient.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。

3. 配置 OPENSTACK 以使用 CEPH 

3.1 配置 GLANCE 

Glance 可以使用多个后端来存储镜像。要默认使用 Ceph 块设备,请按如下方式配置 Glance。

3.1.1 在JUNO版本之前

[DEFAULT]部分下编辑/etc/glance/glance-api.conf并添加:

default_store = rbd
rbd_store_user = glance
rbd_store_pool = images
rbd_store_chunk_size = 8

3.1.2 JUNO版本

[glance_store]部分下编辑/etc/glance/glance-api.conf并添加:

[DEFAULT]
...
default_store = rbd
...
[glance_store]
stores = rbd
rbd_store_pool = images
rbd_store_user = glance
rbd_store_ceph_conf = /etc/ceph/ceph.conf
rbd_store_chunk_size = 8

重要:Glance 还没有完全转移到“store”。所以我们仍然需要在 DEFAULT 部分配置 store 直到 Kilo。

3.1.3 Kilo版本及以后

[glance_store]部分下编辑/etc/glance/glance-api.conf并添加:

[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 配置参考:http ://docs.openstack.org/ 。

3.1.4 启用镜像的写时复制克隆

请注意,这会通过 Glance 的 API 公开后端位置,因此启用此选项的端点不应公开访问。

  • 除 MITAKA 以外的任何 OPENSTACK 版本

如果要启用镜像的写时复制克隆,还要在以下[DEFAULT]部分添加:

show_image_direct_url = True
  • 仅适用于MITAKA版本

要启用镜像位置并利用镜像的写时复制克隆,请在以下[DEFAULT]部分添加:

show_multiple_locations = True
show_image_direct_url = True

3.1.5 禁用缓存管理(任何 OPENSTACK 版本)

 假设您的配置文件具有以下flavor =keystone+cachemanagement内容,请禁用 Glance 缓存管理以避免图像被缓存/var/lib/glance/image-cache/

[paste_deploy]
flavor = keystone

3.1.6 镜像属性

我们建议为您的镜像使用以下属性:

  • hw_scsi_model=virtio-scsi: 添加 virtio-scsi 控制器并获得更好的性能和对丢弃操作的支持

  • hw_disk_bus=scsi:将每个Cinder块设备连接到该控制器

  • hw_qemu_guest_agent=yes: 启用 QEMU 来宾代理

  • os_require_quiesce=yes: 通过 QEMU 来宾代理发送 fs-freeze/thaw 调用

3.2 配置 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 authentication,还请配置您添加到libvirt的密码的用户和 uuid,如前所述:

[ceph]
...
rbd_user = cinder
rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337

请注意,如果您要配置多个 cinder 后端,则 glance_api_version = 2必须在[DEFAULT]部分中。

3.3 配置 CINDER BACKUP

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

3.4 配置 NOVA 以附加 CEPH RBD 块设备

为了附加 Cinder 设备(普通块或通过从卷启动),您必须告诉 Nova(和 libvirt)在附加设备时要引用哪个用户和 UUID。libvirt 将在与 Ceph 集群连接和认证时引用此用户。

[libvirt]
...
rbd_user = cinder
rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337

Nova 临时后端也使用这两个标志。

3.5 配置 NOVA 

为了将所有虚拟机直接引导到 Ceph,您必须为 Nova 配置临时后端。

建议在 Ceph 配置文件中启用 RBD 缓存(自 Giant 以来默认启用)。此外,启用管理套接字在故障排除时带来了很多好处。每个使用 Ceph 块设备的虚拟机有一个套接字将有助于调查性能和(或)错误行为。

可以像这样访问此套接字:

ceph daemon /var/run/ceph/ceph-client.cinder.19195.32310016.asok help

现在在每个计算节点上编辑你的 Ceph 配置文件:

[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 的系统。

提示:如果您的虚拟机已经在运行,您只需重新启动它即可获取套接字。

3.5.1 Havana 和 Icehouse 版本

Havana 和 Icehouse 需要补丁来实现写时复制克隆并修复 rbd 上的镜像大小和临时磁盘实时迁移的错误。这些在基于上游 Nova s​​table/havana 和 stable/ icehouse 的分支中可用。使用它们不是强制性的,但强烈建议使用它们以利用写时复制克隆功能。

在每个 Compute 节点上,编辑/etc/nova/nova.conf并添加:

libvirt_images_type = rbd
libvirt_images_rbd_pool = vms
libvirt_images_rbd_ceph_conf = /etc/ceph/ceph.conf
disk_cachemodes="network=writeback"
rbd_user = cinder
rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337

禁用文件注入也是一个好习惯。在启动实例时,Nova 通常会尝试打开虚拟机的 rootfs。然后,Nova 将密码、ssh 密钥等值直接注入文件系统。但是,最好依靠元数据服务和 cloud-init.

在每个 Compute 节点上,编辑/etc/nova/nova.conf并添加:

libvirt_inject_password = false
libvirt_inject_key = false
libvirt_inject_partition = -2

为确保正确的实时迁移,请使用以下标志:

libvirt_live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED"

3.5.2 Juno 版本

在 Juno 中,Ceph 块设备被移到了[libvirt]部分之下。在每个 Compute 节点上,在/etc/nova/nova.conf[libvirt] 部分下进行编辑并添加:

[libvirt]
images_type = rbd
images_rbd_pool = vms
images_rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
disk_cachemodes="network=writeback"

禁用文件注入也是一个好习惯。在启动实例时,Nova 通常会尝试打开虚拟机的 rootfs。然后,Nova 将密码、ssh 密钥等值直接注入文件系统。但是,最好依靠元数据服务和 cloud-init.

在每个 Compute 节点上,编辑/etc/nova/nova.conf并在[libvirt]部分下添加以下内容:

inject_password = false
inject_key = false
inject_partition = -2

为确保正确的实时迁移,请使用以下标志(在[libvirt]部分下):

live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED"

3.5.3 KILO 版本

启用对虚拟机临时根磁盘的丢弃支持:

[libvirt]
...
...
hw_disk_discard = unmap # enable discard support (be careful of performance)

4. 重启 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 启动并运行,您应该能够创建一个卷并从中引导。

5. 从块设备启动

您可以使用 Cinder 命令行工具从映像创建卷:

cinder create --image-id {id of image} --display-name {name of volume} {size of volume}

请注意,镜像必须是 RAW 格式。您可以使用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 仪表板中,您可以通过执行以下步骤从该卷引导:

  1. 启动一个新实例。

  2. 选择与写时复制克隆关联的镜像。

  3. 选择“从卷启动”。

  4. 选择您创建的卷。

posted @ 2022-04-11 21:01  Varden  阅读(198)  评论(0编辑  收藏  举报