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/