OpenStack 對接 Ceph


 

1. Openstack 與 Ceph

1.1. Ceph 簡介

Ceph 是當前非常流行的開源分布式存儲系統,具有高擴展性、高性能、高可靠性等優點,同時提供塊存儲服務(RBD)、對象存儲服務(RGW)以及文件系統存儲服務(CEPHFS)。目前也是 OpenStack 的主流后端存儲,和 OpenStack 親如兄弟,為 OpenStack 提供統一共享存儲服務。使用 Ceph 作為 OpenStack 后端存儲,具有如下優點:

  • 所有的計算節點共享存儲,遷移時不需要拷貝根磁盤,即使計算節點掛了,也能立即在另一個計算節點啟動虛擬機(evacuate)。
  • 利用COW(Copy On Write)特性,創建虛擬機時,只需要基於鏡像 clone 即可,不需要下載整個鏡像,而 clone 操作基本是0開銷,從而實現了秒級創建虛擬機。
  • Ceph RBD 支持 thin provisioning,即按需分配空間,有點類似Linux文件系統的 sparse 稀疏文件。創建一個20GB的虛擬硬盤時,最開始並不占用物理存儲空間,只有當寫入數據時,才按需分配存儲空間。

Ceph 的更多知識可以參考官方文檔,這里我們只關注 RBD,RBD 管理的核心對象為塊設備(block device),通常我們稱為 volume,不過 Ceph 中習慣稱之為 image(注意和 OpenStack image 的區別)。

1.2. Glance 介紹

Glance管理的核心實體是image,它是OpenStack的核心組件之一,為OpenStack提供鏡像服務(Image as Service),主要負責OpenStack鏡像以及鏡像元數據的生命周期管理、檢索、下載等功能。Glance支持將鏡像保存到多種存儲系統中,后端存儲系統稱為store,訪問鏡像的地址稱為location,location可以是一個http地址,也可以是一個rbd協議地址。只要實現store的driver就可以作為Glance的存儲后端,其中driver的主要接口如下:

  • get: 獲取鏡像的location。
  • get_size: 獲取鏡像的大小。
  • get_schemes: 獲取訪問鏡像的URL前綴(協議部分),比如rbd、swift+https、http等。
  • add: 上傳鏡像到后端存儲中。
  • delete: 刪除鏡像。
  • set_acls: 設置后端存儲的讀寫訪問權限。

為了便於維護,glance store目前已經作為獨立的庫從Glance代碼中分離出來,由項目glance_store維護。目前社區支持的store列表如下:

  • filesystem: 保存到本地文件系統,默認保存/var/lib/glance/images到目錄下。
  • cinder: 保存到Cinder中。
  • rbd:保存到Ceph中。
  • sheepdog:保存到sheepdog中。
  • swift: 保存到Swift對象存儲中。
  • vmware datastore: 保存到Vmware datastore中。
  • http: 以上的所有store都會保存鏡像數據,唯獨http store比較特殊,它不保存鏡像的任何數據,因此沒有實現add方法,它僅僅保存鏡像的URL地址,啟動虛擬機時由計算節點從指定的http地址中下載鏡像。

本文主要關注rbd store,它的源碼在這里,該store的driver代碼主要由國內Fei Long Wang負責維護,其它store的實現細節可以參考源碼 glance store drivers.

1.3. Nova 介紹

Nova管理的核心實體為server,為OpenStack提供計算服務,它是OpenStack最核心的組件。注意 Nova 中的server不只是指虛擬機,它可以是任何計算資源的抽象,除了虛擬機以外,也有可能是baremetal裸機、容器等。

不過我們在這里假定:

  • server 為虛擬機。
  • image type 為 rbd。
  • compute driver 為 libvirt。

啟動虛擬機之前首先需要准備根磁盤(root disk),Nova稱為image,和Glance一樣,Nova的image也支持存儲到本地磁盤、Ceph以及Cinder(boot from volume)中。需要注意的是,image保存到哪里是通過image type決定的,存儲到本地磁盤可以是raw、qcow2、ploop等,如果image type為rbd,則image存儲到Ceph中。不同的image type由不同的image backend負責,其中rbd的backend為nova/virt/libvirt/imageackend中的Rbd類模塊實現。

1.4. Cinder 介紹

Cinder是OpenStack的塊存儲服務,類似AWS的EBS,管理的實體為volume。Cinder並沒有實現volume provide功能,而是負責管理各種存儲系統的volume,比如Ceph、fujitsu、netapp等,支持volume的創建、快照、備份等功能,對接的存儲系統我們稱為backend。只要實現了cinder/volume/driver.py中VolumeDriver類定義的接口,Cinder就可以對接該存儲系統。

