Ceph和OpenStack集成实践指南

1
2
3
4
5
6
7
作者:李晓辉

联系方式:

微信:Lxh_Chat

邮箱:939958092@qq.com

环境介绍

角色IP
openstack控制节点192.168.8.10
openstack计算节点192.168.8.20
ceph192.168.8.21

服务集成概念

Ceph 和 OpenStack 的集成是当今云计算和存储领域的热点主题。Ceph 作为一个强大且可扩展的分布式存储系统,提供了对象存储、块存储和文件系统存储的解决方案。而 OpenStack 是一个开源的云计算平台,使用户能够在其基础设施上搭建和管理私有云环境。

通过将 Ceph 与 OpenStack 集成,组织可以实现弹性、高可用性和高性能的存储解决方案,以满足其云平台的需求。这种集成不仅能优化存储资源的利用,还能简化存储管理,提高数据的安全性和可靠性。

在这篇博客中,我们将深入探讨如何将 Ceph 与 OpenStack 集成,包括配置步骤、最佳实践以及常见的挑战和解决方案

准备ssh互信

为了方便操作,我们需要准备从ceph管理节点到openstack的互信,这样以后的通信就可以在安全的前提下,免密执行各项操作,由于是在Ceph上操作,所以互信的密钥生成是在Ceph的管理节点上执行,生成后,将公钥分发给所有的OpenStack节点。

1
2
3
ssh-keygen -N '' -f /root/.ssh/id_rsa
ssh-copy-id root@192.168.8.10
ssh-copy-id root@192.168.8.20

创建Ceph池

通过创建不同用途的 Ceph OSD 池(Object Storage Daemon Pools),我们能为 OpenStack 提供更细化和专门化的存储资源。volumesimagesbackupsvms。这些池将分别用于存储卷、虚拟机镜像、备份和虚拟机。

1
2
3
4
ceph osd pool create volumes
ceph osd pool create images
ceph osd pool create backups
ceph osd pool create vms

在创建了 Ceph OSD 池后,接下来的关键步骤是初始化这些池,并将它们配置为存储设备,以便 OpenStack 能够无缝使用它们。

1
2
3
4
rbd pool init volumes
rbd pool init images
rbd pool init backups
rbd pool init vms

安装Ceph客户端

这一步在所有的openstack节点执行,让客户端支持ceph相关的命令,方便操作

1
2
yum install epel-release -y
yum install python-rbd ceph-common -y

准备Ceph配置文件

在Ceph节点执行,为所有openstack节点准备ceph配置文件,openstack节点需要有ceph的配置文件、Ceph用户的keyring才能正常工作

1
2
ssh 192.168.8.10 tee /etc/ceph/ceph.conf < /etc/ceph/ceph.conf
ssh 192.168.8.20 tee /etc/ceph/ceph.conf < /etc/ceph/ceph.conf

准备OpenStack用户

创建服务用户

在ceph节点执行,这一步是创建出适当的用户给OpenStack服务使用,ceph auth get-or-create 用于在 Ceph 集群中创建并配置特定用户的权限,从而允许 OpenStack 服务在这些用户下访问 Ceph OSD 池。每个命令包含多个部分,分别指示允许用户在 Ceph 集群中的读取、写入和管理权限。下面的命令配置了 OpenStack 服务所需用户的访问权限,确保 Glance、Cinder 和 Cinder-Backup 能够顺畅地与 Ceph 存储系统集成

1
2
3
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.glance 用户

  • client.glance: 用户名为 glance,用于 OpenStack 镜像服务。

  • mon profile rbd: 配置 glance 用户允许访问 Ceph 监控服务。

  • osd profile rbd pool=images: 允许 glance 用户在 images 池中进行读取/写入操作。

  • mgr profile rbd pool=images: 配置 glance 用户可对 images 池进行管理。

client.cinder 用户

  • client.cinder: 用户名为 cinder,用于 OpenStack 块存储服务。

  • mon profile rbd: 配置 cinder 用户允许访问 Ceph 监控服务。

  • osd profile rbd pool=volumes: 允许 cinder 用户在 volumes 池中进行读取/写入操作。

  • osd profile rbd pool=vms: 允许 cinder 用户在 vms 池中进行读取/写入操作。

  • osd profile rbd-read-only pool=images: 允许 cinder 用户在 images 池中进行只读操作。

  • mgr profile rbd pool=volumes: 配置 cinder 用户可对 volumes 池进行管理。

  • mgr profile rbd pool=vms: 配置 cinder 用户可对 vms 池进行管理。

