译:块设备和 OpenStack

libvirt 配置了 librbd 的 QEMU 接口,通过它可以在 OpenStack 中使用 Ceph 块设备镜像。Ceph 块设备镜像被当作集群对象,这意味着它比独立的服务器有更好的性能。

在 OpenStack 中使用 Ceph 块设备,必须首先安装 QEMU,libvirt 和 OpenStack。建议 OpenStack 安装的时候使用独立的物理节点。OpenStack 节点建议最小 8G RAM和四核处理器。下图描述了 OpenStack 和 Ceph 技术层次。

Important:要在 OpenStack 中使用 Ceph,必须首先运行 Ceph 存储集群

OpenStack 与 Ceph 的三个结合点:

  • 镜像:OpenStack Glance 管理虚拟机镜像。镜像是不变的。OpenStack 把镜像当作二进制对象并以此格式下载。
  • :卷是块设备。OpenStack 使用卷来启动虚拟机,或者绑定卷到运行中的虚拟机。OpenStack 使用 Cinder 服务管理卷。
  • 客户磁盘:客户磁盘是客户操作系统磁盘。默认情况下,当启动一台虚拟机时,它的系统盘以文件的形式出现在 hypervisor 系统上(通常在 /var/lib/nova/instances/<uuid>)。在 OpenStack Havana 以前的版本,在 Ceph 中启动虚拟机的唯一方式是使用 Cinder 的 boot-from-volume 功能,现在能够在 Ceph 中直接启动虚拟机而不用依赖于 Cinder,这是非常有利的因为它能够让你很容易的进行虚拟机的热迁移。除此之外,如果 hypervisor 挂掉还能够方便地触发 nova evacute 然后无缝得在其他的地方继续运行虚拟机。

可以使用 OpenStack Glance 来存储镜像在 Ceph 块设备中,也可以使用 Cinder 通过镜像的写时复制来启动虚拟机。

下面详细介绍 Glance,Cinder 和 Nova 的配置过程,尽管它们没有必要一起使用。当虚拟机运行使用本地磁盘运行的时候,可以把镜像存储在 Ceph 块设备中,或者正相反。

Important:Ceph 不支持 QCOW2 格式的虚拟机磁盘。所以,如果想要在 Ceph 中启动虚拟机(后端文件或者从卷启动),Glance 镜像必须是 RAW格式

Tip:本文档描述的 Ceph 块设备是基于 OpenStack Havana。更早的版本请看Block Devices and OpenStack (Dumpling)

创建一个池

默认情况下,Ceph 块设备使用 rbd 池。可以使用任何能够使用的池。建议为 Cinder 和 Glance 单独创建池。确保 Ceph 集群正常运行,然后创建池。

ceph osd pool create volumes 128
ceph osd pool create images 128
ceph osd pool create backups 128
ceph osd pool create vms 128

看 Create a Pool 和 Placement Groups 来了解指定池的 pg 数量的详细信息和应该为你的池指定多少 pg。

配置 OpenStack Ceph 客户端

运行 glance-api,cinder-volume,nova-compute 和 cinder-backup 的节点是 Ceph 客户端。每一个节点都需要 ceph.conf 文件:

ssh {your-openstack-server} sudo tee /etc/ceph/ceph.conf </etc/ceph/ceph.conf

安装 Ceph 客户端包

在 glance-api 节点,需要为 librbd 绑定 Python

sudo apt-get install python-ceph
sudo yum install python-ceph

在 nova-compute,cinder-backup 和 cinder-volume 节点要用到 Python 和 Ceph 客户端命令行工具:

sudo apt-get install ceph-common
sudo yum install ceph

设置 Ceph 客户端认证

如果使用了 cephx authentication,创建一个新用户为 Nova/Cinder 和 Glance。执行下面的命令:

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‘
ceph auth get-or-create client.glance mon ‘allow r‘ osd ‘allow class-read object_prefix rbd_children, allow rwx pool=images‘
ceph auth get-or-create client.cinder-backup mon ‘allow r‘ osd ‘allow class-read object_prefix rbd_children, allow rwx pool=backups‘

为 client.cinder,client.glance 和 client.cinder-backup 添加密钥来访问节点并改变所有者:

