Install OpenStack Yoga Menggunakan MAAS & Juju

OpenStack Series #3 | Deploy Your Clouds

Jhody Sekardono
btech-engineering
11 min readNov 15, 2022

--

Build your cloud with MAAS & Juju

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
Spesifikasi LAB

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.

OpenStack Lab Topology

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
Tampilan Login MAAS Dashboard

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

Setup SSH pubkey pada 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.

Enable DHCP agar bisa 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.
MAAS Fabrics & Spaces Concept

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.

Penambahan MAAS Spaces

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.

Menambahkan VLAN

Untagged VLAN juga perlu diset space External agar bisa dikenali oleh Juju

Pasang External Space pada Untagged VLAN

Selanjutnya tambahkan subnet di VLAN 10

Menambahkan subnet baru

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.

Commissioning new machines

Setelah commissioning selesai langkah selanjutnya adalah mengkonfigurasi IP address juju-controller seperti berikut.

Konfigurasi IP statik juju controller

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.

Penambahan tags pada MAAS

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

Juju status

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.

Konsep juju model

Berikut command yang dibutuhkan untuk membuat sebuah model baru bernama openstack.

juju add-model openstack
Menambahkan 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 juju bundle

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.

Penambahan VLAN 10

Pastikan semua machines dalam state ready agar bisa ditambahkan ke juju.

List MAAS machines dengan state ready

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.

Perubahan state pada saat add machine

Namun pada Juju statenya adalah pending kemudian ketika selesai akan berubah menjadi started.

Add machine ke juju

Setelah selesai menambahkan pastikan list machines nya sama seperti berikut

juju machines

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.

Juju status setelah menambahkan machines

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.

Baremetal & LXD container

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
Juju status saat ini

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
cinder-ceph stuck request incomplete

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
Glance stuck request incomplete

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

Juju status setelah deploy openstack

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

Tampilan dashboard openstack

Untuk openrc juga bisa didownload di dashboard

Download openrc di dashboard

Pastikan URL interface endpoint sudah mirip seperti berikut

OpenStack endpoint list

Untuk melakukan test operational lebih lanjut bisa mengikuti referensi berikut.

By Jhody Sekardono, Ops Team Btech

--

--