1. Openstack 与 Ceph

1.1. Ceph 简介

Ceph 是当前非常流行的开源分布式存储系统,具有高扩展性、高性能、高可靠性等优点,同时提供块存储服务(RBD)、对象存储服务(RGW)以及文件系统存储服务(CEPHFS)。目前也是 OpenStack 的主流后端存储,和 OpenStack 亲如兄弟,为 OpenStack 提供统一共享存储服务。使用 Ceph 作为 OpenStack 后端存储,具有如下优点:

  • 所有的计算节点共享存储,迁移时不需要拷贝根磁盘,即使计算节点挂了,也能立即在另一个计算节点启动虚拟机(evacuate)。
  • 利用COW(Copy On Write)特性,创建虚拟机时,只需要基于镜像 clone 即可,不需要下载整个镜像,而 clone 操作基本是0开销,从而实现了秒级创建虚拟机。
  • Ceph RBD 支持 thin provisioning,即按需分配空间,有点类似Linux文件系统的 sparse 稀疏文件。创建一个20GB的虚拟硬盘时,最开始并不占用物理存储空间,只有当写入数据时,才按需分配存储空间。

Ceph 的更多知识可以参考官方文档,这里我们只关注 RBD,RBD 管理的核心对象为块设备(block device),通常我们称为 volume,不过 Ceph 中习惯称之为 image(注意和 OpenStack image 的区别)。

1.2. Glance 介绍

Glance管理的核心实体是image,它是OpenStack的核心组件之一,为OpenStack提供镜像服务(Image as Service),主要负责OpenStack镜像以及镜像元数据的生命周期管理、检索、下载等功能。Glance支持将镜像保存到多种存储系统中,后端存储系统称为store,访问镜像的地址称为location,location可以是一个http地址,也可以是一个rbd协议地址。只要实现store的driver就可以作为Glance的存储后端,其中driver的主要接口如下:

  • get: 获取镜像的location。
  • get_size: 获取镜像的大小。
  • get_schemes: 获取访问镜像的URL前缀(协议部分),比如rbd、swift+https、http等。
  • add: 上传镜像到后端存储中。
  • delete: 删除镜像。
  • set_acls: 设置后端存储的读写访问权限。

为了便于维护,glance store目前已经作为独立的库从Glance代码中分离出来,由项目glance_store维护。目前社区支持的store列表如下:

  • filesystem: 保存到本地文件系统,默认保存/var/lib/glance/images到目录下。
  • cinder: 保存到Cinder中。
  • rbd:保存到Ceph中。
  • sheepdog:保存到sheepdog中。
  • swift: 保存到Swift对象存储中。
  • vmware datastore: 保存到Vmware datastore中。
  • http: 以上的所有store都会保存镜像数据,唯独http store比较特殊,它不保存镜像的任何数据,因此没有实现add方法,它仅仅保存镜像的URL地址,启动虚拟机时由计算节点从指定的http地址中下载镜像。

本文主要关注rbd store,它的源码在这里,该store的driver代码主要由国内Fei Long Wang负责维护,其它store的实现细节可以参考源码 glance store drivers.

1.3. Nova 介绍

Nova管理的核心实体为server,为OpenStack提供计算服务,它是OpenStack最核心的组件。注意 Nova 中的server不只是指虚拟机,它可以是任何计算资源的抽象,除了虚拟机以外,也有可能是baremetal裸机、容器等。

不过我们在这里假定:

  • server 为虚拟机。
  • image type 为 rbd。
  • compute driver 为 libvirt。

启动虚拟机之前首先需要准备根磁盘(root disk),Nova称为image,和Glance一样,Nova的image也支持存储到本地磁盘、Ceph以及Cinder(boot from volume)中。需要注意的是,image保存到哪里是通过image type决定的,存储到本地磁盘可以是raw、qcow2、ploop等,如果image type为rbd,则image存储到Ceph中。不同的image type由不同的image backend负责,其中rbd的backend为nova/virt/libvirt/imageackend中的Rbd类模块实现。

1.4. Cinder 介绍

Cinder是OpenStack的块存储服务,类似AWS的EBS,管理的实体为volume。Cinder并没有实现volume provide功能,而是负责管理各种存储系统的volume,比如Ceph、fujitsu、netapp等,支持volume的创建、快照、备份等功能,对接的存储系统我们称为backend。只要实现了cinder/volume/driver.py中VolumeDriver类定义的接口,Cinder就可以对接该存储系统。

Cinder不仅支持本地volume的管理,还能把本地volume备份到远端存储系统中,比如备份到另一个Ceph集群或者Swift对象存储系统中,本文将只考虑从源Ceph集群备份到远端Ceph集群中的情况。