ceph auth get-or-create client.glance | ssh {your-glance-api-server} sudo tee /etc/ceph/ceph.client.glance.keyring
ssh {your-glance-api-server} sudo chown glance:glance /etc/ceph/ceph.client.glance.keyring
ceph auth get-or-create client.cinder | ssh {your-volume-server} sudo tee /etc/ceph/ceph.client.cinder.keyring
ssh {your-cinder-volume-server} sudo chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring
ceph auth get-or-create client.cinder-backup | ssh {your-cinder-backup-server} sudo tee /etc/ceph/ceph.client.cinder-backup.keyring
ssh {your-cinder-backup-server} sudo chown cinder:cinder /etc/ceph/ceph.client.cinder-backup.keyring

运行 nova-compute 的节点 nova-compute 进程需要密钥文件。它们也存储 client.cinder 用户的密钥在 libvirt。libvirt 进程在 Cinder 中绑定块设备时需要用到它来访问集群。

创建一个临时的密钥文件副本在运行 nova-compute 的节点:

ceph auth get-key client.cinder | ssh {your-compute-node} tee client.cinder.key

然后在计算节点,为 libvirt 添加密钥文件并且移除临时的副本密钥:

uuidgen
457eb676-33da-42ec-9a8c-9293d545c337

cat > secret.xml <<EOF
<secret ephemeral=‘no‘ private=‘no‘>
  <uuid>457eb676-33da-42ec-9a8c-9293d545c337</uuid>
  <usage type=‘ceph‘>
    <name>client.cinder secret</name>
  </usage>
</secret>
EOF
sudo virsh secret-define --file secret.xml
Secret 457eb676-33da-42ec-9a8c-9293d545c337 created
sudo virsh secret-set-value --secret 457eb676-33da-42ec-9a8c-9293d545c337 \--base64 $(cat client.cinder.key) && rm client.cinder.key secret.xml

Important:没有必要保存所有计算节点的 UUID。但是为了平台的一致性,最好保存相同的 UUID。

配置 OpenStack 使用 Ceph

配置 Glance

Glance 能够使用多种后端来存储镜像。默认使用 Ceph 块设备,配置 Glance 如下:

Juno 之前的版本

编辑 /etc/glance/glance-api.conf 并且添加下面的 [DEFAULT] 部分:

default_store = rbd
rbd_store_user = glance
rbd_store_pool = images
rbd_store_chunk_size = 8
Juno

编辑 /etc/glance/glance-api.conf 并且添加 [glance_store] 部分:

[DEFAULT]
...
default_store = rbd
...
[glance_store]
stores = rbd
rbd_store_pool = images
rbd_store_user = glance
rbd_store_ceph_conf = /etc/ceph/ceph.conf
rbd_store_chunk_size = 8

更多关于 Glance 的配置信息请看:http://docs.openstack.org/trunk/config-reference/content/section_glance-api.conf.html

Important:Glance 还没有完全移到 ‘store‘。所以仍然需要在 DEFAULT 部分配置 store。

所有 OpenStack 版本

如果要启用镜像的写时复制功能,添加下面的 [DEFAULT] 部分:

show_image_direct_url = True

注意这会在 Glance API 中暴露后端存储位置,所以 endpoint 不应该被公开访问

禁用 Glance 缓存管理来避免镜像被缓存到 /var/lib/glance/image-cache/,确保配置文件中有 flavor = keystone+cachemanagement:

[paste_deploy]
flavor = keystone

配置 Cinder Backup

OpenStack Cinder Backup 需要一个守护进程,不要忘记安装它。在 Cinder Backup 节点,编辑 /etc/cinder/cinder.conf 并添加:

backup_driver = cinder.backup.drivers.ceph
backup_ceph_conf = /etc/ceph/ceph.conf
backup_ceph_user = cinder-backup
backup_ceph_chunk_size = 134217728
backup_ceph_pool = backups
backup_ceph_stripe_unit = 0
backup_ceph_stripe_count = 0
restore_discard_excess_bytes = true

配置 Nova 绑定 Ceph rbd 块设备

为了绑定 Cinder 设备(块设备或者启动卷),必须告诉 Nova(和 libvirt)用户和 UUID。libvirt 在与 Ceph 集群进行连接和认证的时候提供这个用户。

rbd_user = cinder
rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337

这两个配置项同样用于 Nova 的后端。

配置 Nova

为了直接从 Ceph 启动所有虚拟机,你必须配置 Nova 的临时后端。

建议在 Ceph 配置文件中启用 RBD 缓存(从 Giant 版本默认启用)。还有,启用 admin socket 对于故障排除的时候很有帮助。每台使用 Ceph 块设备的虚拟机都有一个 socket 有助于性能分析和错误判断。

