OpenStack 对接 Ceph

[TOC]node

 

1. Openstack 与 Ceph

1.1. Ceph 简介

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

  • 全部的计算节点共享存储,迁移时不须要拷贝根磁盘,即便计算节点挂了,也能当即在另外一个计算节点启动虚拟机(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 的区别)。github

1.2. Glance 介绍

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

  • 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.api

1.3. Nova 介绍

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

不过咱们在这里假定:app

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

启动虚拟机以前首先须要准备根磁盘(root disk),Nova称为image,和Glance同样,Nova的image也支持存储到本地磁盘、Ceph以及Cinder(boot from volume)中。须要注意的是,image保存到哪里是经过image type决定的,存储到本地磁盘能够是raw、qcow二、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就能够对接该存储系统。ide

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/$/)。

 

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

相关文章
相关标签/搜索