client.cinder-backup 用户

  • client.cinder-backup: 用户名为 cinder-backup,用于 OpenStack 备份服务。

  • mon profile rbd: 配置 cinder-backup 用户允许访问 Ceph 监控服务。

  • osd profile rbd pool=backups: 允许 cinder-backup 用户在 backups 池中进行读取/写入操作。

  • mgr profile rbd pool=backups: 配置 cinder-backup 用户可对 backups 池进行管理。

导出用户keyring

在ceph节点上执行,导出glancecinder以及cinder-backup用户的keyring,然后将其保存在openstack管理节点的/etc/ceph/中,文件名称必须是ceph.client.USERNAME.keyring

1
2
3
4
5
6
ceph auth get-or-create client.glance | ssh root@192.168.8.10 tee /etc/ceph/ceph.client.glance.keyring
ssh root@192.168.8.10 chown glance:glance /etc/ceph/ceph.client.glance.keyring
ceph auth get-or-create client.cinder | ssh root@192.168.8.10 tee /etc/ceph/ceph.client.cinder.keyring
ssh root@192.168.8.10 chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring
ceph auth get-or-create client.cinder-backup | ssh root@192.168.8.10 tee /etc/ceph/ceph.client.cinder-backup.keyring
ssh root@192.168.8.10 chown cinder:cinder /etc/ceph/ceph.client.cinder-backup.keyring

这一步还是在Ceph节点上执行,导出cinder用户的keyring

1
ceph auth get-or-create client.cinder | ssh root@192.168.8.20 tee /etc/ceph/ceph.client.cinder.keyring

为libvirt准备密钥

导出cinder用户的密钥

有的人可能不理解这一步是干嘛的,这个过程是用来在 OpenStack 集群(比如 Cinder)和 Ceph 存储系统之间建立安全连接的。具体来说,libvirt 需要访问 Ceph 存储池来挂载和管理虚拟机的磁盘卷。为了确保这一过程的安全和自动化,我们创建了一个特殊的“密钥”,并在系统中定义了一个“秘密”。这样 libvirt 就能够在不需要每次手动输入密码的情况下,安全地访问并管理 Ceph 上的存储资源。这种配置提高了系统的安全性和自动化水平,使得 OpenStack 与 Ceph 能够无缝集成。

这一步在ceph节点上执行,使用 ceph auth get-key 获取 client.cinder 用户的密钥,并将它传输到计算节点的 root 用户主目录下。这将确保 libvirt 能够访问 Ceph 集群。

1
ceph auth get-key client.cinder | ssh root@192.168.8.20 tee client.cinder.key

生成uuid

这一步在openstack 计算节点执行,在 OpenStack 计算节点上生成一个 UUID。这将被用来在 libvirt 中定义一个新的秘密。

1
2
[root@node ~]# uuidgen
e4355171-b66e-4036-989f-f6af496797a6

创建 secret.xml 文件

注意替换下面的UUID为刚生成的

用刚才生成的 UUID 创建一个 XML 文件,以定义一个新的 libvirt secret。这个 secret 将允许 libvirt 使用 Ceph 密钥。

1
2
3
4
5
6
7
8
cat > secret.xml <<EOF
<secret ephemeral='no' private='no'>
<uuid>e4355171-b66e-4036-989f-f6af496797a6</uuid>
<usage type='ceph'>
<name>client.cinder secret</name>
</usage>
</secret>
EOF

定义 secret

使用 virsh secret-define 命令,将 secret.xml 定义到 libvirt 中。这一步会真正创建一个密钥条目,libvirt 可以用它来访问 Ceph。

1
2
[root@node ~]# virsh secret-define --file secret.xml
Secret e4355171-b66e-4036-989f-f6af496797a6 created

设置密钥值

最后一步是使用 virsh secret-set-value 设置密钥的实际值,然后删除临时文件。这确保了 libvirt 能够使用正确的密钥访问 Ceph 集群。

1
virsh secret-set-value --secret e4355171-b66e-4036-989f-f6af496797a6 --file client.cinder.key && rm client.cinder.key secret.xml

集成glance服务

Glance 是 OpenStack 的镜像服务,其主要职责是提供存储、发现、注册和分发虚拟机镜像的功能。以下是 Glance 的一些关键功能和特点:

  1. 镜像管理:用户可以上传、删除和管理虚拟机镜像。Glance 支持多种格式的镜像文件,如 QCOW2、RAW、VHD 等。

  2. 镜像存储:Glance 可以将镜像存储在多种后端,如本地文件系统、对象存储(Swift)、块存储(Ceph RBD)以及其他第三方存储解决方案。

  3. 镜像共享:用户可以将镜像共享给其他用户或项目,使得协作更加方便。

  4. 多区域支持:Glance 可以在多个区域中部署和管理镜像,提供区域间的镜像同步功能。

  5. 安全性和认证:Glance 集成了 Keystone 认证服务,确保只有授权用户才能访问和管理镜像。

