OpenStack 对接 Ceph

 

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 部署情况

IP 节点名称 组件 对应存储池 说明
192.168.0.121 controller Glacne images 控制节点
192.168.0.122 compute Nova vms 计算节点
192.168.0.123 blockstorage Cinder volumes 存储节点

Ceph 部署情况

IP 节点名称
192.168.0.131 node1
192.168.0.132 node2
192.168.0.133 node3

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

上一篇:Lvs+Keepalived+Mysql


下一篇:An NIO.2 primer--reference