Cinder不僅支持本地volume的管理,還能把本地volume備份到遠端存儲系統中,比如備份到另一個Ceph集群或者Swift對象存儲系統中,本文將只考慮從源Ceph集群備份到遠端Ceph集群中的情況。

1.5. 總結

Ceph 集群可以作為 OpenStack 的后端存儲,分別向 Glance、Nova、Cinder 組件提供塊設備服務。——《Ceph 設計原理與實現》

根據官方文檔,OpenStack 里有三個地方可以和 Ceph 塊設備結合:

  1. Images:OpenStack 的 Glance 管理着 VM 的 image 。Image 相對恆定,OpenStack 把它們當作二進制文件、並以此格式下載。

  2. Volumes:OpenStack 用 Cinder 服務管理 Volumes 。Volume 是塊設備,OpenStack 用它們引導虛擬機、或掛載到運行中的虛擬機上。

  3. Guest Disks: Guest disks 是裝有客戶操作系統的磁盤。默認情況下,啟動一台虛擬機時,它的系統盤表現為 hypervisor 文件系統的一個文件(通常位於 /var/lib/nova/instances/${uuid}/)。

 

2. 准備工作

  • OpenStack 處於正常工作狀態
  • Ceph 集群正常工作
  • OpenStack 各節點與 Ceph 集群各節點網絡互通

OpenStack 部署情況

IP 節點名稱 組件 對應存儲池 說明
192.168.0.121 controller Glacne images 控制節點
192.168.0.122 compute Nova vms 計算節點
192.168.0.123 blockstorage Cinder volumes 存儲節點

Ceph 部署情況

IP 節點名稱
192.168.0.131 node1
192.168.0.132 node2
192.168.0.133 node3

3. 安裝 Ceph 客戶端

在 OpenStack 的所有節點配置好 Ceph 安裝包 yum 源,在 /etc/yum.repos.d/ 目錄下編輯 ceph.repo