修改glance配置文件

在openstack控制节点(glance节点)执行

1
yum install crudini -y
1
2
3
4
5
6
7
8
crudini --set /etc/glance/glance-api.conf DEFAULT show_image_direct_url True
crudini --set /etc/glance/glance-api.conf DEFAULT enabled_backends rbd:rbd
crudini --set /etc/glance/glance-api.conf glance_store default_backend rbd
crudini --set /etc/glance/glance-api.conf rbd rbd_store_pool images
crudini --set /etc/glance/glance-api.conf rbd rbd_store_user glance
crudini --set /etc/glance/glance-api.conf rbd rbd_store_ceph_conf /etc/ceph/ceph.conf
crudini --set /etc/glance/glance-api.conf rbd rbd_store_chunk_size 8
crudini --set /etc/glance/glance-api.conf paste_deploy flavor keystone

1
2
3
4
5
6
7
8
9
10
11
12
[DEFAULT]
enabled_backends = rbd:rbd
show_image_direct_url = True
[glance_store]
default_backend = rbd
[rbd]
rbd_store_pool = images
rbd_store_user = glance
rbd_store_ceph_conf = /etc/ceph/ceph.conf
rbd_store_chunk_size = 8
[paste_deploy]
flavor = keystone

配置文件详解

  • 设置显示镜像的直接 URL :修改 Glance 配置文件中的设置,允许用户查看和访问镜像的直接 URL,方便一些存储和管理操作。

  • 启用 RBD 后端:在 Glance 的配置中启用 Ceph RBD 作为存储后端,这使得 Glance 可以将其镜像存储在 Ceph RBD 中。

  • 设置默认存储后端:将 Ceph RBD 设置为默认的存储后端,以确保 Glance 默认使用这一个存储方式。

  • 指定 RBD 存储池:配置 Glance 使用一个名为 images 的 Ceph 池来存储镜像文件。

  • 配置存储用户:设置用于连接 Ceph 存储池的用户为 glance,这个用户需要在 Ceph 中创建并分配相应的权限。

  • 指定 Ceph 配置文件:在 Glance 的配置中指定 Ceph 配置文件的位置,以便其能够连接和操作 Ceph 集群。

  • 配置存储块大小:设置存储镜像时使用的块大小为 8MB,这有助于优化存储性能。

  • 配置 Keystone 认证:告诉 Glance 使用 Keystone 进行认证,这是 OpenStack 常见的认证方式。

重启服务后,glance就集成好了

1
systemctl restart openstack-glance-api

验证glance集成

创建一个openstack镜像,并查看ceph中是否有数据,如果有就是集成车工了,这一步在openstack控制节点执行

目前没有数据

1
2
[root@controller ~]# rados -p images ls --id glance
rbd_info

可以看到我们创建了一个镜像之后,ceph的池中就有数据了,说明集成glance成功

如果你需要cirros镜像,可以从这里获得:点此下载)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@controller ~]# source adminrc.sh
[root@controller ~]# openstack image create --disk-format raw --file cirros-0.6.2-x86_64-disk.img cirros
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
| container_format | bare |
| created_at | 2024-12-19T01:24:42Z |
| disk_format | raw |
| file | /v2/images/cea1e1be-f56f-4d71-ab2a-12fae4a53b39/file |
| id | cea1e1be-f56f-4d71-ab2a-12fae4a53b39 |
| min_disk | 0 |
| min_ram | 0 |
| name | cirros |
| owner | c223c0bf51ab40fd94c3983ca5d04cc5 |
| properties | os_hidden='False', owner_specified.openstack.md5='', owner_specified.openstack.object='images/cirros', owner_specified.openstack.sha256='' |
| protected | False |
| schema | /v2/schemas/image |
| status | queued |
| tags | |
| updated_at | 2024-12-19T01:24:42Z |
| visibility | shared |
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------+

创建好了之后,我们去看看images这个池中,有没有数据,果然看到一条cea1e1be-f56f-4d71-ab2a-12fae4a53b39数据,说明镜像已经写入成功了

1
2
3
4
5
6
7
8
9
10
[root@controller ~]# rados -p images ls --id glance
rbd_data.ad5a976f67a9.0000000000000002
rbd_data.ad5a976f67a9.0000000000000000
rbd_header.ad5a976f67a9
rbd_directory
rbd_info
rbd_object_map.ad5a976f67a9
rbd_id.cea1e1be-f56f-4d71-ab2a-12fae4a53b39
rbd_object_map.ad5a976f67a9.0000000000000004
rbd_data.ad5a976f67a9.0000000000000001