socket 可以通过这种方式访问:

ceph daemon /var/run/ceph/ceph-client.cinder.19195.32310016.asok help

现在,在每个计算节点编辑 Ceph 配置文件:

[client]
    rbd cache = true
    rbd cache writethrough until flush = true
    admin socket = /var/run/ceph/$cluster-$type.$id.$pid.$cctid.asok

Tip:如果虚拟机正在运行,可以直接重启来获得 socket。

HAVANA 和 ICEHOUSE

HAVANA 和 ICEHOUSE 需要补丁来实现写时复制并且修复 rbd 临时磁盘的镜像大小和热迁移 Bug。这些可用的分支基于主干 Nova stable/havana 和 stable/icehouse。使用它们不是强制性的但是是非常建议的,为了利用写时复制的功能。

在每个计算节点,编辑 /etc/nova/nova.conf 并且添加:

libvirt_images_type = rbd
libvirt_images_rbd_pool = vms
libvirt_images_rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337

禁用文件注入也是一个好的习惯。启动一个实例的时候,Nova 通常试图去打开虚拟机的根文件系统。然后 Nova 注入值比如密码,ssh 密钥等,直接进入文件系统。然而,最好依赖元数据服务和 cloud-init。

在每个计算节点,编辑 /etc/nova/nova.conf 并且添加:

libvirt_inject_password = false
libvirt_inject_key = false
libvirt_inject_partition = -2

确保热迁移,使用下面的标志:

libvirt_live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST"
Juno

在 Juno 版本,Ceph 块设备被移到 [libvirt] 部分。在每个计算节点,编辑 /etc/nova/nova.conf 在 [libvirt] 部分添加:

[libvirt]
images_type = rbd
images_rbd_pool = vms
images_rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337

禁用文件注入也是一个好的习惯。启动一个实例的时候,Nova 通常试图去打开虚拟机的根文件系统。然后 Nova 注入值比如密码,ssh 密钥等,直接进入文件系统。然而,最好依赖元数据服务和 cloud-init。

在每个计算节点,编辑 /etc/nova/nova.conf 并且添加:

libvirt_inject_password = false
libvirt_inject_key = false
libvirt_inject_partition = -2

确保热迁移,使用下面的标志:

libvirt_live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST"

重启 OpenStack

激活 Ceph 块设备驱动并且载入块设备池的名称到配置中,必须重启 OpenStack。基于 Debian 的系统执行这些命令:

sudo glance-control api restart
sudo service nova-compute restart
sudo service cinder-volume restart
sudo service cinder-backup restart

基于 Red Hat 的系统执行这些命令:

sudo service openstack-glance-api restart
sudo service openstack-nova-compute restart
sudo service openstack-cinder-volume restart
sudo service openstack-cinder-backup restart

OpenStack 启动并运行起来之后,就能够创建一个卷并从它启动。

从块设备启动

使用下面的 Cinder 命令创建一个来自镜像的卷:

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

注意镜像必须是 RAW 格式。可以使用 qemu-img 转换镜像格式。例如:

qemu-img convert -f {source-format} -O {output-format} {source-filename} {output-filename}
qemu-img convert -f qcow2 -O raw precise-cloudimg.img precise-cloudimg.raw

当 Glance 和 Cinder 都使用 Ceph 块设备,镜像是写时复制的,所以创建一个新的卷非常迅速。在 OpenStack Dashboard 中,可以通过下面的步骤来从卷启动虚拟机:

  1. 载入一个新实例;
  2. 选择镜像关联到写时复制克隆;
  3. 选择“从卷启动”;
  4. 选择创建的卷。

================================================

时间: 2024-12-13 04:47:39

译:块设备和 OpenStack的相关文章

Nova: 虚机的块设备总结 [Nova Instance Block Device]

和物理机一样,虚拟机包括几个重要的部分:CPU.内存.磁盘设备.网络设备等.本文将简要总结虚机磁盘设备有关知识. 1. Nova boot CLI 中有关虚机块设备的几个参数 nova boot CLI 的完整参数如下: usage: nova boot [--flavor <flavor>] [--image <image>] //boot from image with id [--image-with <key=value>] //image metadata p

如何使用Linux lsblk命令列出块设备信息

