⑩ OpenStack高可用集群部署方案(train版)—OpenStack对接Ceph存储 十八、OpenStack对接Ceph存储

十八、OpenStack对接Ceph存储

参考Ceph官方安装文档

Openstack环境中,数据存储可分为临时性存储与永久性存储。

临时性存储:主要由本地文件系统提供,并主要用于nova虚拟机的本地系统与临时数据盘,以及存储glance上传的系统镜像;

永久性存储:主要由cinder提供的块存储与swift提供的对象存储构成,以cinder提供的块存储应用最为广泛,块存储通常以云盘的形式挂载到虚拟机中使用。

Openstack中需要进行数据存储的三大项目主要是nova项目(虚拟机镜像文件),glance项目(共用模版镜像)与cinder项目(块存储)。

下图为cinder,glance与nova访问ceph集群的逻辑图:

ceph与openstack集成主要用到ceph的rbd服务,ceph底层为rados存储集群,ceph通过librados库实现对底层rados的访问;

openstack各项目客户端调用librbd,再由librbd调用librados访问底层rados;
实际使用中,nova需要使用libvirtdriver驱动以通过libvirt与qemu调用librbd;cinder与glance可直接调用librbd;

写入ceph集群的数据被条带切分成多个object,object通过hash函数映射到pg(构成pg容器池pool),然后pg通过几圈crush算法近似均匀地映射到物理存储设备osd(osd是基于文件系统的物理存储设备,如xfs,ext4等)。


CEPH PG数量设置与详细介绍

在创建池之前要设置一下每个OSD的最大PG 数量

PG PGP官方计算公式计算器

参数解释:

  • Target PGs per OSD:预估每个OSD的PG数,一般取100计算。当预估以后集群OSD数不会增加时,取100计算;当预估以后集群OSD数会增加一倍时,取200计算。
  • OSD #:集群OSD数量。
  • %Data:预估该pool占该OSD集群总容量的近似百分比。
  • Size:该pool的副本数。

依据参数使用公式计算新的 PG 的数目:
PG 总数= ((OSD总数*100)/最大副本数)/池数
3x100/3/3=33.33 ;舍入到2的N次幕为32

一、OpenStack集群上的操作

openstack集群作为ceph的客户端;下面需要再openstack集群上进行ceph客户端的环境配置

1. OpenStack全部节点上添加ceph的yum源

在openstack所有控制和计算节点安装ceph Octopus源码包,centos8有默认安装,但是版本一定要跟连接的ceph版本一致

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

rm -f /etc/yum.repos.d/ceph-nautilus.repo
cat >/etc/yum.repos.d/ceph.repo <<EOF
[Ceph]
name=Ceph packages for \$basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-octopus/el8/\$basearch
enabled=1
gpgcheck=0
type=rpm-md

