OpenStack 對接 Ceph

[TOC]node

 

1. Openstack 與 Ceph

1.1. Ceph 簡介

Ceph 是當前很是流行的開源分佈式存儲系統,具備高擴展性、高性能、高可靠性等優勢,同時提供塊存儲服務(RBD)、對象存儲服務(RGW)以及文件系統存儲服務(CEPHFS)。目前也是 OpenStack 的主流後端存儲,和 OpenStack 親如兄弟,爲 OpenStack 提供統一共享存儲服務。使用 Ceph 做爲 OpenStack 後端存儲,具備以下優勢:git

  • 全部的計算節點共享存儲,遷移時不須要拷貝根磁盤,即便計算節點掛了,也能當即在另外一個計算節點啓動虛擬機(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 的區別)。github

1.2. Glance 介紹

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

  • 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.api

1.3. Nova 介紹

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

不過咱們在這裏假定:app

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

啓動虛擬機以前首先須要準備根磁盤(root disk),Nova稱爲image,和Glance同樣,Nova的image也支持存儲到本地磁盤、Ceph以及Cinder(boot from volume)中。須要注意的是,image保存到哪裏是經過image type決定的,存儲到本地磁盤能夠是raw、qcow二、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就能夠對接該存儲系統。ide

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/$/)。

 

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

相關文章
相關標籤/搜索