集成cinder服务

Cinder 是 OpenStack 的块存储服务,其主要职责是提供按需的块存储资源,为虚拟机和裸机实例提供持久化存储。以下是 Cinder 的一些关键功能和特点:

  1. 卷管理:用户可以创建、删除和管理存储卷。Cinder 支持多种存储后端,如 Ceph RBD、LVM、NFS、各大云服务提供商的存储服务等。

  2. 卷快照:用户可以创建卷的快照,用于数据备份和恢复。这些快照可以用于创建新的卷。

  3. 卷备份:Cinder 提供卷备份功能,将卷内容备份到外部存储,确保数据的安全和持久性。

  4. 卷附加/分离:用户可以将卷附加到运行中的虚拟机实例,也可以将卷从实例中分离。

  5. 多租户支持:Cinder 支持多租户环境中的存储资源隔离和配额管理,确保不同租户的存储资源独立。

修改cinder配置文件

在openstack控制节点(cinder节点)执行

1
2
3
4
5
6
7
8
9
10
11
12
crudini --set /etc/cinder/cinder.conf DEFAULT enabled_backends ceph
crudini --set /etc/cinder/cinder.conf DEFAULT glance_api_version 2
crudini --set /etc/cinder/cinder.conf ceph volume_driver cinder.volume.drivers.rbd.RBDDriver
crudini --set /etc/cinder/cinder.conf ceph volume_backend_name ceph
crudini --set /etc/cinder/cinder.conf ceph rbd_pool volumes
crudini --set /etc/cinder/cinder.conf ceph rbd_ceph_conf /etc/ceph/ceph.conf
crudini --set /etc/cinder/cinder.conf ceph rbd_flatten_volume_from_snapshot false
crudini --set /etc/cinder/cinder.conf ceph rbd_max_clone_depth 5
crudini --set /etc/cinder/cinder.conf ceph rbd_store_chunk_size 4
crudini --set /etc/cinder/cinder.conf ceph rados_connect_timeout -1
crudini --set /etc/cinder/cinder.conf ceph rbd_user cinder
crudini --set /etc/cinder/cinder.conf ceph rbd_secret_uuid e4355171-b66e-4036-989f-f6af496797a6 # 这里是前面创uuidgen的UUID

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[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 = cinder
rbd_secret_uuid = e4355171-b66e-4036-989f-f6af496797a6 # 这里是前面创uuidgen的UUID

配置文件详解

  • 启用 Ceph 作为后端存储:在 [DEFAULT] 部分设置 enabled_backends 参数为 ceph,使 Cinder 可以使用 Ceph RBD 作为存储后端。

  • 设置 Glance API 版本:在 [DEFAULT] 部分设置 glance_api_version 参数为 2,确保 Cinder 和 Glance API 版本一致。

  • 指定卷驱动:在 [ceph] 部分设置 volume_driver 参数为 cinder.volume.drivers.rbd.RBDDriver,指定 Cinder 使用 Ceph RBD 驱动。

  • 设置存储后端名称:在 [ceph] 部分设置 volume_backend_name 参数为 ceph,为存储后端指定一个标识名称。

  • 指定 RBD 存储池:在 [ceph] 部分设置 rbd_pool 参数为 volumes,指定用于存储 Cinder 卷的 Ceph 池为 volumes

  • 指定 Ceph 配置文件:在 [ceph] 部分设置 rbd_ceph_conf 参数为 /etc/ceph/ceph.conf,指定 Ceph 的配置文件位置。

  • 禁用快照扁平化:在 [ceph] 部分设置 rbd_flatten_volume_from_snapshot 参数为 false,禁用从快照创建卷时的扁平化操作。

  • 设置最大克隆深度:在 [ceph] 部分设置 rbd_max_clone_depth 参数为 5,指定从快照克隆卷的最大深度。

  • 设置存储块大小:在 [ceph] 部分设置 rbd_store_chunk_size 参数为 4,指定存储卷时使用的块大小为 4MB。

  • 配置连接超时:在 [ceph] 部分设置 rados_connect_timeout 参数为 -1,配置 RADOS 集群的连接超时为无限制。

  • 设置存储用户:在 [ceph] 部分设置 rbd_user 参数为 cinder,指定用于访问 Ceph RBD 的用户。

  • 配置密钥 UUID:在 [ceph] 部分设置 rbd_secret_uuid 参数,并使用之前生成的 UUID,保证 libvirt 能够安全地访问 Ceph RBD。

启动服务之后,cinder服务就算集成好了

1
systemctl restart openstack-cinder-api.service openstack-cinder-scheduler.service openstack-cinder-volume.service

验证cinder集成

现在volumes池是空的,我们创建一个卷,如果ceph里有了卷id相关的数据,说明就集成好了

1
2
[root@controller ~]# rados -p volumes ls --id cinder
rbd_info

创建一个卷看看是否新增数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@controller ~]# openstack volume create --size 5 testcinder
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| attachments | [] |
| availability_zone | nova |
| bootable | false |
| consistencygroup_id | None |
| created_at | 2024-12-19T01:50:33.615859 |
| description | None |
| encrypted | False |
| id | 3628cfe5-25e1-4e03-bf8f-59256cbaf8b5 |
| migration_status | None |
| multiattach | False |
| name | testcinder |
| properties | |
| replication_status | None |
| size | 5 |
| snapshot_id | None |
| source_volid | None |
| status | creating |
| type | __DEFAULT__ |
| updated_at | None |
| user_id | 914fc3ad0a434009b59d5dc31115bd03 |
+---------------------+--------------------------------------+