1.5. 总结

Ceph 集群可以作为 OpenStack 的后端存储,分别向 Glance、Nova、Cinder 组件提供块设备服务。——《Ceph 设计原理与实现》

根据官方文档,OpenStack 里有三个地方可以和 Ceph 块设备结合:

  1. Images:OpenStack 的 Glance 管理着 VM 的 image 。Image 相对恒定,OpenStack 把它们当作二进制文件、并以此格式下载。

  2. Volumes:OpenStack 用 Cinder 服务管理 Volumes 。Volume 是块设备,OpenStack 用它们引导虚拟机、或挂载到运行中的虚拟机上。

  3. Guest Disks: Guest disks 是装有客户操作系统的磁盘。默认情况下,启动一台虚拟机时,它的系统盘表现为 hypervisor 文件系统的一个文件(通常位于 /var/lib/nova/instances/${uuid}/)。

 

2. 准备工作

  • OpenStack 处于正常工作状态
  • Ceph 集群正常工作
  • OpenStack 各节点与 Ceph 集群各节点网络互通

OpenStack 部署情况

192.168.0.121controllerGlacneimages控制节点
192.168.0.122computeNovavms计算节点
192.168.0.123blockstorageCindervolumes存储节点

Ceph 部署情况

192.168.0.131node1
192.168.0.132node2
192.168.0.133node3

3. 安装 Ceph 客户端

在 OpenStack 的所有节点配置好 Ceph 安装包 yum 源,在 /etc/yum.repos.d/ 目录下编辑 ceph.repo

