教你如何使用Ceph块设备增强OpenStack云环境
创始人
2025-01-10 09:21:10
0

也许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/)。在 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 

安装 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 <
  5.  
  6. 457eb676-33da-42ec-9a8c-9293d545c337 
  7.  
  8. client.cinder secret 
  9.  
  10.  
  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

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...