• 沒有找到結果。

5 因為開發中的 Ceph FS 還不像 RADOS 般穩定 [4],所以我們使用 ceph-fuse(user mode filesystem) 取代 Kernel 內建的 client 來掛載 Ceph FS,雖然效能稍微不好,但是卻可以避免不可預期的 Kernel panic。

compute-1# mkdir -p /mnt/ceph/openstack/instances

compute-1# chown nova:nova /mnt/ceph/openstack/instances compute-1# sync && umount /mnt/ceph

6. 再來格式化要當本地快取的磁碟分割區,先試著掛載起來設定權限。

compute-1# mkfs.xfs -f /dev/cciss/c0d0p4 // 先 掛 載 CephFS(存 放 差 異 映 像 檔 的 位 置)。

compute-1# ceph-fuse /var/lib/nova/instances --name=client.nova \ -r /openstack/instances

// 再 掛 載 要 放 快 取 的 本 地 分 割 區 (存 放 映 像 檔 快 取 的 位 置)。

compute-1# mkdir -p /var/lib/nova/instances/_base

compute-1# mount -t xfs /dev/cciss/c0d0p4 /var/lib/nova/instances/_base // 設 定 nova-compute 可 存 取 的 權限。

compute-1# chown nova:nova /var/lib/nova/instances/_base

7. 我們可以修改 nova-compute 的 init script,不用每次都手動掛載本機分割區及 Ceph FS。

compute-1# vim /etc/init/nova-compute.conf

pre-start script ...

# instance on ceph

if ! cat /proc/mounts | grep \/var\/lib\/nova\/instances; then localpart=/dev/cciss/c0d0p4

mountopt=rw,noatime,nodiratime useshared=true

if $useshared; then

# use shared storage for migration

ceph-fuse /var/lib/nova/instances --name=client.nova \ -r /openstack/instances

mkdir -p /var/lib/nova/instances/_base

mount -t xfs -o $mountopt $localpart /var/lib/nova/instances/_base else

# use local base

mount -t xfs -o $mountopt $localpart /var/lib/nova/instances fi

chown nova:nova /var/lib/nova/instances || true chown nova:nova /var/lib/nova/instances/_base || true fi

end script

另外這個段落介紹了怎麼設定讓 nova-compute 知道我們已經將 nova-volume 以及 Glance 的資料都存放到 Ceph 去了,所以當需要使用這兩個服務時,nova-compute 才能 發出正確的命令。

1. 映像檔 (image) 的部分比較容易,因為與 Ceph 交涉的部分 Glance 已經幫忙處理好 了,我們只要告知 nova.conf 我們要使用 Glance 來取得映像檔,以及 Glance API 的位置即可。

compute-1# vim /etc/nova/nova.conf nova-compute 必須透過 nova.conf 告訴 libvirt 一些細節。

compute-1# vim /etc/nova/nova.conf

// 指 出 存 取 虛 擬 磁 碟 所 需 要 的 Ceph 帳 號 和 儲 存 池 名稱, 供了一個管理指令- virsh 來讓我們定義各種 secret(如 passwords, passphrases and encryption keys)。

所以我們還需要在 libvirt 上定義一組 UUID 對應到 Ceph 的帳號密碼的關係,填寫 進 nova.conf,之後 nova-compute 就可以告知 libvirt 使用這組 UUID 來向 Ceph 取 得虛擬磁碟。

(a) 撰寫一個 xml 格式的定義檔,描述一個 Ceph 的 secret,並且指定連線到 Ceph 時使用的名稱是 client.volume。

compute-1# vim secret.xml

<secret ephemeral='no' private='no'>

<usage type='ceph'>

<name>client.volume secret</name>

</usage>

</secret>

(b) 接著使用 virsh 來加入這個定義檔。

compute-1# virsh secret-define --file secret.xml Secret 7f74c2c7-062c-d164-e97f-9224ac4571fe created

(c) 如此就取得這個 secret 的 UUID(7f74c2c7-062c-d164-e97f-9224ac4571fe)6,接

6

若希望每次都產生固定的 UUID,則可以在 secret.xml 裡指定 <uuid /> 標籤。

下來就是把這個定義檔 (Ceph 帳號:client.volume) 與他的金鑰互相關聯7

compute1# virsh secret-set-value --secret 7f74c2c7-062c-d164-e97f-9224ac4571fe\

--base64 AQjIdjwLnCGsKhAA99tX+4C4NoLJd89JchW4sg==

4. 這樣 libvirt 就有一組 UUID 對應到 Ceph 帳號密碼的關係,我們就可以把這個 UUID 填入 nova.conf。

compute-1# vim /etc/nova/nova.conf

// 指 出 我 們 要 使 用 libvirt上 的 哪 一 個secret 定 義 來 做 Ceph RBD 的 連線。

rbd_secret_uuid=7f74c2c7-062c-d164-e97f-9224ac4571fe // 剛 剛 產 生 的UUID

到這邊為止,就可以試著建立虛擬機,並掛載一個虛擬磁碟上去看看功能是否正常了。

取消 Compute Worker 上固定的公開 IP

3.3節有提到在 NCTU CStack 環境下,我們的運算節點並沒有屬於自己的公開 IP,

而是使用私有 IP 經過統一的 NAT 主機連線到網際網路,然後再搭配舊有的 High Availability(HA) 模式,在提高安全性與節省 IP 使用量的前提下,依然讓虛擬機擁有很 好的連線保障。

改用這個模式除了要設定 NAT 之外,最大的問題是我們運算節點上的預設閘道 (Default Gateway) 必須設定成 NAT 主機,但是當運算節點動態的綁上公開 IP 之後,我 們不希望來源是公開 IP 的封包也往 NAT 主機來傳送,造成 NAT 主機的負擔,以及更 大的單點錯誤的問題。

要解決這個問題主要依靠 Linux Kernel 內建的簡易來源路由來達成,舉例如下:

// 當 宿 主 機 動 態 的 綁 定 一 公 開 IP之後,

# ip addr add 140.113.98.230/24 dev br0

// 修 改nova-network,依 照 虛 擬 機 的 IP 給 定 預 設 閘 道 (default gateway)。

# ip rule add from 10.0.5.6 table 200

# ip route add default via 140.113.98.254 dev br0 table 200 // 清 空kernel 快 取,讓 設 定 立 即 生效。

# ip route flush cache

// 同 時 發 出 ARP 更 新,告 知 大 家 我 擁 有 了 一 個 新 的 公 開 IP。

# arping -U 140.113.98.230 -A -I br0 -c 1

因此我們只要修改 nova-network,讓他在 (un)bind_floating_ip 時多做幾件事就好了,

詳細的修改可以參考 [附錄 B.4]。這邊我們介紹安裝方法:

<secret ephemeral='no' private='no'>

   <uuid>7f74c2c7-062c-d164-e97f-9224ac4571fe</uuid>

   <usage type='ceph'>