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

OpenStack 对接 Ceph的更多相关文章

  1. OpenStack 对接 Ceph 环境可以创建卷但不能挂载卷的问题

    问题 环境:Nova.Cinder.Glance 都对接了 Ceph RBD 后端存储. 以往的操作包括上传镜像.创建卷.挂载卷都是一切正常的,但突然出现了无法挂载卷的问题,而且还是因为 Ceph 客 ...

  2. 分布式存储ceph——(2)openstack对接ceph存储后端

    ceph对接openstack环境 一.使用rbd方式提供存储如下数据: (1)image:保存glanc中的image: (2)volume存储:保存cinder的volume:保存创建虚拟机时选择 ...

  3. 理解 OpenStack + Ceph (5):OpenStack 与 Ceph 之间的集成 [OpenStack Integration with Ceph]

    理解 OpenStack + Ceph 系列文章: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 (5)Ceph 与 OpenS ...

  4. k8s对接ceph存储

    前提条件:已经部署好ceph集群 本次实验由于环境有限,ceph集群是部署在k8s的master节点上的 一.创建ceph存储池 在ceph集群的mon节点上执行以下命令: ceph osd pool ...

  5. 高可用OpenStack(Queen版)集群-14.Openstack集成Ceph准备

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  6. openstack对接VMware浅析

    前言 本文是对openstack对接vmware的浅析,所以本文重点是以下两点: 先了解它的整体架构,搞清楚为什么要用这样的架构: 然后再了解架构中的各个组件,组件提供的主要功能与各个组件之间的交互 ...

  7. OpenStack集成ceph

    openstack组件集成ceph OpenStack集成ceph详细过程可以查看ceph官方文档:ceph document OpenStack Queens版本,1台控制节点controller, ...

  8. ceph与openstack对接

    对接分为三种,也就是存储为openstack提供的三类功能1.云盘,就好比我们新加的硬盘2.原本的镜像也放在ceph里,但是我没有选择这种方式,原因是因为后期有要求,但是我会把这个也写出来,大家自己对 ...

  9. ceph与openstack对接(cinder、glance、nova)

    对接分为三种,也就是存储为openstack提供的三类功能1.云盘,就好比我们新加的硬盘2.原本的镜像也放在ceph里,但是我没有选择这种方式,原因是因为后期有要求,但是我会把这个也写出来,大家自己对 ...

随机推荐

  1. day27(反射之内省机制)

    内省 内省:底层是使用反射机制实现的,是对于反射的进一步封装. 反射:通过类名来获取类中的所有属性和方法及类中的所有隐藏的方法. 内省:通过一个标准类(javabean类)来获取bean中的字段.ge ...

  2. Beta阶段第一篇 Scrum 冲刺博客

    介绍小组新加入的成员,Ta担任的角色 新成员 担任角色 张晨晨 测试 理由:晨晨代码能力有待提高,但心思细腻有耐心,适合测试工作. 讨论是否需要更换团队的PM 通过团队讨论决定不更换团队PM,理由是在 ...

  3. CSS 基础 例子 背景色 & 背景图片

    背景简写形式 : body {background:#ffffff url('img_tree.png') no-repeat right top;} 一.背景色  background-color ...

  4. shell中十种实现自加的方法

    shell中十种实现自加的方法 let "n = $n + 1" : $((n = $n + )) ((n = n+)) n=$(($n + )) : $[ n = $n + ] ...

  5. [leet code 190]reverse bits

    1 题目 Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represente ...

  6. FFmpeg4.0笔记:file2rtmp

    Github: https://github.com/gongluck/FFmpeg4.0-study.git #include <iostream> using namespace st ...

  7. C# 利用VS中的插件来打包并发布winfrom程序

    1.先在VS 的扩展更新中搜索此插件[2015 installer Projects],点击下载,安装需要关闭VS 2.安装完毕之后新建项目 3.选择“application folder”项,然后在 ...

  8. 开源 PetaPoco 扩展~一个小型轻巧的ORM~

    PetaPoco http://www.toptensoftware.com/petapoco/ |PetaPoco is a tiny, fast, single-file micro-ORM fo ...

  9. Linux之IRQ domain

    概述 Linux使用IRQ domain来描述一个中断控制器(IRQ Controller)所管理的中断源.换句话说,每个中断控制器都有自己的domain.我们可以将IRQ Domain看作是IRQ ...

  10. jsp的两个include了解

    在jsp中三大指令(page --  include -- taglib)中有一个 include 然后再三个动作标签中(include -- forward -- param)中也有一个includ ...