[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-octopus/el8/noarch
enabled=1
gpgcheck=0
type=rpm-md

[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-octopus/el8/SRPMS
enabled=1
gpgcheck=0
type=rpm-md
EOF

yum clean all && yum makecache

2. 安装Ceph客户端

#openstack全部节点安装ceph;已配置yum源,直接安装即可;目的是可以在openstack集群使用ceph的命令
yum install ceph -y

2.1 glance服务所在节点安装python3-rbd

glance-api服务运行在3个控制节点,因此三台控制节点都必须安装

yum install python3-rbd -y

2.2 cinder-volume与nova-compute服务所在节点安装ceph-common

cinder-volumenova-compute服务运行在3个计算(存储)节点;因此三台计算节点都必须安装

yum install ceph-common -y

4. 需要有ceph的配置文件(ceph集群上操作)

将配置文件和密钥复制到openstack集群各节点

配置文件就是生成的ceph.conf;而密钥是ceph.client.admin.keyring,当使用ceph客户端连接至ceph集群时需要使用的密默认密钥,这里我们所有节点都要复制,命令如下

#复制ceph集群默认admin密钥文件到openstack集群
scp -rp /etc/ceph/ceph.client.admin.keyring controller01:/etc/ceph/
scp -rp /etc/ceph/ceph.client.admin.keyring controller02:/etc/ceph/
scp -rp /etc/ceph/ceph.client.admin.keyring controller03:/etc/ceph/
scp -rp /etc/ceph/ceph.client.admin.keyring compute01:/etc/ceph/
scp -rp /etc/ceph/ceph.client.admin.keyring compute02:/etc/ceph/
scp -rp /etc/ceph/ceph.client.admin.keyring compute03:/etc/ceph/

#复制ceph配置文件到openstack集群
scp -rp /etc/ceph/ceph.conf controller01:/etc/ceph/ceph.conf
scp -rp /etc/ceph/ceph.conf controller02:/etc/ceph/ceph.conf
scp -rp /etc/ceph/ceph.conf controller03:/etc/ceph/ceph.conf
scp -rp /etc/ceph/ceph.conf compute01:/etc/ceph/ceph.conf
scp -rp /etc/ceph/ceph.conf compute02:/etc/ceph/ceph.conf
scp -rp /etc/ceph/ceph.conf compute03:/etc/ceph/ceph.conf

二、Ceph集群上的操作

1. 需求说明

※Glance 作为openstack中镜像服务,支持多种适配器,支持将镜像存放到本地文件系统,http服务器,ceph分布式文件系统,glusterfs和sleepdog等开源的分布式文件系统上。目前glance采用的是本地filesystem的方式存储,存放在默认的路径/var/lib/glance/images下,当把本地的文件系统修改为分布式的文件系统ceph之后,原本在系统中镜像将无法使用,所以建议当前的镜像删除,部署好ceph之后,再统一上传至ceph中存储。

※Nova 负责虚拟机的生命周期管理,包括创建,删除,重建,开机,关机,重启,快照等,作为openstack的核心,nova负责IaaS中计算重要的职责,其中nova的存储格外重要,默认情况下,nova将instance的数据存放在/var/lib/nova/instances/%UUID目录下,使用本地的存储空间。使用这种方式带来的好处是:简单,易实现,速度快,故障域在一个可控制的范围内。然而,缺点也非常明显:compute出故障,上面的虚拟机down机时间长,没法快速恢复,此外,一些特性如热迁移live-migration,虚拟机容灾nova evacuate等高级特性,将无法使用,对于后期的云平台建设,有明显的缺陷。对接 Ceph 主要是希望将实例的系统磁盘文件储存到 Ceph 集群中。与其说是对接 Nova,更准确来说是对接 QEMU-KVM/libvirt,因为 librbd 早已原生集成到其中。

※Cinder 为 OpenStack 提供卷服务,支持非常广泛的后端存储类型。对接 Ceph 后,Cinder 创建的 Volume 本质就是 Ceph RBD 的块设备,当 Volume 被虚拟机挂载后,Libvirt 会以 rbd 协议的方式使用这些 Disk 设备。除了 cinder-volume 之后,Cinder 的 Backup 服务也可以对接 Ceph,将备份的 Image 以对象或块设备的形式上传到 Ceph 集群。

2. 原理解析

使用ceph的rbd接口,需要通过libvirt,所以需要在客户端机器上安装libvirt和qemu,关于ceph和openstack结合的结构如下,同时,在openstack中,需要用到存储的地方有三个:

  1. glance的镜像,默认的本地存储,路径在/var/lib/glance/images目录下,
  2. nova虚拟机存储,默认本地,路径位于/var/lib/nova/instances目录下,
  3. cinder存储,默认采用LVM的存储方式。

3. 创建pool池

为 Glance、Nova、Cinder 创建专用的RBD Pools池

需要配置hosts解析文件,这里最开始已经配置完成,如未添加hosts解析需要进行配置

在cephnode01管理节点上操作;命名为:volumes,vms,images

#ceph默认创建了一个pool池为rbd
[root@cephnode01 ~]# ceph osd lspools
1 device_health_metrics
2 .rgw.root
3 zone-dc1.rgw.log
4 zone-dc1.rgw.control
5 zone-dc1.rgw.meta
-----------------------------------
    
#为 Glance、Nova、Cinder 创建专用的 RBD Pools,并格式化
ceph osd pool create images 32 32
ceph osd pool create volumes 32 32
ceph osd pool create vms 32 32

rbd pool init volumes
rbd pool init images
rbd pool init vms

-----------------------------------
    
#查看pool的pg_num和pgp_num大小
[root@cephnode01 ~]# ceph osd pool get vms pg_num
pg_num: 32
[root@cephnode01 ~]# ceph osd pool get vms pgp_num
pgp_num: 32

-----------------------------------
    
#查看ceph中的pools;忽略之前创建的pool
[root@cephnode01 ~]# ceph osd lspools
...
8 images
9 volumes
10 vms

[root@cephnode01 ~]# ceph osd pool stats
...
pool images id 8
  nothing is going on

pool volumes id 9
  nothing is going on

pool vms id 10
  nothing is going on

记录:删除存储池的操作

#cephadm中需要进入容器
podman exec -it ceph-dfc1628e-f739-11ea-ad44-0050568280f6-mon.cephnode01 bash
#在ceph.conf配置文件中添加如下内容
[mon]
mon allow pool delete = true
#退出容器
exit

#重启ceph-mon服务
systemctl restart [email protected]
##执行删除pool命令
ceph osd pool delete volumes volumes --yes-i-really-really-mean-it

4. ceph授权认证

在cephnode01管理节点上操作

4.1 通过ceph管理节点为Glance、cinder创建用户

针对pool设置权限,pool名对应创建的pool

[root@cephnode01 ~]# ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images'
[client.glance]
    key = AQBjyGFfA96jCRAAlnZBfLIGGFoqg1fF821U7Q==

[root@cephnode01 ~]# 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'
[client.cinder]
    key = AQBuyGFfrTxYCRAAN8jpf5hheaJVBaP6wY9gaQ==

4.2 配置openstack节点与ceph的ssh连接

#在cephnode01上配置免密登录到全部openstack节点;之前已经生成了ssh秘钥文件;直接发送即可
for ip in 163 195 227 162 194 226 ;do sshpass -pZxzn@2020 ssh-copy-id -o StrictHostKeyChecking=no 10.15.253.$ip ;done

4.3 推送client.glance和client.cinder秘钥

#将创建client.glance用户生成的秘钥推送到运行glance-api服务的控制节点
ceph auth get-or-create client.glance | tee /etc/ceph/ceph.client.glance.keyring
[client.glance]
    key = AQBjyGFfA96jCRAAlnZBfLIGGFoqg1fF821U7Q==

ceph auth get-or-create client.glance | ssh root@controller01 tee /etc/ceph/ceph.client.glance.keyring
ceph auth get-or-create client.glance | ssh root@controller02 tee /etc/ceph/ceph.client.glance.keyring
ceph auth get-or-create client.glance | ssh root@controller03 tee /etc/ceph/ceph.client.glance.keyring

#同时修改秘钥文件的属主与用户组
ssh root@controller01 chown glance:glance /etc/ceph/ceph.client.glance.keyring
ssh root@controller02 chown glance:glance /etc/ceph/ceph.client.glance.keyring
ssh root@controller03 chown glance:glance /etc/ceph/ceph.client.glance.keyring

nova-compute与cinder-volume都部署在计算节点,不必重复操作,如果计算节点与存储节点分离需要分别推送;

#将创建client.cinder用户生成的秘钥推送到运行cinder-volume服务的节点
ceph auth get-or-create client.cinder | ssh root@compute01 tee /etc/ceph/ceph.client.cinder.keyring
ceph auth get-or-create client.cinder | ssh root@compute02 tee /etc/ceph/ceph.client.cinder.keyring
ceph auth get-or-create client.cinder | ssh root@compute03 tee /etc/ceph/ceph.client.cinder.keyring

#同时修改秘钥文件的属主与用户组
ssh root@compute01 chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring
ssh root@compute02 chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring
ssh root@compute03 chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring

5. 添加到Libvirt守护进程

5.1 在ceph管理节点上为nova节点创建keyring文件

  • nova-compute所在节点需要将client.cinder用户的秘钥文件存储到libvirt中;当基于ceph后端的cinder卷被attach到虚拟机实例时,libvirt需要用到该秘钥以访问ceph集群;
  • 在ceph管理节点向计算(存储)节点推送client.cinder秘钥文件,生成的文件是临时性的,将秘钥添加到libvirt后可删除
ceph auth get-key client.cinder | ssh root@compute01 tee /etc/ceph/client.cinder.key
ceph auth get-key client.cinder | ssh root@compute02 tee /etc/ceph/client.cinder.key
ceph auth get-key client.cinder | ssh root@compute03 tee /etc/ceph/client.cinder.key

#AQBuyGFfrTxYCRAAN8jpf5hheaJVBaP6wY9gaQ==

5.2 在计算节点将秘钥加入libvirt

全部计算节点配置;以compute01节点为例;

  • 生成随机 UUID,作为Libvirt秘钥的唯一标识,全部计算节点可共用此uuid;
  • 只需要生成一次,所有的cinder-volume、nova-compute都是用同一个UUID,请保持一致;
[root@compute01 ~]# uuidgen
5de9c673-2fef-4b59-adf6-0782e8deb05b 

#创建Libvirt秘钥文件,修改为生成的uuid
[root@compute01 ~]# cat >> /etc/ceph/secret.xml <<EOF
<secret ephemeral='no' private='no'>
  <uuid>5de9c673-2fef-4b59-adf6-0782e8deb05b</uuid>
  <usage type='ceph'>
    <name>client.cinder secret</name>
  </usage>
</secret>
EOF

scp -rp /etc/ceph/secret.xml compute02:/etc/ceph/
scp -rp /etc/ceph/secret.xml compute03:/etc/ceph/

#定义Libvirt秘钥;全部计算节点执行
[root@compute01 ~]# virsh secret-define --file /etc/ceph/secret.xml
Secret 5de9c673-2fef-4b59-adf6-0782e8deb05b created

#设置秘钥的值为client.cinder用户的key,Libvirt;凭此key就能以Cinder的用户访问Ceph集群
[root@compute01 ~]# virsh secret-set-value --secret 5de9c673-2fef-4b59-adf6-0782e8deb05b --base64 $(cat /etc/ceph/client.cinder.key)
Secret value set


#查看每台计算节点上的秘钥清单
[root@compute01 ~]# virsh secret-list
 UUID                                   Usage
-------------------------------------------------------------------
 5de9c673-2fef-4b59-adf6-0782e8deb05b   ceph client.cinder secret

[root@compute02 ~]# virsh secret-list
 UUID                                   Usage
-------------------------------------------------------------------
 5de9c673-2fef-4b59-adf6-0782e8deb05b   ceph client.cinder secret
 
[root@compute03 ~]# virsh secret-list
 UUID                                   Usage
-------------------------------------------------------------------
 5de9c673-2fef-4b59-adf6-0782e8deb05b   ceph client.cinder secret

三、配置glance集成ceph

Glance 为 OpenStack 提供镜像及其元数据注册服务,Glance 支持对接多种后端存储。与 Ceph 完成对接后,Glance 上传的 Image 会作为块设备储存在 Ceph 集群中。新版本的 Glance 也开始支持 enabled_backends 了,可以同时对接多个存储提供商。

写时复制技术(copy-on-write):内核只为新生成的子进程创建虚拟空间结构,它们复制于父进程的虚拟空间结构,但是不为这些段分配物理内存,它们共享父进程的物理空间,当父子进程中有更改相应的段的行为发生时,再为子进程相应的段分配物理空间。写时复制技术大大降低了进程对资源的浪费。

打开copy-on-write功能

1. 配置glance-api.conf

全部控制节点进行配置;以controller01节点为例;
只修改涉及glance集成ceph的相关配置

#备份glance-api的配置文件;以便于恢复
cp /etc/glance/glance-api.conf{,.bak2}

#删除glance-api如下的默认配置
[glance_store]
Local File  
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images/
#启用映像的写时复制
openstack-config --set /etc/glance/glance-api.conf DEFAULT show_image_direct_url True
#变更默认使用的本地文件存储为ceph rbd存储
openstack-config --set /etc/glance/glance-api.conf glance_store stores rbd
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_pool images
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_ceph_conf /etc/ceph/ceph.conf
openstack-config --set /etc/glance/glance-api.conf glance_store rbd_store_chunk_size 8

变更配置文件,重启服务

systemctl restart openstack-glance-api.service
lsof -i:9292

2. 上传镜像测试

ceph官网介绍 QEMU和块设备

对接 Ceph 之后,通常会以 RAW 格式创建 Glance Image,而不再使用 QCOW2 格式,否则创建虚拟机时需要进行镜像复制,没有利用 Ceph RBD COW 的优秀特性。

#从QEMU中检索块设备映像信息
[root@controller01 tools]# qemu-img info cirros-0.5.1-x86_64-disk.img 
image: cirros-0.5.1-x86_64-disk.img
file format: qcow2
virtual size: 112M (117440512 bytes)
disk size: 16M
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
-----------------------------------

#将镜像从qcow2格式转换为raw格式
[root@controller01 tools]# qemu-img convert -f qcow2 -O raw cirros-0.5.1-x86_64-disk.img  cirros-0.5.1-x86_64-disk.raw

[root@controller01 tools]# ls
cirros-0.5.1-x86_64-disk.img  
cirros-0.5.1-x86_64-disk.raw

[root@controller01 tools]# qemu-img info cirros-0.5.1-x86_64-disk.raw 
image: cirros-0.5.1-x86_64-disk.raw
file format: raw
virtual size: 112M (117440512 bytes)
disk size: 17M
-----------------------------------

#上传镜像;查看glance和ceph联动情况
[root@controller01 tools]# openstack image create --container-format bare --disk-format raw --file cirros-0.5.1-x86_64-disk.raw --unprotected --public cirros_raw
-----------------------------------------------------------+
| Field            | Value                                                           
-----------------------------------------------------------+
| checksum         | 01e7d1515ee776be3228673441d449e6                                 
| container_format | bare                                                             
| created_at       | 2020-09-17T07:10:36Z                                             
| disk_format      | raw                                                             
| file             | /v2/images/b1b485a5-e3a5-4cbc-a746-52a82f4f6c07/file             
| id               | b1b485a5-e3a5-4cbc-a746-52a82f4f6c07                             
| min_disk         | 0                                                               
| min_ram          | 0                                                               
| name             | cirros_raw                                                       
| owner            | 88662bccaa414ab6995785aff65ad5f3                                 
| properties       | direct_url='rbd://dfc1628e-f739-11ea-ad44-0050568280f6/images/b1b485a5-e3a5-4cbc-a746-52a82f4f6c07/snap', os_hash_algo='sha512', os_hash_value='d663dc8d739adc772acee23be3931075ea82a14ba49748553ab05f0e191286a8fe937d00d9f685ac69fd817d867b50be965e82e46d8cf3e57df6f86a57fa3c36', os_hidden='False'
| protected        | False                                                           
| schema           | /v2/schemas/image                                               
| size             | 117440512                                                       
| status           | active                                                           
| tags             |                                                                 
| updated_at       | 2020-09-17T07:10:47Z                                             
| virtual_size     | None                                                             
| visibility       | public                                                           
-----------------------------------------------------------+

3. 查看镜像和glance池数据

  • 查看openstack镜像列表
[root@controller01 tools]# openstack image list
+--------------------------------------+--------------+--------+
| ID                                   | Name         | Status |
+--------------------------------------+--------------+--------+
| 5afd4dde-0734-4fe4-961e-e458c2540e54 | cirros-qcow2 | active |
| b1b485a5-e3a5-4cbc-a746-52a82f4f6c07 | cirros_raw   | active |
+--------------------------------------+--------------+--------+
  • 查看images池的数据
[root@controller01 tools]# rbd ls images
volume-fc7d6151-0f46-46d9-9a81-3dc041313754
  • 查看上传的镜像详细rbd信息
[root@controller01 tools]# rbd info images/b1b485a5-e3a5-4cbc-a746-52a82f4f6c07
rbd image 'b1b485a5-e3a5-4cbc-a746-52a82f4f6c07':
    size 112 MiB in 14 objects
    order 23 (8 MiB objects)
    snapshot_count: 1
    id: d8c387c31779
    block_name_prefix: rbd_data.d8c387c31779
    format: 2
    features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
    op_features: 
    flags: 
    create_timestamp: Thu Sep 17 15:10:36 2020
    access_timestamp: Thu Sep 17 15:10:36 2020
    modify_timestamp: Thu Sep 17 15:10:36 2020
  • 查看上传的镜像的快照列表
[root@controller01 tools]# rbd snap ls images/b1b485a5-e3a5-4cbc-a746-52a82f4f6c07
SNAPID  NAME  SIZE     PROTECTED  TIMESTAMP               
     4  snap  112 MiB  yes        Thu Sep 17 15:10:46 2020
  • glance中的数据存储到了ceph块设备中
[root@controller01 tools]# rados ls -p images
rbd_data.d8c387c31779.0000000000000004
rbd_data.d8c387c31779.000000000000000a
rbd_data.d8c387c31779.000000000000000c
rbd_data.d8c387c31779.0000000000000003
rbd_data.d8c387c31779.0000000000000005
rbd_data.d8c387c31779.0000000000000002
rbd_object_map.d8c387c31779
rbd_directory
rbd_data.d8c387c31779.0000000000000008
rbd_data.d8c387c31779.000000000000000b
rbd_info
rbd_data.d8c387c31779.0000000000000000
rbd_data.d8c387c31779.0000000000000001
rbd_data.d8c387c31779.0000000000000009
rbd_data.d8c387c31779.0000000000000006
rbd_id.b1b485a5-e3a5-4cbc-a746-52a82f4f6c07
rbd_data.d8c387c31779.0000000000000007
rbd_data.d8c387c31779.000000000000000d
rbd_header.d8c387c31779
rbd_object_map.d8c387c31779.0000000000000004
  • 在dashboard界面查看镜像列表
  • 在ceph监控界面查看上传的镜像

4. Ceph执行image镜像的步骤过程详解

4.1 创建raw格式的Image时;Ceph中执行了以下步骤:

  • 在 Pool images 中新建了一个 {glance_image_uuid} 块设备,块设备的 Object Size 为 8M,对应的 Objects 有 2 个,足以放下 cirros.raw 13M 的数据。
  • 对新建块设备执行快照。
  • 对该快照执行保护。
rbd -p ${GLANCE_POOL} create --size ${SIZE} ${IMAGE_ID}
rbd -p ${GLANCE_POOL} snap create ${IMAGE_ID}@snap
rbd -p ${GLANCE_POOL} snap protect ${IMAGE_ID}@snap

4.2 删除raw格式的Image时;Ceph中执行了以下步骤:

  • 先取消快照保护
  • 对快照执行删除
  • 对镜像执行删除
rbd -p ${GLANCE_POOL} snap unprotect ${IMAGE_ID}@snap
rbd -p ${GLANCE_POOL} snap rm ${IMAGE_ID}@snap
rbd -p ${GLANCE_POOL} rm ${IMAGE_ID} 

总结

将openstack集群中的glance镜像的数据存储到ceph中是一种非常好的解决方案,既能够保障镜像数据的安全性,同时glance和nova在同个存储池中,能够基于copy-on-write(写时复制)的方式快速创建虚拟机,能够在秒级为单位实现vm的创建。

四、使用Ceph作为Cinder的后端存储

1. 配置cinder.conf

全部计算节点进行配置;以compute01节点为例;只修改glance集成ceph的相关配置

#备份cinder.conf的配置文件;以便于恢复
cp /etc/cinder/cinder.conf{,.bak2}
#后端使用ceph存储已经在部署cinder服务时进行配置
openstack-config --set /etc/cinder/cinder.conf DEFAULT enabled_backends ceph
openstack-config --set /etc/cinder/cinder.conf DEFAULT glance_api_version 2

openstack-config --set /etc/cinder/cinder.conf ceph volume_driver cinder.volume.drivers.rbd.RBDDriver
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 rbd_store_chunk_size 4
openstack-config --set /etc/cinder/cinder.conf ceph rados_connect_timeout -1
openstack-config --set /etc/cinder/cinder.conf ceph rbd_user cinder
#注意替换cinder用户访问ceph集群使用的Secret UUID
openstack-config --set /etc/cinder/cinder.conf ceph rbd_secret_uuid 5de9c673-2fef-4b59-adf6-0782e8deb05b 
openstack-config --set /etc/cinder/cinder.conf ceph volume_backend_name ceph

2. 重启cinder-volume服务

全部计算节点重启cinder-volume服务;

systemctl restart openstack-cinder-volume.service
systemctl status openstack-cinder-volume.service

3. 验证服务状态

任意openstack控制节点上查看;

openstack volume service list

4. 创建空白卷Volume测试

4.1 设置卷类型

在任意控制节点为cinder的ceph后端存储创建对应的type,在配置多存储后端时可区分类型;

[root@controller01 ~]# cinder type-create ceph
+--------------------------------------+------+-------------+-----------+
| ID                                   | Name | Description | Is_Public |
+--------------------------------------+------+-------------+-----------+
| e2323803-2423-4a69-b9b0-95d3c53b8f31 | ceph | -           | True      |
+--------------------------------------+------+-------------+-----------+

#可通过 cinder type-list 或 openstack volume type list 查看

为ceph type设置扩展规格,键值volume_backend_name,value值ceph

[root@controller01 ~]# cinder type-key ceph set volume_backend_name=ceph
[root@controller01 ~]# cinder extra-specs-list

4.2 创建一个volume卷

任意控制节点上创建一个1GB的卷;最后的数字1代表容量为1G

[root@controller01 ~]# openstack volume create --type ceph --size 1 ceph-volume
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| attachments         | []                                   |
| availability_zone   | nova                                 |
| bootable            | false                                |
| consistencygroup_id | None                                 |
| created_at          | 2020-09-17T08:38:09.000000           |
| description         | None                                 |
| encrypted           | False                                |
| id                  | fc7d6151-0f46-46d9-9a81-3dc041313754 |
| migration_status    | None                                 |
| multiattach         | False                                |
| name                | ceph-volume                          |
| properties          |                                      |
| replication_status  | None                                 |
| size                | 1                                    |
| snapshot_id         | None                                 |
| source_volid        | None                                 |
| status              | creating                             |
| type                | ceph                                 |
| updated_at          | None                                 |
| user_id             | 02c765a9c45c4daa9642cbc29d826514     |
+---------------------+--------------------------------------+

4.3 验证

查看创建好的卷

[root@controller01 ~]# openstack volume list
+--------------------------------------+-------------+-----------+------+-------------
| ID                                   | Name        | Status    | Size | Attached to 
+--------------------------------------+-------------+-----------+------+-------------
| fc7d6151-0f46-46d9-9a81-3dc041313754 | ceph-volume | available |    1 |             
+--------------------------------------+-------------+-----------+------+-------------

#检查ceph集群的volumes池
[root@controller01 ~]# rbd ls volumes
volume-fc7d6151-0f46-46d9-9a81-3dc041313754
[root@controller01 ~]# rbd info volumes/volume-fc7d6151-0f46-46d9-9a81-3dc041313754
[root@controller01 ~]# rados ls -p volumes

openstack创建一个空白 Volume,Ceph相当于执行了以下指令

rbd -p ${CINDER_POOL} create --new-format --size ${SIZE} volume-${VOLUME_ID}

5. 从镜像创建Volume测试

从镜像创建 Volume 的时候应用了 Ceph RBD COW Clone 功能,这是通过glance-api.conf [DEFAULT] show_image_direct_url = True 来开启。这个配置项的作用是持久化 Image 的 location,此时 Glance RBD Driver 才可以通过 Image location 执行 Clone 操作。并且还会根据指定的 Volume Size 来调整 RBD Image 的 Size。

5.1 删除僵尸镜像的方法

[root@controller01 ~]# openstack image list
+--------------------------------------+--------------+--------+
| ID                                   | Name         | Status |
+--------------------------------------+--------------+--------+
| 5afd4dde-0734-4fe4-961e-e458c2540e54 | cirros-qcow2 | active |
| b1b485a5-e3a5-4cbc-a746-52a82f4f6c07 | cirros_raw   | active |

一直存在的cirros_qcow2镜像为对接ceph之前的镜像,现在已无法使用,所以将之删除

#把镜像属性变为非可用状态
openstack image set --deactivate 5afd4dde-0734-4fe4-961e-e458c2540e54
#进入数据库
mysql -uroot -p
use glance;
select id, status, name from images where id='5afd4dde-0734-4fe4-961e-e458c2540e54';
update images set deleted=1 where id='5afd4dde-0734-4fe4-961e-e458c2540e54';

5.2 为cirros_raw镜像创建一个1G的卷

[root@controller01 tools]# openstack image list
+--------------------------------------+------------+--------+
| ID                                   | Name       | Status |
+--------------------------------------+------------+--------+
| b1b485a5-e3a5-4cbc-a746-52a82f4f6c07 | cirros_raw | active |
+--------------------------------------+------------+--------+

[root@controller01 tools]# openstack volume create --image b1b485a5-e3a5-4cbc-a746-52a82f4f6c07 --type ceph --size 1 cirros_raw_image
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| attachments         | []                                   |
| availability_zone   | nova                                 |
| bootable            | false                                |
| consistencygroup_id | None                                 |
| created_at          | 2020-09-17T09:23:45.000000           |
| description         | None                                 |
| encrypted           | False                                |
| id                  | 94207b0b-7f05-48ec-bb5c-3df4c4c40f22 |
| migration_status    | None                                 |
| multiattach         | False                                |
| name                | cirros_raw_image                     |
| properties          |                                      |
| replication_status  | None                                 |
| size                | 1                                    |
| snapshot_id         | None                                 |
| source_volid        | None                                 |
| status              | creating                             |
| type                | ceph                                 |
| updated_at          | None                                 |
| user_id             | 02c765a9c45c4daa9642cbc29d826514     |
+---------------------+--------------------------------------+
[root@controller01 tools]# openstack volume list
+--------------------------------------+------------------+-----------+------+--------
| ID                                   | Name             | Status    | Size | Attached to |
+--------------------------------------+------------------+-----------+------+--------
| 94207b0b-7f05-48ec-bb5c-3df4c4c40f22 | cirros_raw_image | available |    1 |         
| fc7d6151-0f46-46d9-9a81-3dc041313754 | ceph-volume      | available |    1 |         
+--------------------------------------+------------------+-----------+------+--------

5.3 查看images池的Objects信息

[root@controller01 tools]# rbd ls volumes
volume-94207b0b-7f05-48ec-bb5c-3df4c4c40f22 #cirros_raw_image
volume-fc7d6151-0f46-46d9-9a81-3dc041313754 #ceph_volume

[root@controller01 tools]# rbd info volumes/volume-94207b0b-7f05-48ec-bb5c-3df4c4c40f22
rbd image 'volume-94207b0b-7f05-48ec-bb5c-3df4c4c40f22':
    size 1 GiB in 256 objects
    order 22 (4 MiB objects)
    snapshot_count: 0
    id: e994839b0ff3
    block_name_prefix: rbd_data.e994839b0ff3
    format: 2
    features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
    op_features: 
    flags: 
    create_timestamp: Thu Sep 17 17:23:46 2020
    access_timestamp: Thu Sep 17 17:23:46 2020
    modify_timestamp: Thu Sep 17 17:23:46 2020
    parent: images/b1b485a5-e3a5-4cbc-a746-52a82f4f6c07@snap
    overlap: 112 MiB
  
[root@controller01 tools]# rados ls -p volumes
rbd_object_map.e994839b0ff3
rbd_directory
rbd_object_map.de7e6b1e2de
rbd_children
rbd_header.e994839b0ff3
rbd_info
rbd_id.volume-94207b0b-7f05-48ec-bb5c-3df4c4c40f22
rbd_id.volume-fc7d6151-0f46-46d9-9a81-3dc041313754
rbd_header.de7e6b1e2de
rbd_trash

在openstack上从镜像创建一个Volume,Ceph相当于执行了以下指令

rbd clone ${GLANCE_POOL}/${IMAGE_ID}@snap ${CINDER_POOL}/volume-${VOLUME_ID}

if [[ -n "${SIZE}" ]]; then
    rbd resize --size ${SIZE} ${CINDER_POOL}/volume-${VOLUME_ID}
fi

6. 为镜像创建的卷生成快照测试

任意控制节点操作;

6.1 创建cirros_raw_image卷的快照

[root@controller01 tools]# openstack volume snapshot create --volume cirros_raw_image cirros_raw_image_snap01
+-------------+--------------------------------------+
| Field       | Value                                |
+-------------+--------------------------------------+
| created_at  | 2020-09-17T09:31:50.420158           |
| description | None                                 |
| id          | 40dc1b6b-8c85-48a9-aca7-d4e9857c9d7b |
| name        | cirros_raw_image_snap01              |
| properties  |                                      |
| size        | 1                                    |
| status      | creating                             |
| updated_at  | None                                 |
| volume_id   | 94207b0b-7f05-48ec-bb5c-3df4c4c40f22 |
+-------------+--------------------------------------+

6.2 查看快照列表

[root@controller01 tools]# openstack volume snapshot list
+--------------------------------------+-------------------------+-------------+------
| ID                                   | Name                    | Description | Status    | Size |
+--------------------------------------+-------------------------+-------------+------
| 40dc1b6b-8c85-48a9-aca7-d4e9857c9d7b | cirros_raw_image_snap01 | None        | available |    1 |
+--------------------------------------+-------------------------+-------------+------

6.3 在ceph上查镜像看创建的快照

rbd snap ls volumes/volume-94207b0b-7f05-48ec-bb5c-3df4c4c40f22

查看快照详细信息

[root@cephnode01 ~]# rbd info volumes/volume-94207b0b-7f05-48ec-bb5c-3df4c4c40f22
rbd image 'volume-94207b0b-7f05-48ec-bb5c-3df4c4c40f22':
    size 1 GiB in 256 objects
    order 22 (4 MiB objects)
    snapshot_count: 1
    id: e994839b0ff3
    block_name_prefix: rbd_data.e994839b0ff3
    format: 2
    features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
    op_features: 
    flags: 
    create_timestamp: Thu Sep 17 17:23:46 2020
    access_timestamp: Thu Sep 17 17:23:46 2020
    modify_timestamp: Thu Sep 17 17:23:46 2020
    parent: images/b1b485a5-e3a5-4cbc-a746-52a82f4f6c07@snap
    overlap: 112 MiB

在openstack上对镜像的卷创建快照,Ceph相当于执行了以下指令

rbd -p ${CINDER_POOL} snap create volume-${VOLUME_ID}@snapshot-${SNAPSHOT_ID}
rbd -p ${CINDER_POOL} snap protect volume-${VOLUME_ID}@snapshot-${SNAPSHOT_ID} 

7. 创建 Volume卷备份测试

如果说快照时一个时间机器,那么备份就是一个异地的时间机器,它具有容灾的含义。所以一般来说 Ceph Pool backup 应该与 Pool images、volumes 以及 vms 处于不同的灾备隔离域。

https://www.cnblogs.com/luohaixian/p/9344803.html

https://docs.openstack.org/zh_CN/user-guide/backup-db-incremental.html

一般的,备份具有以下类型:

  • 全量备份
  • 增量备份:
  • 差异备份

五、使用Ceph作为Nova的虚拟机存储

Nova是OpenStack中的计算服务。 Nova存储与默认的运行虚拟机相关联的虚拟磁盘镜像,在/var/lib/nova/instances/%UUID目录下。Ceph是可以直接与Nova集成的存储后端之一。

在虚拟磁盘映像的计算节点上使用本地存储有一些缺点:

  • 镜像存储在根文件系统下。大镜像可能导致文件系统被填满,从而导致计算节点崩溃。
  • 计算节点上的磁盘崩溃可能导致虚拟磁盘丢失,因此无法进行虚拟机恢复。

Nova 为 OpenStack 提供计算服务,对接 Ceph 主要是希望将实例的系统磁盘文件储存到 Ceph 集群中。与其说是对接 Nova,更准确来说是对接QEMU-KVM/libvirt,因为 librbd 早已原生集成到其中。

如果需要从ceph rbd中启动虚拟机,必须将ceph配置为nova的临时后端;
推荐在计算节点的配置文件中启用rbd cache功能;
为了便于故障排查,配置admin socket参数,这样每个使用ceph rbd的虚拟机都有1个socket将有利于虚拟机性能分析与故障解决;
相关配置只涉及全部计算节点ceph.conf文件的[client]与[client.cinder]字段,以compute163节点为例

1.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章