创建好了之后,我们发现,果然在volumes这个数据池中,出现了id为3628cfe5-25e1-4e03-bf8f-59256cbaf8b5的数据

1
2
3
4
5
6
[root@controller ~]# rados -p volumes ls --id cinder
rbd_directory
rbd_object_map.aee97e58d62
rbd_info
rbd_id.volume-3628cfe5-25e1-4e03-bf8f-59256cbaf8b5
rbd_header.aee97e58d62

数据正常新增,cinder集成成功

集成cinder backup服务

Cinder Backup 服务是 OpenStack 的一个子服务,其主要职责是提供卷数据的备份和恢复功能。Cinder Backup 服务使得用户能够轻松地将存储卷备份到一个独立于主存储系统的后端,即使在主存储系统发生故障时,也能确保数据的安全和可恢复性。

  1. 自动备份:用户可以为存储卷设置自动备份计划,这些备份将定期生成,确保数据的持久性和可恢复性。

  2. 手动备份:除了自动备份外,用户还可以随时手动触发备份任务,将当前卷的数据保存为一个备份对象。

  3. 多种备份后端:Cinder Backup 支持多种备份后端,包括 Ceph、NFS、Swift 等。用户可以根据需要选择合适的存储后端,增强灵活性和适应性。

  4. 快速恢复:备份后的卷数据可以在需要时快速恢复,从而最大限度地减少业务中断和数据丢失。

  5. 增量备份:Cinder Backup 提供增量备份功能,仅备份自上次备份以来发生变化的数据,从而节省存储空间和时间。

  6. 数据加密:为了确保备份数据的安全性,Cinder Backup 支持数据加密功能,为传输和存储的备份数据加密,防止未经授权的访问。

修改cinder backup配置文件

在openstack 控制节点执行,不过别忘了需要先搞定ceph的账号和keyring

1
2
3
4
5
6
7
crudini --set /etc/cinder/cinder.conf DEFAULT backup_driver cinder.backup.drivers.ceph.CephBackupDriver
crudini --set /etc/cinder/cinder.conf DEFAULT backup_ceph_conf /etc/ceph/ceph.conf
crudini --set /etc/cinder/cinder.conf DEFAULT backup_ceph_user cinder-backup
crudini --set /etc/cinder/cinder.conf DEFAULT backup_ceph_chunk_size 134217728
crudini --set /etc/cinder/cinder.conf DEFAULT backup_ceph_pool backups
crudini --set /etc/cinder/cinder.conf DEFAULT backup_compression_algorithm zlib
crudini --set /etc/cinder/cinder.conf DEFAULT backup_enable_progress_timer True

或者

1
2
3
4
5
6
7
8
[DEFAULT]
backup_driver = cinder.backup.drivers.ceph
backup_ceph_conf = /etc/ceph/ceph.conf # Ceph集群配置文件路径
backup_ceph_user = cinder-backup # Ceph用户
backup_ceph_chunk_size = 134217728 # 分块大小(字节)
backup_ceph_pool = backups # Ceph备份池的名称
backup_compression_algorithm = zlib # 备份压缩算法
backup_enable_progress_timer = True # 启用备份进度计时器

同步数据库

1
cinder-manage db sync

