Install OpenStack Yoga Menggunakan MAAS & Juju
OpenStack Series #3 | Deploy Your Clouds
MAAS ?
MAAS Merupakan singkatan dari metal-as-a-service adalah tools yang dikembangkan oleh canonical untuk provisioning server seperti menginstal sistem operasi, mengatur IP address, konfigurasi file system, management logical rack dan lainya. Juju juga merupakan tools yang dikembangkan oleh perusahaan yang sama dan biasa dikombinasikan dengan MAAS, Juju merupakan orchestration tools yang dapat membangun infrastruktur berbasis software cloud seperti OpenStack dan Kubernetes. MAAS & Juju memiliki keandalan yang mumpuni dilevel enterprise karena memudahkan engineer dalam mengatur baremetal dan juga softwarenya.
Environment
MAAS tidak hanya kompatibel untuk baremetal saja namun juga kompatibel digunakan bersamaan dengan VMware dan KVM hypervisor. Oleh karena itu engineer yang baru belajar juga dapat mencobanya sendiri menggunakan environment virtual dengan spesifikasi berikut:
- Operating System: Ubuntu 20.04 LTS (Focal)
- OpenStack Version: Yoga
- Ceph Version: Pacific
- Hypervisor: KVM
Topology
Tujuan dari artikel ini adalah perkenalan tentang bagaimana cara deploy OpenStack menggunakan tools MAAS & Juju oleh karena itu environment yang didesain cukup sederhana dan tidak memiliki high availability.
MAAS Installation
Tambahkan konfigurasi berikut di maas001 untuk mempermudah SSH.
cat << 'EOF' > $HOME/.ssh/config
# Global Config
Host *
User ubuntu
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
ServerAliveInterval 10
TCPKeepAlive yes
LogLevel ERROR
# Global Config
EOF
Install package yang diperlukan lalu disable automatic updates
## Add repository
apt-add-repository ppa:maas/3.2
## Install maas packages
apt-get -y install maas \
maas-region-controller \
maas-rack-controller
## Disable automatic updates
apt-mark hold maas \
maas-region-controller \
maas-rack-controller postgresql-12
Selanjutnya buat temporary statistic file PostgreSQL
bash -c cat << 'EOF' > /etc/tmpfiles.d/postgresql-part.conf
## Directory for PostgreSQL temp stat files
d /run/postgresql/12-main.pg_stat_tmp 0700 postgres postgres - -
EOF
systemd-tmpfiles --create /etc/tmpfiles.d/postgresql-part.conf
Extend max connection PostgreSQL
## Login sebagai user postgres agar tidak perlu mengubah permission
su - postgres
## Set max connection ke 10000
sed -i 's/max_connections = 100/max_connections = 10000/' /etc/postgresql/12/main/postgresql.conf
## Restart postgresql
systemctl restart postgresql@12-main
Tambahkan keypair hypervisor agar MAAS bisa melakukan provisioning VM tanpa menggunakan password user hypervisor
## Tambahkan SSH private key ke .ssh/id_rsa di homedir maas
chsh -s /bin/bash maas
su - maas
mkdir -p .ssh/
Buat user admin untuk login ke MAAS
maas createadmin
MAAS dashboard dapat diakses melalui
http://${IP_HOST}:5240
Setelah Login silahkan mengisi region name sesuai keinginan setelah itu tambahkan SSH public key agar bisa langsung SSH dari maas001 ke machines yang sudah ditambahkan. Apabila belum punya pubkey maka bisa dibuat dengan command ssh-keygen. Pembuatan SSH keypair bisa menggunakan passwordless caranya tinggal tekan enter saja setelah menjalankan command.
root@maas001:~# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:2DlU3Zj8nU+eTX0jJcRTz3EpdEmGF/bf5q9At+UcSjg root@maas001
The key's randomart image is:
+---[RSA 3072]----+
| .o+*+O=|
| . =*=*=|
| . .*.*|
| + . ...oO|
| . S E..o=@|
| . .o..O=|
| ... +|
| . .|
| ...|
+----[SHA256]-----+
SSH Pubkey akan tersimpan di $HOME/.ssh/id_rsa.pub salin isi file tersebut ke MAAS dashboard
Langkah selanjutnya adalah meng-enable DHCP pada network management, karena DHCP digunakan untuk melakukan PXE boot pada machine yang akan ditambahkan, jika tidak di-enable maka MAAS tidak dapat melakukan PXE boot.
MAAS Networking
MAAS memiliki dua konsep networking yang akan sering dijumpai dan digunakan yaitu sebagai berikut
- Fabrics merupakan switch atau kombinasi switch yang menggunakan trunking untuk menyediakan VLAN yang sama.
- Spaces adalah logical grouping dari subnets yang dapat berkomunikasi satu sama lain.
Lain halnya dengan Juju yang hanya mengenal konsep space jadi kita perlu membuat space agar bisa mengatur networking diaplikasi yang dideploy, space yang dibutuhkan adalah Internal dan External.
Tambahkan VLAN 10 Internal ke fabric Management dengan space Internal. VLAN 10 digunakan untuk internal endpoint dari OpenStack dan juga sebagai jalur komunikasi antar aplikasi.
Untagged VLAN juga perlu diset space External agar bisa dikenali oleh Juju
Selanjutnya tambahkan subnet di VLAN 10
Creating PXE Boot VM
Jalankan perintah berikut pada hypervisor KVM untuk membuat virtual disk yang akan digunakan sebagai root filesystem.
qemu-img create -f qcow2 /data/vms/$VM_NAME-vda.qcow2 40G >/dev/null
Selanjutnya buat VM dengan boot order pertamanya adalah network.
virt-install --virt-type kvm \
--name $VM_NAME \
--os-type=linux --os-variant=ubuntu20.04 \
--ram=4096 --vcpus=4 \
--cpu host-passthrough,cache.mode=passthrough \
--pxe --graphics vnc \
--boot network,hd \
--network bridge=virbr2 \
--network bridge=virbr3 \
--disk path=/data/vms/$VM_NAME-vda.qcow2,bus=scsi \
--noautoconsole --noreboot >/dev/null && virsh destroy $VM_NAME
Kemudian eksekusi command berikut untuk mendapatkan VM ID dan MAC address karena nantinya informasi ini akan dibutuhkan ketika menambahkan machine ke MAAS.
virsh dumpxml $VM_NAME | grep uuid | perl -lape 's/\s\s.\w+.(.*)<.*/$1/gm'
virsh dumpxml $VM_NAME | grep "mac address" | perl -lape 's/.*<\w+\s\w+..(.*).../$1/gm' | awk 'NR==1'
Setup Juju Controller
Juju controller merupakan system yang bertugas untuk orchestrate software berbasis charms. Charms merupakan operator aplikasi yang sudah dipackage dengan kemampuan operasional yang dibutuhkan seperti install, maintain, upgrade dan berintegrasi dengan aplikasi lainnya.
Untuk melakukan setup Juju controller pertama-tama VM/machine harus dikenali oleh MAAS yang mana proses ini disebut sebagai commissioning.
Setelah commissioning selesai langkah selanjutnya adalah mengkonfigurasi IP address juju-controller seperti berikut.
Kemudian buat tag dengan nama “juju-controller”, tag akan diperlukan ketika ingin menambahkan machine ke Juju karena untuk menambahkan machine ke juju tidak bisa pakai hostname namun kita bisa membuat tag yang namanya sama dengan hostnamenya.
Install command line tools juju client pada maas001
curl -LO https://launchpad.net/juju/2.9/2.9.35/+download/juju-2.9.35-linux-amd64.tar.xz
tar xf juju-*.tar.xz; rm juju-*.tar.xz
install -o root -g root -m 0755 juju /usr/local/bin/juju; rm juju
install -o root -g root -m 0755 juju-metadata /usr/local/bin/juju-metadata; rm juju-metadata dmi.bin
Tambahkan credentials MAAS
cat << 'EOF' > maas-cloud.yaml
clouds:
CLOUD_NAME:
type: maas
auth-types: [oauth1]
endpoint: http://10.10.0.10:5240/MAAS
EOF
cat << EOF > maas-credential.yaml
credentials:
CLOUD_NAME:
admin:
auth-type: oauth1
maas-oauth: $(maas apikey --username=admin)
EOF
juju add-cloud --client -f maas-cloud.yaml beruanglaut
juju add-credential --client -f maas-credential.yaml beruanglaut
juju list-clouds; juju credentials
Buat file konfigurasi yang digunakan untuk bootstrap Juju controller
cat << 'EOF' > juju-config.yaml
default-series: focal
default-space: external
juju-ha-space: external
juju-mgmt-space: external
EOF
Langkah terakhir adalah melakukan bootstrap Juju controller
juju bootstrap --config=juju-config.yaml \
--bootstrap-constraints="tags=juju-controller" \
CLOUD_NAME CONTROLLER_NAME
Berikut status dari Juju controller yang berhasil di bootstrap
Deploy Juju Bundle
Juju bundle merupakan kumpulan charms yang sudah dikombinasi dan dikonfigurasikan untuk deploy rangkaian service yang kompleks sekaligus.
Aplikasi yang dideploy melalui Juju charm membutuhkan sebuah model sebagai tempat dari kumpulan aplikasi, konsepnya sederhananya hampir sama seperti namespace pada kubernetes.
Berikut command yang dibutuhkan untuk membuat sebuah model baru bernama openstack.
juju add-model openstack
Setelah mempunyai sebuah model langkah selanjutnya adalah membuat Juju bundle yang berbentuk sebuah file yaml, untuk mempersingkat langkah ini kita bisa langsung menggunakan Juju bundle yang sudah jadi.
wget https://raw.githubusercontent.com/jhodysetiawansekardono/openstack/main/juju/bundles/yoga-bundle.yaml
juju switch model openstack
juju deploy yoga-bundle.yaml
Sebenarnya Juju bundle bisa langsung sekaligus deploy aplikasi ke machines yang sudah di-commissioning oleh MAAS, namun untuk perkenalan awal agar kita paham sedikit cara kerja Juju maka kita akan belajar dari menambahkan machines ke Juju lalu menginstall aplikasi melalaui Juju charms.
Deploy OpenStack Machines
Siapkan virtual disk untuk PXE boot VM OpenStack pada KVM
## Untuk openstack-controller
qemu-img create -f qcow2 /data/vms/$VM_NAME-vda.qcow2 40G >/dev/null
## Untuk compute
qemu-img create -f qcow2 /data/vms/$VM_NAME-vda.qcow2 50G >/dev/null
qemu-img create -f qcow2 /data/vms/$VM_NAME-vdb.qcow2 25G >/dev/null
qemu-img create -f qcow2 /data/vms/$VM_NAME-vdc.qcow2 25G >/dev/null
qemu-img create -f qcow2 /data/vms/$VM_NAME-vdd.qcow2 25G >/dev/null
Selanjutnya buat PXE boot VM, untuk openstack-controller caranya sama seperti juju-controller hanya beda spek ram sama cpu, jadi command berikut contoh khusus untuk compute node.
virt-install --virt-type kvm \
--name $VM_NAME \
--os-type=linux --os-variant=ubuntu20.04 \
--ram=16384 --vcpus=6 \
--cpu host-passthrough,cache.mode=passthrough \
--pxe --graphics vnc \
--boot network,hd \
--network bridge=virbr2 \
--network bridge=virbr3 \
--disk path=/data/vms/$VM_NAME-vda.qcow2,bus=scsi \
--disk path=/data/vms/$VM_NAME-vdb.qcow2,bus=scsi \
--disk path=/data/vms/$VM_NAME-vdc.qcow2,bus=scsi \
--disk path=/data/vms/$VM_NAME-vdd.qcow2,bus=scsi \
--noautoconsole --noreboot >/dev/null && virsh destroy $VM_NAME
Langkah selanjutnya adalah commissioning lalu mengkonfigurasi IP address ke mode statik dan set tags, langkahnya sama seperti awal setup juju controller. Jangan lupa tambahkan VLAN 10 ke setiap openstack machines dengan cara seperti berikut.
Pastikan semua machines dalam state ready agar bisa ditambahkan ke juju.
Pastikan nama tag sudah sesuai disemua node OpenStack agar bisa menambahkan machines ke juju dengan benar.
juju add-machine --series focal \
--constraints="tags=openstack-controller"
juju add-machine --series focal \
--constraints="tags=compute001"
juju add-machine --series focal \
--constraints="tags=compute002"
juju add-machine --series focal \
--constraints="tags=compute003"
Pada MAAS machines yang sedang dalam proses deploy state-nya akan berubah dari ready ke Deploying setelah selesai statenya menjadi Deployed.
Namun pada Juju statenya adalah pending kemudian ketika selesai akan berubah menjadi started.
Setelah selesai menambahkan pastikan list machines nya sama seperti berikut
Deploy OpenStack
Juju status saat ini menampilkan informasi mengenai aplikasi dan machines yang tersedia, untuk langkah selanjutnya adalah menginstal aplikasi ini kedalam machines yang sudah dideploy.
Pada juju ada 2 cara untuk deploy aplikasi kedalam machines, yang pertama adalah secara baremetal dan yang kedua adalah dengan LXD container, jadi nantinya akan ada aplikasi yang dideploy dibaremetal dan LXD.
Aplikasi yang menempati suatu machine disebut sebagai unit yang merupakan turunan dari sebuah aplikasi yang bisa saja memiliki satu atau beberapa unit untuk menjalankan workload sebuah aplikasi.
Jalankan command berikut untuk deploy ceph-mon pada openstack-controller dalam bentuk lxd container. Sekaligus deploy ceph-osd secara baremetal ke node compute.
juju add-unit ceph-mon --to lxd:0
juju add-unit ceph-osd -n 3 --to 1,2,3
Karena charm-nya mysql menggunakan mysql-innodb-cluster yang requirementnya harus HA maka untuk menyanggupinya bisa dideploy di-node compute. Untuk rabbitmq-server dideploy saja di controller.
juju add-unit mysql -n3 --to lxd:1,lxd:2,lxd:3
juju add-unit rabbitmq-server --to lxd:0
Kemudian deploy keystone ke controller dan tunggu sampai agent-nya idle supaya bisa lanjut deploy aplikasi yang membutuhkan relation identity service-nya keystone.
juju add-unit keystone --to lxd:0
Setelah keystone siap lanjut deploy cinder dan glance ke openstack controller satu-per-satu agar proses workload di controller tidak terlalu tinggi.
juju add-unit cinder --to lxd:0
juju add-unit glance --to lxd:0
Apabila subordinate unit cinder-ceph stuck Ceph broker request incomplete maka cara resolvenya adalah dengan recreate relation cinder-ceph dan ceph-mon
juju remove-relation cinder-ceph:ceph ceph-mon:client; sleep 10
juju add-relation cinder-ceph:ceph ceph-mon:client
Entah kenapa hal ini selalu terjadi ketika deploy cinder dengan versi charm cinder-ceph-268 padahal enpoint-binding dari sisi ceph-mon dan cinder-ceph sudah benar. Issue ini diakibatkan oleh konfigurasi ceph.conf di cinder-ceph kosong, sehingga menyebabkan error ketika cinder-ceph ingin koneksi ke cinder pool.
Apabila glance juga mengalami hal yang sama maka cara resolve-nya juga sama yaitu recreate relation
juju remove-relation glance:ceph ceph-mon:client; sleep 10
juju add-relation glance:ceph ceph-mon:client
Lanjut deploy placement, nova-cloud-controller dan neutron-api ke controller satu per satu
juju add-unit placement --to lxd:0
juju add-unit nova-cloud-controller --to lxd:0
juju add-unit neutron-api --to lxd:0
Kemudian deploy nova-compute secara baremetal
juju add-unit nova-compute --to 1
juju add-unit nova-compute --to 2
juju add-unit nova-compute --to 3
Terakhir adalah deploy horizon openstack dashboard
juju add-unit openstack-dashboard --to lxd:0
Berikut hasil finalnya
Access OpenStack
Untuk akses ke OpenStack pertama kali kita perlu akses ke dashboard horizon, berikut command untuk mendapatkan informasi IP dan password
## IP OpenStack dashboard
juju status --format=yaml openstack-dashboard | grep public-address | awk '{print $2}' | head -1
> output 10.10.0.117
## Mendapatkan password di keystone
juju run --unit keystone/leader leader-get admin_passwd
> output Tru$tNo1
Jadi akses dashboard adalah
- http://10.10.0.117
- User: admin
- Password: Tru$tNo1
- Domain: admin_domain
Untuk openrc juga bisa didownload di dashboard
Pastikan URL interface endpoint sudah mirip seperti berikut
Untuk melakukan test operational lebih lanjut bisa mengikuti referensi berikut.
By Jhody Sekardono, Ops Team Btech
Our Tagline
#ContinuousLearning
Reference
OpenStack Operational