2016年11月28日 星期一

用 KVM 部署 Ceph

前言


大概一兩年前聽過 ceph[4],然後最近也從很多地方看到這個東西,包括公司職缺的簡介中,所以就翻了一點資料。雖然資料算滿多的,但是大略掃過以後覺得好像摸不著邊,剛好看到 ptt 上面有人寫了一個部屬的步驟 [1] (感謝大大無私分享!) ,然後我最近又才架完 KVM 不久,就試著在 VM 上玩看看,順便還可以熟悉一下 virsh( ... 熟悉一點點 XD)。

環境


  • Host
    • Gentoo kernel-4.4.26 64bit
  • Guest
    • Ubuntu-16.04 Server 64bit (x4台)
  • VMs' network
    • 192.168.0.181 ceph-admin
    • 192.168.0.182 ceph-1
    • 192.168.0.183 ceph-2
    • 192.168.0.184 ceph-3

用 Virsh 先把 ceph-admin, ceph-1, ceph-2, ceph-3 架起來:

$ virt-install --virt-type kvm \
               --name $(NAME) \
               --ram 512 \
               --cdrom=$(ROOT)/ubuntu-16.04.1-server-amd64.iso \
               --disk path=$(ROOT)$(DIR)/$(NAME).qcow2,size=16,format=qcow2 \
               --network bridge=br0 \
               --graphics vnc,listen=0.0.0.0 \
               --noautoconsole \
               --os-type=linux \
               --os-variant=ubuntu16.04

然後另外要產生給 ceph OSD (Object Storage Device,負責提供儲存資源) 的 disk:

$ qemu-img create -f raw ceph3-data.img 10G


應該是要用 virt-clone 的,可是因為我沒辦法用 NAT 所以指定 IP 之類的好像有點麻煩,所以就先用最簡單蠢的方式把這四台 VM 架起來。

不曉得為什麼我的這台 host 開的 VM 如果是用 NAT 的話就會沒辦法順利拿到沒問題的封包,意思就是拿到的封包都有問題 ... 然後用 bridge 就沒事了,怪哉。而且不是 VM Guest 而已,是連 docker container 都一樣 ...

正片開始


架好之後在四台的 /etc/hosts 加上:

192.168.0.181 ceph-admin
192.168.0.182 ceph-1
192.168.0.183 ceph-2
192.168.0.184 ceph-3


一開始先在 ceph-admin 把 ssh 用的 key 建好並複製到其他主機:

mkfsn@ceph-admin:~$ ssh-keygen
mkfsn@ceph-admin:~$ ssh-copy-id ceph-1
mkfsn@ceph-admin:~$ ssh-copy-id ceph-2
mkfsn@ceph-admin:~$ ssh-copy-id ceph-3


接著在 ceph-admin 把該裝的套件裝好:


mkfsn@ceph-admin:~$ wget -q -O- 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc' | sudo apt-key add -
mkfsn@ceph-admin:~$ echo deb echo deb http://ceph.com/debian-firefly/ $(lsb_release -sc) main |  sudo tee /etc/apt/sources.list.d/ceph.list
mkfsn@ceph-admin:~$ sudo apt-get update
mkfsn@ceph-admin:~$ sudo apt-get install ceph-deploy
mkfsn@ceph-admin:~$ sudo apt-get install ceph-common

部署


建立工作目錄
mkfsn@ceph-admin:~$ mkdir ~/ceph && cd ~/ceph


在所有node上安裝ceph套件
mkfsn@ceph-admin:~/ceph$ ceph-deploy new ceph-1 ceph-2 ceph-3

撞了第一個牆:



看 error message 似乎是 ceph-1 沒裝 python 的原因,所以就把 ceph-1, ceph-2, ceph-3 裝上 python 吧:

mkfsn@ceph-1:~$ sudo apt install -y python
mkfsn@ceph-2:~$ sudo apt install -y python
mkfsn@ceph-3:~$ sudo apt install -y python


接下來繼續撞,第二個牆:



[2] 說在 ceph-1,2,3 的 /etc/sudoers 要設定讓使用者不用輸入密碼就可以執行 sudo,所以我就在 /etc/sudoers.d/ 新增一個檔案 01mkfsn:

mkfsn   ALL=(ALL) NOPASSWD:ALL

接著回到主任務:

在所有 node 上安裝 ceph 套件
mkfsn@ceph-admin:~/ceph$ ceph-deploy install ceph-1 ceph-2 ceph-3

建立 mon
mkfsn@ceph-admin:~/ceph$ ceph-deploy mon create ceph-1 ceph-2 ceph-3

將所有 node 的密鑰都複製到工作目錄
mkfsn@ceph-admin:~/ceph$ ceph-deploy gatherkeys ceph-1 ceph-2 ceph-3

增加 OSD
mkfsn@ceph-admin:~/ceph$ ceph-deploy osd prepare ceph-1:/dev/vdb ceph-2:/dev/vdb ceph-3:/dev/vdb


複製 admin 密鑰到所有 node
mkfsn@ceph-admin:~/ceph$ ceph-deploy admin ceph-1 ceph-2 ceph-3


最後檢查部署狀態,不過馬上就噴了錯誤
mkfsn@ceph-admin:~/ceph$ sudo ceph health
auth: unable to find a keyring on /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin: (2) No such file or directory




貌似是需要把 ceph.client.admin.keyring 複製到 /etc/ceph 底下才行,所以就複製過去吧!
mkfsn@ceph-admin:~/ceph$ sudo cp ceph.client.admin.keyring /etc/ceph/


掛載 rbd 內核模組
mkfsn@ceph-admin:~/ceph$ sudo modprobe rbd


建立一個 4G 的 image
mkfsn@ceph-admin:~/ceph$ sudo rbd create --size 4096 test

將 test 這個 image map 到 rbd pool,然後就撞到第四個牆
mkfsn@ceph-admin:~/ceph$ sudo rbd map test --pool rbd
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable".
In some cases useful info is found in syslog - try "dmesg | tail" or so.
rbd: map failed: (6) No such device or address


[3] 表示有一些 feature 沒有被 kernel client 支援,所以關掉即可:

  • exclusive-lock
  • object-map
  • fast-diff
  • deep-flatten

mkfsn@ceph-admin:~/ceph$ sudo rbd feature disable test exclusive-lock object-map fast-diff deep-flatten

然後就可以順利執行了~

mkfsn@ceph-admin:~/ceph$ sudo rbd map test --pool rbd
/dev/rbd0

都看到 block device file 了,就 format mount 起來看看囉~

mkfsn@ceph-admin:~/ceph$ sudo mkfs.ext4 /dev/rbd0
mkfsn@ceph-admin:~/ceph$ sudo mkdir -p /rbd/test

最終結果:

mkfsn@ceph-admin:~/ceph$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom
vda    253:0    0   16G  0 disk
|-vda1 253:1    0 15.5G  0 part /
|-vda2 253:2    0    1K  0 part
`-vda5 253:5    0  510M  0 part [SWAP]
rbd0   251:0    0    4G  0 disk /rbd/test

心得


覺得 deploy 起來真的是非常簡單易懂,照著指令打你說誰不會呢 ? XD

所以之後有空要來挖一下實作的部分,只是我對於 storage 真的很不熟啊啊啊啊 Orzzz

Reference


沒有留言:

張貼留言