[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
enabled=1
gpgcheck=0
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1

然后安装 Ceph 客户端

yum install -y ceph

将任意一个 Ceph 集群节点的 Ceph 配置文件和 ceph.client.admin.keyring 拷贝到所有 OpenStack 节点

scp {ceph-node-ip}:/etc/ceph/ceph.conf {openstack-node-ip}:/etc/ceph
scp {ceph-node-ip}:/etc/ceph/ceph.client.admin.keyring {openstack-node-ip}:/etc/ceph

4. 创建存储池

创建 Glance、Nova、Cinder 对应存储池:

ceph osd pool create images {pg_num}
ceph osd pool create vms {pg_num}
ceph osd pool create volumes {pg_num}

5. 配置存储池鉴权

在控制节点创建 Ceph 客户端及存储池的鉴权,生成相应的 key 文件:

ceph auth get-or-create client.cinder mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rwx pool=vms, allow rx pool=images' -o /etc/ceph/ceph.client.cinder.keyring

ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images' -o /etc/ceph/ceph.client.glance.keyring

将生成的 key 文件拷贝到其他所有 OpenStack节点:

scp *.keyring 192.168.0.122:/etc/ceph/
scp *.keyring 192.168.0.123:/etc/ceph/

在 OpenStack 控制节点修改密钥文件拥有者为对应的组件用户:

chown glance:glance /etc/ceph/ceph.client.glance.keyring
chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring

在运行 nova-compute 的节点上,将密钥添加到 libvcirt,删除临时的密钥文件:

ceph auth get-key client.cinder | tee client.cinder.key
uuidgen
ae3d9d0a-df88-4168-b292-c07cdc2d8f02
// 注:uuidgen 只需要运行一次即可,所有涉及 uuid 的地方都共用这个生成的 uuid cat > secret.xml <<EOF
<secret ephemeral='no' private='no'>
<uuid>ae3d9d0a-df88-4168-b292-c07cdc2d8f02</uuid>
<usage type='ceph'>
<name>client.cinder secret</name>
</usage>
</secret>
EOF
// 注:以上 cat 段落是整个拷贝一次执行 virsh secret-define --file secret.xml
生成 secret ae3d9d0a-df88-4168-b292-c07cdc2d8f02 virsh secret-set-value --secret ae3d9d0a-df88-4168-b292-c07cdc2d8f02 --base64 $(cat client.cinder.key) && rm client.cinder.key secret.xml
// 注:出现删除提示,输入y,回车

6. 修改配置 OpenStack 配置文件

6.1. 配置 Glance

Glance 有多种后端用于存储镜像,如果默认使用 Ceph 块设备,则需要在 Glance 组件所在节点进行配置:

openstack-config --set /etc/glance/glance-api.conf DEFAULT "show_image_direct_url" "True"
openstack-config --set /etc/glance/glance-api.conf glance_store "default_store" "rbd"
openstack-config --set /etc/glance/glance-api.conf glance_store "rbd_store_user" "glance"
openstack-config --set /etc/glance/glance-api.conf glance_store "rbd_store_pool" "images"
openstack-config --set /etc/glance/glance-api.conf glance_store "stores" "glance.store.filesystem.Store, glance.store.http.Store, glance.store.rbd.Store"
openstack-config --set /etc/glance/glance-api.conf paste_deploy "flavor" "keystone"

6.2. 配置 Cinder

使 Cinder 组件访问 Ceph 块设备,需要配置 Cinder 对应的块设备驱动及其他选项,在 Cinder 组件所在节点进行配置:

openstack-config --set /etc/cinder/cinder.conf DEFAULT "enabled_backends" "ceph"
openstack-config --set /etc/cinder/cinder.conf ceph "volume_driver" "cinder.volume.drivers.rbd.RBDDriver"
openstack-config --set /etc/cinder/cinder.conf ceph "volume_backend_name" "ceph"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_pool" "volumes"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_ceph_conf" "/etc/ceph/ceph.conf"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_flatten_volume_from_snapshot" "false"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_max_clone_depth" "5"
openstack-config --set /etc/cinder/cinder.conf ceph "rados_connect_timeout" "-1"
openstack-config --set /etc/cinder/cinder.conf ceph "glance_api_version" "2"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_user" "cinder"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_secret_uuid" "ae3d9d0a-df88-4168-b292-c07cdc2d8f02"

6.3. 配置 Nova

Nova 组件访问 Ceph 的块设备,需要在运行 Nova 的各节点上进行配置:

openstack-config --set /etc/nova/nova.conf libvirt "images_type" "rbd"
openstack-config --set /etc/nova/nova.conf libvirt "images_rbd_pool" "vms"
openstack-config --set /etc/nova/nova.conf libvirt "images_rbd_ceph_conf" "/etc/ceph/ceph.conf"
openstack-config --set /etc/nova/nova.conf libvirt "rbd_user" "cinder"
openstack-config --set /etc/nova/nova.conf libvirt "rbd_secret_uuid" "ae3d9d0a-df88-4168-b292-c07cdc2d8f02"
openstack-config --set /etc/nova/nova.conf libvirt "inject_password" "false"
openstack-config --set /etc/nova/nova.conf libvirt "inject_key" "false"
openstack-config --set /etc/nova/nova.conf libvirt "inject_partition" "-2"
openstack-config --set /etc/nova/nova.conf libvirt "live_migration_flag" "VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST"

7. 重启 OpenStack 各服务

在控制节点,重启各服务:

sudo service openstack-glance-api restart
sudo service openstack-nova-api restart
sudo service openstack-cinder-api restart
sudo service openstack-cinder-scheduler restart

在计算节点,重启 Nova 服务:

sudo service openstack-nova-compute restart

在存储节点,重启 Cinder 服务:

sudo service openstack-cinder-volume restart

8. 验证对接有效性

graph LR
A[mirror] -->|glance| B(image)
B --> |cinder|C(volume)
C --> |nova|D[VM]

8.1. Ceph 客户端验证

在各 OpenStack 节点上运行命令:

ceph status
ceph -s

如果能顺利执行,则证明客户端安装成功。

8.2. Glance 组件对接验证

在控制节点上,先获取key:

source /root/keystone_admin

然后通过 Glance 上传一个镜像:

glance image-create --name cirros --disk-format raw --container-format ovf --f {your-image-path}

通过查询 Glance存储池信息,查看镜像是否已经上传:

rbd ls images

如果查看到镜像信息,则证明 Glance 组件对接成功。

8.3. Cinder 组件对接验证

例如,在控制节点通过 Cinder 创建一个空白云盘:

cinder create --display-name {volume-name} {volume-size}

这里使用上传的镜像通过 Cinder 创建一个镜像云盘:

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

通过查询 Cinder 存储池信息,查看空白云盘及镜像云盘是否已经承载在 Ceph:

rbd ls volumes

如果查询到云盘信息,则证明 Cinder 组件对接成功。

8.4. Nova 组件对接验证

首先通过 Dashboard 创建一个 VM,从刚才创建的镜像云盘(volume)启动(前提:有可用网络):

nova boot --image {image-id} --flavor {flavor-id} --nic net-id={net-id} {instance-name}

然后查询 VM 是否创建成功:

nova list | grep {instacne-name}

如果创建的 VM 为 Active 状态,则证明 Nova 组件对接成功。

 

参考链接:

OpenStack使用Ceph存储-Ceph到底做了什么

rbd-openstack

05-11 21:50