译至:http://linoxide.com/linux-command/linux-lsblk-command/ lsblk命令(列出块设备)用于列出所有可用的块设备的信息,但是, 它并没有列出有关的RAM磁盘的信息.块设备的例子是硬盘,闪存驱动器,CD-ROM等等. 如何安装lsblk 该命令lsblk在util-linux-ng的包里,现在改名为util-linux.该软件包中有其他的一些工具,如dmesg.为了安装lsblk,在这里下载util-linux. 如何在Fedora里安装ls

Ceph块设备管理与Openstack配置(上)

Oepnstack之CEPH系列是根据Ceph Cookbook整理的笔记,分为以下几个部分: <Ceph简介> <Ceph集群操作> <Ceph块设备管理与Openstack配置> <深入Ceph> <ceph优化与性能测试> 注意:此文对应ceph版本为10.1.2 #ceph -v ceph version 10.1.2(4a2a6f72640d6b74a3bbd92798bb913ed380dcd4) 前言 目前接触到的Mitaka版本O

Ceph 块设备

块是一个字节序列(例如,一个 512 字节的数据块).基于块的存储接口是最常见的存储数据方法,它们基于旋转介质,像硬盘. CD .软盘.甚至传统的 9 磁道磁带.无处不在的块设备接口使虚拟块设备成为与 Ceph 这样的海量存储系统交互的理想之选. Ceph 块设备是精简配置的.大小可调且将数据条带化存储到集群内的多个 OSD . Ceph 块设备利用 RADOS 的多种能力,如快照.复制和一致性. Ceph 的 RADOS 块设备( RBD )使用内核模块或 librbd 库与 OSD 交互.

006 管理Ceph的RBD块设备

一, Ceph RBD的特性 支持完整和增量的快照 自动精简配置 写时复制克隆 动态调整大小 二.RBD基本应用 2.1 创建RBD池 [root@ceph2 ceph]# ceph osd pool create rbd 64 pool 'rbd' created [root@ceph2 ceph]# ceph osd pool application enable rbd rbd enabled application 'rbd' on pool 'rbd' 2.2 客户端验证 [root@

Ceph块设备介绍与安装配置

一:rbd介绍 块是字节序列(例如,一个512字节的数据块).基于块的存储接口是使用旋转介质(例如硬盘,CD,软盘甚至传统的9-track tape)存储数据的最常用方法.块设备接口的无处不在,使虚拟块设备成为与海量数据存储系统(如Ceph)进行交互的理想候选者. Ceph块设备经过精简配置,可调整大小,并在Ceph集群中的多个OSD上存储条带化数据,ceph块设备利用了RADOS功能,例如快照,复制和一致性. Ceph的RADOS块设备(RBD)使用内核模块或librbd库与OSD进行交互.'

Smart210学习记录------块设备

转自:http://bbs.chinaunix.net/thread-2017377-1-1.html 本章的目的用尽可能最简单的方法写出一个能用的块设备驱动.所谓的能用,是指我们可以对这个驱动生成的块设备进行mkfs,mount和读写文件.为了尽可能简单,这个驱动的规模不是1000行,也不是500行,而是100行以内. 这里插一句,我们不打算在这里介绍如何写模块,理由是介绍的文章已经满天飞舞了.如果你能看得懂.并且成功地编译.运行了这段代码,我们认为你已经达到了本教程的入学资格,当然,如果你不

DRBD分布式复制块设备

一.实验环境: 服务器1--ip:192.168.10.1--hostname:rhel1--单独拿一块磁盘sdb作为drbd 服务器2--ip:192.168.10.2--hostname:rhel2--单独拿一块磁盘sdb作为drbd 二.准备所需软件包,服务器1与服务器2一样: 三.修改hosts文件,添加如下内容,服务器1与服务器2一样: 四.drbd编译安装,服务器1与服务器2一样: 1.安装依赖包: 2.编译安装: 3.建立pid存放目录: 4.拷贝drbd启动脚本: 5.编译drb

【深入Linux块设备驱动层次之一】整体层次

最近在做文件系统和linux块设备相关的工作,需要对文件系统和底层块设备之间的关系和交互有比较深入的了解.笔者参考的书籍有敖青云所著的<存储技术原理分析-基于Linux2.6内核原代码>,同时参考的还有Jonathan Corbet.Alessandro Rubini和Greg Kroah-Hartman 一起著作的linux设备经典书籍<Linux设备驱动Edition 3 >.陈学松写的<深入Linux设备驱动内核机制>.对比了一下,还是敖青云写的很存储结合更紧密一