配置文件详解

  • 配置备份驱动:设置 backup_drivercinder.backup.drivers.ceph.CephBackupDriver,指定 Cinder backup 使用 Ceph 作为备份后端的驱动程序。

  • 指定 Ceph 配置文件:设置 backup_ceph_conf/etc/ceph/ceph.conf,指定 Ceph 配置文件的位置,以便 Cinder backup 可以连接并使用 Ceph 集群。

  • 设置 Ceph 用户:设置 backup_ceph_usercinder-backup,指定用于备份操作的 Ceph 用户。这个用户需要在 Ceph 中创建并赋予相应权限。

  • 配置备份块大小:设置 backup_ceph_chunk_size134217728,指定在进行备份时使用的块大小(单位为字节),提升备份性能。

  • 指定备份池:设置 backup_ceph_poolbackups,指定用于存储备份数据的 Ceph 池为 backups

  • 启用压缩:设置 backup_compression_algorithmzlib,启用备份数据的压缩,并选择 zlib 作为压缩算法,以节省存储空间。

  • 启用进度计时器:设置 backup_enable_progress_timerTrue,启用备份进度计时器,可以跟踪和显示备份操作的进度。

重启服务就算是集成好了

1
2
3
4
5
6
7
8
9
systemctl enable openstack-cinder-api.service \
openstack-cinder-backup.service \
openstack-cinder-scheduler.service \
openstack-cinder-volume.service

systemctl restart openstack-cinder-api.service \
openstack-cinder-backup.service \
openstack-cinder-scheduler.service \
openstack-cinder-volume.service

验证cinder backup集成

原来ceph池是空的,我们创建一个卷,然后对它进行备份,如果backup池里有东西,就是备份服务集成好了

1
2
3
4
[root@ceph ~]# rados -p backups ls
rbd_directory
rbd_info
rbd_trash

创建个卷并备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@controller cinder]# openstack volume create --size 1 ceph-test-lxh
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| attachments | [] |
| availability_zone | nova |
| bootable | false |
| consistencygroup_id | None |
| created_at | 2024-05-30T14:03:12.482823 |
| description | None |
| encrypted | False |
| id | 4a6f25d5-93e2-49f7-9bf9-ac9913a7dba5 |
| migration_status | None |
| multiattach | False |
| name | ceph-test-lxh |
| properties | |
| replication_status | None |
| size | 1 |
| snapshot_id | None |
| source_volid | None |
| status | creating |
| type | __DEFAULT__ |
| updated_at | None |
| user_id | 1a138f1f200b4d75a50b22ecd1a71903 |
+---------------------+--------------------------------------+

创建一个卷,请注意ID是多少

1
2
3
4
5
6
7
8
[root@controller cinder]# openstack volume backup create --name cephtest-lxh ceph-test-lxh
+-----------+--------------------------------------+
| Field | Value |
+-----------+--------------------------------------+
| id | 363b7645-eb5d-46b1-a209-e1348dc2d76a |
| name | cephtest-lxh |
| volume_id | 4a6f25d5-93e2-49f7-9bf9-ac9913a7dba5 |
+-----------+--------------------------------------+

已经出现数据,说明集成成功喽

1
2
3
4
5
6
7
8
9
[root@ceph ~]# rados -p backups ls
rbd_object_map.b6807bde1542.0000000000000006
rbd_object_map.b6807bde1542
rbd_directory
rbd_header.b6807bde1542
rbd_info
rbd_id.volume-4a6f25d5-93e2-49f7-9bf9-ac9913a7dba5.backup.363b7645-eb5d-46b1-a209-e1348dc2d76a
backup.363b7645-eb5d-46b1-a209-e1348dc2d76a.meta
rbd_trash

集成nova服务

Nova 是 OpenStack 的计算服务,负责管理和提供虚拟机实例。Nova 服务是 OpenStack 的核心组件之一,它将虚拟化技术与物理资源结合,为用户提供按需计算资源。

  1. 虚拟机管理:Nova 管理虚拟机实例的生命周期,包括创建、调度、启动、停止和删除等操作。

  2. 资源调度:Nova 支持多种调度算法,将虚拟机实例分配到最合适的计算节点,以优化资源利用率。

  3. 多种虚拟化技术支持:Nova 支持多种虚拟化技术,包括 KVM、Xen、VMware 以及容器技术等,提供灵活的虚拟化选项。

  4. 网络集成:Nova 与 Neutron(OpenStack 的网络服务)集成,为虚拟机实例提供网络连接和配置。

  5. 块存储集成:Nova 与 Cinder(OpenStack 的块存储服务)集成,为虚拟机实例提供持久化存储卷。

  6. 镜像管理:Nova 与 Glance(OpenStack 的镜像服务)集成,支持从镜像创建虚拟机实例。

修改nova配置文件

在openstack计算节点(nova节点)执行

