教你如何使用Ceph块设备增强OpenStack云环境

云计算 OpenStack
也许Ceph最有意思的部分就是同OpenStack的集成了。libvirt 配置了 librbd 的 QEMU 接口,通过它可以在 OpenStack 中使用 Ceph 块设备镜像。Ceph 块设备镜像被当作集群对象,这意味着它比独立的服务器有更好的性能。

也许Ceph最有意思的部分就是同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 集群正常运行,然后创建池。

  1. ceph osd pool create volumes 128 
  2. ceph osd pool create images 128 
  3. ceph osd pool create backups 128 
  4. 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 文件:

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

安装 Ceph 客户端包

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

  1. sudo apt-get install python-ceph 
  2. sudo yum install python-ceph 

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

  1. sudo apt-get install ceph-common 
  2. sudo yum install ceph 

设置 Ceph 客户端认证

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

  1. 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' 
  2. ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images' 
  3. 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 添加密钥来访问节点并改变所有者:

  1. ceph auth get-or-create client.glance | ssh {your-glance-api-server} sudo tee /etc/ceph/ceph.client.glance.keyring 
  2. ssh {your-glance-api-server} sudo chown glance:glance /etc/ceph/ceph.client.glance.keyring 
  3. ceph auth get-or-create client.cinder | ssh {your-volume-server} sudo tee /etc/ceph/ceph.client.cinder.keyring 
  4. ssh {your-cinder-volume-server} sudo chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring 
  5. ceph auth get-or-create client.cinder-backup | ssh {your-cinder-backup-server} sudo tee /etc/ceph/ceph.client.cinder-backup.keyring 
  6. 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 的节点:

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

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

  1. uuidgen 
  2. 457eb676-33da-42ec-9a8c-9293d545c337 
  3.  
  4. cat > secret.xml <<EOF 
  5. <secret ephemeral='no' private='no'
  6. <uuid>457eb676-33da-42ec-9a8c-9293d545c337</uuid> 
  7. <usage type='ceph'
  8. <name>client.cinder secret</name> 
  9. </usage> 
  10. </secret> 
  11. EOF 
  12. sudo virsh secret-define --file secret.xml 
  13. Secret 457eb676-33da-42ec-9a8c-9293d545c337 created 
  14. sudo virsh secret-set-value --secret 457eb676-33da-42ec-9a8c-9293d545c337 \ 
  15. --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] 部分:

  1. default_store = rbd rbd_store_user = glance rbd_store_pool = images rbd_store_chunk_size = 8 

Juno

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

  1. [DEFAULT] 
  2. ... 
  3. default_store = rbd 
  4. ... 
  5. [glance_store] 
  6. stores = rbd 
  7. rbd_store_pool = images 
  8. rbd_store_user = glance 
  9. rbd_store_ceph_conf = /etc/ceph/ceph.conf 
  10. rbd_store_chunk_size = 8 

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

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

#p#

所有 OpenStack 版本

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

  1. show_image_direct_url = True 

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

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

  1. [paste_deploy] flavor = keystone 

配置 Cinder Backup

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

  1. backup_driver = cinder.backup.drivers.ceph 
  2. backup_ceph_conf = /etc/ceph/ceph.conf 
  3. backup_ceph_user = cinder-backup 
  4. backup_ceph_chunk_size = 134217728 
  5. backup_ceph_pool = backups 
  6. backup_ceph_stripe_unit = 0 
  7. backup_ceph_stripe_count = 0 
  8. restore_discard_excess_bytes = true 

配置 Nova 绑定 Ceph rbd 块设备

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

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

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

配置 Nova

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

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

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

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

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

  1. [client] 
  2. rbd cache = true 
  3. rbd cache writethrough until flush = true 
  4. 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 并且添加:

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

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

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

  1. libvirt_inject_password = false libvirt_inject_key = false libvirt_inject_partition = -2 

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

  1. 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] 部分添加:

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

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

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

  1. libvirt_inject_password = false libvirt_inject_key = false libvirt_inject_partition = -2 

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

  1. libvirt_live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST" 

重启 OpenStack

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

  1. sudo glance-control api restart 
  2. sudo service nova-compute restart 
  3. sudo service cinder-volume restart 
  4. sudo service cinder-backup restart 

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

  1. sudo service openstack-glance-api restart 
  2. sudo service openstack-nova-compute restart 
  3. sudo service openstack-cinder-volume restart 
  4. sudo service openstack-cinder-backup restart 

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

从块设备启动

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

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

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

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

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

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

博文出处:http://my.oschina.net/JerryBaby/blog/376580

责任编辑:Ophira 来源: oschina博客
相关推荐

2017-12-06 14:35:01

OpenStackCeph存储

2018-05-22 08:37:02

Ceph存储存储系统

2018-04-12 08:37:27

2011-08-11 13:31:41

移动设备

2023-12-01 08:01:59

镜像Ceph

2015-02-13 09:44:02

2022-09-06 08:00:57

Ceph分布式存储系统

2009-09-11 08:36:16

linux块字符设备linux操作系统

2018-09-21 11:00:58

Ceph存储系统

2020-12-03 09:47:23

Python开发工具

2015-04-03 10:43:49

2020-12-09 06:26:13

多云混合云

2015-06-16 16:20:40

2012-02-16 10:00:59

2012-03-02 09:02:17

云计算云锁定

2021-12-06 10:21:50

LinuxDNS 查询

2011-01-20 10:19:21

PowerShell个性化

2016-01-31 17:44:46

星辰天合OpenStackCeph

2012-09-12 17:04:53

OpenStack云计算存储

2009-06-17 15:18:09

Java环境
点赞
收藏

51CTO技术栈公众号