⑩ 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.

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