执行以下命令向配置文件添加client章节,这个配置文件的变更旨在优化 Ceph RBD 的性能,并为日志和管理操作提供更好的支持。通过启用缓存、设置并发管理操作的限制,以及对管理套接字和日志文件进行配置,可以确保虚拟机实例在使用 Ceph 存储时具有更高的性能和可靠性。

1
2
3
4
5
6
7
8
cat >> /etc/ceph/ceph.conf <<-'EOF'
[client]
rbd cache = true
rbd cache writethrough until flush = true
rbd concurrent management ops = 20
admin socket = /var/run/ceph/guests/$cluster-$type.$id.$pid.$cctid.asok
log file = /var/log/ceph/qemu-guest-$pid.log
EOF

为 admin 套接字和日志文件创建新目录,并将目录权限更改为使用 qemu 用户和 libvirtd 组

1
2
mkdir -p /var/run/ceph/guests/ /var/log/ceph/
chown qemu:libvirt /var/run/ceph/guests /var/log/ceph/
  1. rbd cache = true:启用 RBD 客户端的缓存功能。这可以显著提升读写性能,特别是在高 I/O 工作负载下。

  2. rbd cache writethrough until flush = true:配置缓存写入模式为“通过直到刷新”,这有助于在保证数据一致性的同时提高写入性能。

  3. rbd concurrent management ops = 20:设置并发管理操作的数量限制为 20。这可以控制并发操作数量,以避免对系统资源的过度消耗。

  4. admin socket = /var/run/ceph/guests/$cluster-$type.$id.$pid.$cctid.asok:指定管理套接字的路径和名称,便于调试和管理。这些变量 ($cluster, $type, $id, $pid, $cctid) 会动态替换为相应的值。

  5. log file = /var/log/ceph/qemu-guest-$pid.log:指定日志文件路径和名称。$pid 变量确保每个虚拟机实例有单独的日志文件,便于日志管理和问题排查。

在每个 Nova 节点上,编辑 /etc/nova/nova.conf 文件。在 [libvirt] 部分下配置以下设置

1
2
3
4
5
6
7
8
9
10
11
crudini --set /etc/nova/nova.conf libvirt images_type rbd
crudini --set /etc/nova/nova.conf libvirt images_rbd_pool vms
crudini --set /etc/nova/nova.conf libvirt images_rbd_ceph_conf /etc/ceph/ceph.conf
crudini --set /etc/nova/nova.conf libvirt rbd_user cinder
crudini --set /etc/nova/nova.conf libvirt rbd_secret_uuid e4355171-b66e-4036-989f-f6af496797a6 # 这里是前面创uuidgen的UUID
crudini --set /etc/nova/nova.conf libvirt disk_cachemodes "network=writeback"
crudini --set /etc/nova/nova.conf libvirt inject_password false
crudini --set /etc/nova/nova.conf libvirt inject_key false
crudini --set /etc/nova/nova.conf libvirt inject_partition -2
crudini --set /etc/nova/nova.conf libvirt live_migration_flag "VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED"
crudini --set /etc/nova/nova.conf libvirt hw_disk_discard unmap

1
2
3
4
5
6
7
8
9
10
11
12
[libvirt]
images_type = rbd
images_rbd_pool = vms
images_rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
rbd_secret_uuid = 4b5fd580-360c-4f8c-abb5-c83bb9a3f964
disk_cachemodes="network=writeback"
inject_password = false
inject_key = false
inject_partition = -2
live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED"
hw_disk_discard = unmap

配置文件详解

  • 设置镜像类型为 RBD:在 [libvirt] 部分设置 images_type 参数为 rbd,指定 Nova 使用 Ceph RBD 作为镜像存储后端。

  • 指定 RBD 存储池:在 [libvirt] 部分设置 images_rbd_pool 参数为 vms,指定 Ceph 池 vms 用于镜像存储。

  • 指定 Ceph 配置文件:在 [libvirt] 部分设置 images_rbd_ceph_conf 参数为 /etc/ceph/ceph.conf,指定 Ceph 配置文件的位置。

  • 设置 RBD 用户:在 [libvirt] 部分设置 rbd_user 参数为 cinder,指定用于连接 Ceph RBD 的用户。

  • 配置密钥 UUID:在 [libvirt] 部分设置 rbd_secret_uuid 参数,使用之前生成的 UUID,确保 libvirt 能够安全地访问 Ceph RBD。

  • 设置磁盘缓存模式:在 [libvirt] 部分设置 disk_cachemodes 参数为 network=writeback,指定网络磁盘的缓存模式为写回,提高存储性能。

  • 禁用注入密码功能:在 [libvirt] 部分设置 inject_password 参数为 false,禁用注入密码功能,提高安全性。

  • 禁用注入 SSH 密钥功能:在 [libvirt] 部分设置 inject_key 参数为 false,禁用注入 SSH 密钥功能,提高安全性。

  • 设置注入分区:在 [libvirt] 部分设置 inject_partition 参数为 -2,配置注入到第一个扩展分区。

  • 设置实时迁移标志:在 [libvirt] 部分设置 live_migration_flag 参数,配置多种迁移标志(如 VIR_MIGRATE_UNDEFINE_SOURCEVIR_MIGRATE_PEER2PEER等)以支持不同类型的实时迁移。

  • 设置硬盘丢弃策略:在 [libvirt] 部分设置 hw_disk_discard 参数为 unmap,配置硬盘的丢弃策略为解除映射,以便优化空间使用。