[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
enabled=1
gpgcheck=0
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1

然后安裝 Ceph 客戶端

yum install -y ceph

將任意一個 Ceph 集群節點的 Ceph 配置文件和 ceph.client.admin.keyring 拷貝到所有 OpenStack 節點

scp {ceph-node-ip}:/etc/ceph/ceph.conf {openstack-node-ip}:/etc/ceph
scp {ceph-node-ip}:/etc/ceph/ceph.client.admin.keyring {openstack-node-ip}:/etc/ceph

4. 創建存儲池

創建 Glance、Nova、Cinder 對應存儲池:

ceph osd pool create images {pg_num}
ceph osd pool create vms {pg_num}
ceph osd pool create volumes {pg_num}

5. 配置存儲池鑒權

在控制節點創建 Ceph 客戶端及存儲池的鑒權,生成相應的 key 文件:

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' -o /etc/ceph/ceph.client.cinder.keyring

ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images' -o /etc/ceph/ceph.client.glance.keyring

將生成的 key 文件拷貝到其他所有 OpenStack節點:

scp *.keyring 192.168.0.122:/etc/ceph/
scp *.keyring 192.168.0.123:/etc/ceph/

在 OpenStack 控制節點修改密鑰文件擁有者為對應的組件用戶:

chown glance:glance /etc/ceph/ceph.client.glance.keyring
chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring

在運行 nova-compute 的節點上,將密鑰添加到 libvcirt,刪除臨時的密鑰文件:

ceph auth get-key client.cinder | tee client.cinder.key
uuidgen
ae3d9d0a-df88-4168-b292-c07cdc2d8f02
// 注:uuidgen 只需要運行一次即可,所有涉及 uuid 的地方都共用這個生成的 uuid

cat > secret.xml <<EOF
<secret ephemeral='no' private='no'>
  <uuid>ae3d9d0a-df88-4168-b292-c07cdc2d8f02</uuid>
  <usage type='ceph'>
    <name>client.cinder secret</name>
  </usage>
</secret>
EOF
// 注:以上 cat 段落是整個拷貝一次執行

virsh secret-define --file secret.xml
生成 secret ae3d9d0a-df88-4168-b292-c07cdc2d8f02

virsh secret-set-value --secret ae3d9d0a-df88-4168-b292-c07cdc2d8f02 --base64 $(cat client.cinder.key) && rm client.cinder.key secret.xml
// 注:出現刪除提示,輸入y,回車

6. 修改配置 OpenStack 配置文件

6.1. 配置 Glance

Glance 有多種后端用於存儲鏡像,如果默認使用 Ceph 塊設備,則需要在 Glance 組件所在節點進行配置:

openstack-config --set /etc/glance/glance-api.conf DEFAULT "show_image_direct_url" "True"
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_user" "glance"
openstack-config --set /etc/glance/glance-api.conf glance_store "rbd_store_pool" "images"
openstack-config --set /etc/glance/glance-api.conf glance_store "stores" "glance.store.filesystem.Store, glance.store.http.Store, glance.store.rbd.Store"
openstack-config --set /etc/glance/glance-api.conf paste_deploy "flavor" "keystone"

6.2. 配置 Cinder

使 Cinder 組件訪問 Ceph 塊設備,需要配置 Cinder 對應的塊設備驅動及其他選項,在 Cinder 組件所在節點進行配置:

openstack-config --set /etc/cinder/cinder.conf DEFAULT "enabled_backends" "ceph"
openstack-config --set /etc/cinder/cinder.conf ceph "volume_driver" "cinder.volume.drivers.rbd.RBDDriver"
openstack-config --set /etc/cinder/cinder.conf ceph "volume_backend_name" "ceph"
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 "rados_connect_timeout" "-1"
openstack-config --set /etc/cinder/cinder.conf ceph "glance_api_version" "2"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_user" "cinder"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_secret_uuid" "ae3d9d0a-df88-4168-b292-c07cdc2d8f02"

6.3. 配置 Nova

Nova 組件訪問 Ceph 的塊設備,需要在運行 Nova 的各節點上進行配置:

openstack-config --set /etc/nova/nova.conf libvirt "images_type" "rbd"
openstack-config --set /etc/nova/nova.conf libvirt "images_rbd_pool" "vms"
openstack-config --set /etc/nova/nova.conf libvirt "images_rbd_ceph_conf" "/etc/ceph/ceph.conf"
openstack-config --set /etc/nova/nova.conf libvirt "rbd_user" "cinder"
openstack-config --set /etc/nova/nova.conf libvirt "rbd_secret_uuid" "ae3d9d0a-df88-4168-b292-c07cdc2d8f02"
openstack-config --set /etc/nova/nova.conf libvirt "inject_password" "false"
openstack-config --set /etc/nova/nova.conf libvirt "inject_key" "false"
openstack-config --set /etc/nova/nova.conf libvirt "inject_partition" "-2"
openstack-config --set /etc/nova/nova.conf libvirt "live_migration_flag" "VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST"

7. 重啟 OpenStack 各服務

在控制節點,重啟各服務:

sudo service openstack-glance-api restart
sudo service openstack-nova-api restart
sudo service openstack-cinder-api restart
sudo service openstack-cinder-scheduler restart

在計算節點,重啟 Nova 服務:

sudo service openstack-nova-compute restart

在存儲節點,重啟 Cinder 服務:

sudo service openstack-cinder-volume restart

8. 驗證對接有效性

graph LR A[mirror] -->|glance| B(image) B --> |cinder|C(volume) C --> |nova|D[VM]

8.1. Ceph 客戶端驗證

在各 OpenStack 節點上運行命令:

ceph status
ceph -s

如果能順利執行,則證明客戶端安裝成功。

8.2. Glance 組件對接驗證

在控制節點上,先獲取key:

source /root/keystone_admin

然后通過 Glance 上傳一個鏡像:

glance image-create --name cirros --disk-format raw --container-format ovf --f {your-image-path}

通過查詢 Glance存儲池信息,查看鏡像是否已經上傳:

rbd ls images

如果查看到鏡像信息,則證明 Glance 組件對接成功。

8.3. Cinder 組件對接驗證

例如,在控制節點通過 Cinder 創建一個空白雲盤:

cinder create --display-name {volume-name} {volume-size}

這里使用上傳的鏡像通過 Cinder 創建一個鏡像雲盤:

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

通過查詢 Cinder 存儲池信息,查看空白雲盤及鏡像雲盤是否已經承載在 Ceph:

rbd ls volumes

如果查詢到雲盤信息,則證明 Cinder 組件對接成功。

8.4. Nova 組件對接驗證

首先通過 Dashboard 創建一個 VM,從剛才創建的鏡像雲盤(volume)啟動(前提:有可用網絡):

nova boot --image {image-id} --flavor {flavor-id} --nic net-id={net-id} {instance-name}

然后查詢 VM 是否創建成功:

nova list | grep {instacne-name}

如果創建的 VM 為 Active 狀態,則證明 Nova 組件對接成功。

 

參考鏈接:

OpenStack使用Ceph存儲-Ceph到底做了什么
rbd-openstack


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM