Integrasi KVM dengan Ceph


Bagus Koko Wibawanto

4 April 2024

Kita bisa membuat VM dengan menggunakan KVM, tetapi semua data data vm tersimpan di dalam host tersebut. Jika misalnya kita perlu melakukan reboot server hostnya, maka vm yang di atasnya akan terkena reboot juga. Dengan menggunakan Ceph sebagai penyimpanan data vmnya, kita bisa memindahkan vm tersebut ke server host yang lain. Dengan begitu vm tidak akan terkena reboot. Distributed storage seperti Ceph dibutuhkan dalam Cloud Computing.


Kita akan menggunakan libvirt untuk menghubungkan Ceph dengan KVM. Libvirt adalah library hypervisor seperti KVM. Libvirt berkomunikasi dengan KVM, jadi kita hanya memberikan beberapa perintah saja untuk mengelola KVM. Penulis sudah menyiapkan cluster Ceph dan sudah melakukan setup KVM. Pada artikel ini penulis akan memberikan referensi untuk menyiapkan cluster ceph dan juga artikel untuk melakukan setup KVM sampai bisa digunakan. Referensi ada di akhir artikel.


Topologi yang penulis gunakan adalah seperti di bawah ini.

Penulis menggunakan total empat server. Tiga server untuk cluster Ceph, ceph-admin, ceph-osd1, ceph-osd2, dan satu server lagi untuk KVM, libvirt-client. Kita nanti akan melakukan setup agar KVM bisa diintegrasikan dengan Ceph, dan nantinya kita akan membuat VM yang semua datanya tersimpan di dalam Ceph.


Karena untuk setup cluster Ceph dan setup KVM akan panjang jika ditulis pada artikel ini. Jadi untuk setup Ceph, pembaca bisa akses artikel dari blog blog.ajiarya.id dan yudiwiratama.medium.com, dan untuk setup KVM bisa diakses dari blog baguskokow.github.io. Untuk link lengkap ada di referensi.


Menyiapkan Pool di Ceph untuk KVM


Buat pool ceph.


$ ceph osd pool create libvirt-pool 128 128 
					

Verifikasi pool yang tadi baru dibuat.


$ ceph osd lspools 
1 device_health_metrics 
2 libvirt-pool
					

Inisialisasi pool libvirt-pool untuk digunakan sebagai RBD.


$ rbd pool init libvirt-pool
					

Buat user libvirt di Ceph.


$ ceph auth get-or-create client.libvirt mon 'profile rbd' osd 'profile rbd pool=libvirt-pool'
					

Verifikasi user libvirt.


$ ceph auth export client.libvirt 
[client.libvirt] 
key = AQB2Fg1mBqyEARAA5mz9ol+xPoay6sT5mBgrEg== 
caps mon = "profile rbd" 
caps osd = "profile rbd pool=libvirt-pool" 
export auth(key=AQB2Fg1mBqyEARAA5mz9ol+xPoay6sT5mBgrEg==)
					

Integrasikan Libvirt dengan Ceph


Install ceph-common di server libvirt-client.


$ sudo apt install ceph-common
					

Salin keyring admin dan ceph.conf dari server ceph-admin ke server libvirt-client.


$ scp /etc/ceph/ceph.client.admin.keyring root@libvirt-client:/etc/ceph/
$ scp /etc/ceph/ceph.conf root@libvirt-client:/etc/ceph/
					

Verifikasi menjalankan command ceph di server libvirt-client.

Define variable variable untuk mempermudahkan melakukan konfigurasi.


export CEPH_PGS="128"
export CEPH_USER="libvirt"
export CEPH_POOL="libvirt-pool"
export CEPH_RADOS_HOST="192.168.11.211"
export CEPH_RADOS_PORT="6789"
export VIRT_SCRT_UUID="$(uuidgen)"
export VIRT_SCRT_PATH="/tmp/libvirt-secret.xml"
export VIRT_POOL_PATH="/tmp/libvirt-rbd-pool.xml"
					

Buat file xml libvirt secret untuk autentikasi.


$ cat > "${VIRT_SCRT_PATH}" <<EOF
<secret ephemeral='no' private='no'>
<uuid>${VIRT_SCRT_UUID}</uuid>
<usage type='ceph'>
<name>client.${CEPH_USER} secret</name>
</usage>
</secret>
EOF
					

Verifikasi file libvirt secret yang tadi kita buat.

Define libvirt secret.


$ virsh secret-define --file "${VIRT_SCRT_PATH}" 
Secret 81e969ad-f4aa-49f2-a46a-ef529a27e048 created
					

Verifikasi libvirt secret yang telah dibuat.

Set secret value dengan keyring client.libvirt.


$ virsh secret-set-value --secret 81e969ad-f4aa-49f2-a46a-ef529a27e048 --base64 "$(ceph auth get-key client.libvirt)" 
Secret value set
					

Buat file xml untuk storage pool Ceph di libvirt.


cat > "${VIRT_POOL_PATH}" >>EOF
<pool type="rbd">
<name>${CEPH_POOL}</name>
<source>
<name>${CEPH_POOL}</name>
<host name='${CEPH_RADOS_HOST}' port='${CEPH_RADOS_PORT}' />
<auth username='${CEPH_USER}' type='ceph'>
<secret uuid='${VIRT_SCRT_UUID}'/>
</auth>
</source>
</pool>
EOF
					

Verifikasi file xml storage pool yang udah dibuat.

Define & Start pool storage.


$ virsh pool-define "${VIRT_POOL_PATH}"
$ virsh pool-start "${CEPH_POOL}"
$ virsh pool-autostart "${CEPH_POOL}"
					

Verifikasi pool storage.

Test Membuat Disk Kosong


Kita akan mencoba test untuk membuat disk kosong terlebih dahulu, setelah berhasil nantinya kita akan melakukan test yang kedua, yaitu membuat VM.


Buat disk kosong dengan menggunakan command ini.


$ virsh vol-create-as libvirt-pool test --capacity 1G --format raw 
Vol test created
					

Verifikasi dari sisi Ceph apakah sudah ada disk kosong yang tadi kita buat.

Test Membuat VM


Pada percobaan kali ini, penulis akan membuat vm dengan image, iso cloud-init, dan disk kosong disimpan di dalam ceph. Jadi semua VM akan disimpan di dalam ceph. Untuk OS yang akan dipakai untuk membuat vm adalah Ubuntu 20.04.


Buat konfigurasi network.


$ vim br1.xml

<network>
  <name>br1</name>
  <forward mode='route'/>
  <bridge name='virbr1'/>
  <ip address='10.5.5.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='10.5.5.2' end='10.5.5.254'/>
    </dhcp>
  </ip>
</network>
					

Define konfigurasi network.


$ virsh net-define br1.xml
$ virsh net-start br1
$ virsh net-autostart br1
					

Verifikasi network.


$ virsh net-list 
$ ip a | grep global
					

Download image ubuntu 20.04 dari official ubuntu. Akses web Official Website Cloud Image Ubuntu untuk mendownload cloud image.

Pilih yang .img dan download dengan menggunakan tool wget.


$ wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
					

Convert image dari .qcow2 menjadi .raw


$ qemu-img convert -f qcow2 -O raw focal-server-cloudimg-amd64.img ubuntu-focal.raw
					

Import image ubuntu-focal.raw ke Ceph.


$ rbd import --dest-pool libvirt-pool ubuntu-focal.raw --dest ubuntu-focal
					

Verifikasi image yang kita import di dalam Ceph.

Buat snapshot dari image ubuntu-focal sebelumnya.


$ rbd snap create libvirt-pool/ubuntu-focal@snap-ubuntu-focal
					

Verifikasi snapshot yang telah dibuat.


$ rbd snap ls libvirt-pool/ubuntu-focal
					

Buat agar snapshot menjadi protected.


$ rbd snap protect libvirt-pool/ubuntu-focal@snap-ubuntu-focal
					

Verifikasi snapshot untuk memastikan sudah menjadi protected.

Clone snapshot agar menjadi image baru.


$ rbd clone libvirt-pool/ubuntu-focal@snap-ubuntu-focal libvirt-pool/mugiwara-vm
					

Verifikasi image baru hasil clone.

Resize agar sizenya menjadi 20GB, karena itu adalah ukuran partisi root (/).


$ rbd resize libvirt-pool/mugiwara-vm --size 20480
					

Verifikasi untuk memastikan ukuran imagenya sudah menjadi 20GB.

Buat konfigurasi cloud-init.


$ vim user-data

#cloud-config
users:
  - name: student
    ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC1VPSd8YVb0ZxAdX+yWdXpN/zUZusjfu9gaS/bj6ZZu8DhaN5EJVPMHiZQy0XtU0HTHzQQi4LB4B0aTHhpvJYmT2CfcXACxlCJh9aJ9kdVnAzX2fDp7fviy1jFax5dJ2wEIkGs3rss/G2TuTkG6CuA30axz+1EJpmmUZ1hwR4zOlXDPaFa7qOVXA+eUdAPekrAjpdfgxAnj/qq2hDzUsDolr6AgYQYGhiEttLm1q469L89LhdKh51bO4GDMdP86H9LlaTNEVRdULbF9iaywftgQ52zpqvuVxgPCRVHVwLKGUefLv7DOBDGVwo0AMzEAGTN15mTgvFzUGSiWJeqkCGezvjHgGsW1SuNvLaDGJIubDZBoF1HKILuS75ZHJsIIQ8DA+NppsqMIEBa3e+A3PpB+0DCAsqZck46+UA11kIr/ypV/zhKax+8ZW0Q0mQvyDmYFi/n48xMHLnBwDwIxe7i5pn7PASb6umzijZv8VwbI+tJ8ly5NjcZn87PTKK9cB0= root@libvirt-client
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash
runcmd:
  - echo "AllowUsers student" >> /etc/ssh/sshd_config
  - restart ssh

chpasswd:
  list: |
    student:student
    root:student
  expire: False
					

$ vim meta-data

local-hostname: mugiwara
					

Buat cd-rom cloud init dengan menggunakan tool genisoimage.


$ genisoimage -output cidata.iso -V cidata -r -J user-data meta-data
					

Import cidata.iso ke Ceph.


$ rbd import --dest-pool libvirt-pool cidata.iso
					

Verifikasi cidata.iso di dalam Ceph.

Buat disk kosong untuk tambahan disk vmnya.


$ rbd create --size 5120 libvirt-pool/mugiwara-disk1
					

Verifikasi disk kosong yang baru dibuat.

Buat VM.


$ virt-install --name=mugiwara-server --ram=1024 --vcpus=1 --import \
--disk vol=libvirt-pool/mugiwara-vm,format=qcow2 \
--disk vol=libvirt-pool/cidata.iso,device=cdrom \
--disk vol=libvirt-pool/mugiwara-disk1,format=qcow2 \
--os-variant=ubuntu20.04 \
--network bridge=virbr1,model=virtio  --noautoconsole
					

Verifikasi VM yang telah dibuat.


$ virsh list
					

Check IP yang didapat dari mugiwara-server.


$ virsh net-dhcp-leases br1
					

Test SSH.

Kesimpulan


Kita telah berhasil mengintegrasikan KVM dengan Ceph. Jadi semua data VM akan tersimpan di dalam Ceph. Ini adalah kelebihan dari distributed storage seperti Ceph. Kita akan dipermudah bila suatu waktu kita butuh untuk migrasi vm ke host lain. Jadi semua host KVM bisa menggunakan storage yang sama, tanpa perlu disimpan di dalam server host masing masing.




Referensi


- blog.ajiarya.id. (30 Agustus 2022). Cara Deploy Ceph Quincy Secara Manual. Diakses pada 2 April 2024, dari https://blog.ajiarya.id/posts/ceph/cara-deploy-ceph-secara-manual/


- yudiwiratama.medium.com. (22 Juni 2023). Deploy Ceph Cluster Quincy Manual. Diakses pada 2 April 2024, dari https://yudiwiratama.medium.com/deploy-ceph-cluster-quincy-manual-6-node-96ac4644710e


- sumit-ghosh.com. (8 September 2020). Virtualization and Hypervisors :: Explaining QEMU, KVM, and Libvirt. Diakses pada 3 April 2024, dari https://sumit-ghosh.com/posts/virtualization-hypervisors-explaining-qemu-kvm-libvirt/


- baguskokow.github.io. (27 Maret 2024). Menjadikan OS Linux Sebagai Hypervisor Type 1. Diakses pada 3 April 2024, dari https://baguskokow.github.io/menjadikan-os-linux-sebagai-hypervisor-type1/


- insujang.github.io. (4 Maret 2021). Using Ceph RBD as a QEMU Storage . Diakses pada 15 Maret 2024, dari https://insujang.github.io/2021-03-04/using-ceph-rbd-as-a-qemu-storage/


- log.modest-destiny.com. (7 Oktober 2019). Add Ceph RBD Storage Pool to KVM/QEMU/Libvirt. Diakses pada 15 Maret 2024, dari https://blog.modest-destiny.com/posts/kvm-libvirt-add-ceph-rbd-pool/


- docs.ceph.com. (-). Using libvirt with Ceph RBD. Diakses pada 15 Maret 2024, dari https://docs.ceph.com/en/nautilus/rbd/libvirt/