重启服务就算集成好了

1
systemctl restart openstack-nova-compute

验证nova集成

创建一个服务器,然后观察ceph数据池有没有新增,有新增就是集成好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[root@controller ~]# openstack flavor list
+--------------------------------------+---------+------+------+-----------+-------+-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+--------------------------------------+---------+------+------+-----------+-------+-----------+
| c844c9c6-6560-4045-8409-69930908df49 | flavor1 | 1024 | 10 | 0 | 1 | True |
+--------------------------------------+---------+------+------+-----------+-------+-----------+
[root@controller ~]# openstack image list
+--------------------------------------+--------+--------+
| ID | Name | Status |
+--------------------------------------+--------+--------+
| cea1e1be-f56f-4d71-ab2a-12fae4a53b39 | cirros | active |
| 429e1184-7a08-4a36-ab25-6d233950f12b | cirros | active |
+--------------------------------------+--------+--------+
[root@controller ~]# openstack network list
+--------------------------------------+----------+--------------------------------------+
| ID | Name | Subnets |
+--------------------------------------+----------+--------------------------------------+
| 955e4b76-1906-4079-b796-3e68b274d732 | external | d457a064-73da-46e3-912c-2ee01e8f1481 |
| a3d5942b-9dd2-4c44-956a-c1e7b1ed558f | internal | cdb54869-a48a-47a4-ba76-f066dc90e09c |
+--------------------------------------+----------+--------------------------------------+
[root@controller ~]# openstack server create --flavor c844c9c6-6560-4045-8409-69930908df49 --image cea1e1be-f56f-4d71-ab2a-12fae4a53b39 --nic net-id=a3d5942b-9dd2-4c44-956a-c1e7b1ed558f testeserver
+-------------------------------------+------------------------------------------------+
| Field | Value |
+-------------------------------------+------------------------------------------------+
| OS-DCF:diskConfig | MANUAL |
| OS-EXT-AZ:availability_zone | |
| OS-EXT-SRV-ATTR:host | None |
| OS-EXT-SRV-ATTR:hypervisor_hostname | None |
| OS-EXT-SRV-ATTR:instance_name | |
| OS-EXT-STS:power_state | NOSTATE |
| OS-EXT-STS:task_state | scheduling |
| OS-EXT-STS:vm_state | building |
| OS-SRV-USG:launched_at | None |
| OS-SRV-USG:terminated_at | None |
| accessIPv4 | |
| accessIPv6 | |
| addresses | |
| adminPass | hs894qZPZJcf |
| config_drive | |
| created | 2024-12-19T03:10:24Z |
| flavor | flavor1 (c844c9c6-6560-4045-8409-69930908df49) |
| hostId | |
| id | c638f1e9-f211-49e0-9fef-4ad441c7c544 |
| image | cirros (cea1e1be-f56f-4d71-ab2a-12fae4a53b39) |
| key_name | None |
| name | testeserver |
| progress | 0 |
| project_id | c223c0bf51ab40fd94c3983ca5d04cc5 |
| properties | |
| security_groups | name='default' |
| status | BUILD |
| updated | 2024-12-19T03:10:24Z |
| user_id | 914fc3ad0a434009b59d5dc31115bd03 |
| volumes_attached | |
+-------------------------------------+------------------------------------------------+

看看vms池有没有数据

1
2
3
4
5
6
7
8
9
10
11
[root@controller ~]# rados -p vms ls --id cinder
rbd_id.c638f1e9-f211-49e0-9fef-4ad441c7c544_disk
rbd_directory
rbd_header.b16b7863d482
rbd_children
rbd_info
rbd_header.6e4fde594567
rbd_object_map.b16b7863d482
rbd_trash
rbd_object_map.6e4fde594567
rbd_id.ff4d631f-ff23-4ccd-868a-ce394ec073ab_disk

正常新增数据,nova集成成功