Alla luce delle recenti notizie sull'acquisizione di VMware da parte di Broadcom e dalle modifiche che riguardano il modello di licensing, molte aziende che gestiscono o utilizzano un private cloud internamente stanno rivolgendo la loro attenzione verso soluzioni open source. Queste tecnologie offrono l'opportunità di ridurre i costi senza compromettere le funzionalità. Un ottimo candidato per questo ruolo potrebbe essere Openstack.
In questo articolo vi mostrerò come eseguire il deploy di un ambiente Openstack minimale utilizzando Ansible Kolla, lo strumento ufficiale sviluppato e mantenuto dalla medesima community.
Prima di iniziare vorrei dire due parole riguardo ad Openstack:
OpenStack è una piattaforma open source che utilizza pool di risorse virtuali per creare e gestire cloud privati e pubblici. Gli strumenti che compongono la piattaforma OpenStack, denominati "progetti", gestiscono i servizi base del cloud computing, ovvero compute, network, storage, identity e gestione delle immagini (In AWS vengono indicate come AMI).
Queste risorse possono essere controllate e gestite tramite API o tramite la sua dashbaord (Horizon).
Ci sarebbe molto altro da approfondire riguardo ad Openstack e quello che riguarda la sua community ma tratterò questo argomento in un articolo dedicato.
Per ora ci basti sapere le basi di cosa stiamo andando ad installare.
Prerequisiti Hardware
Risorse mimine per un installazione standalone:
1 macchina fisica/virtuale con:
- 8 CPU
- 16GB RAM
- 100GB di storage liberi
- 2 NIC
- Sistema operativo linux (consigliato Ubuntu)
- Collegamento ad internet richiesto
Conoscenza minima di:
- Ansible
- Python
- Docker
- Linux bash
- Networking L2
Cosa utilizzerò per questa guida?
Per questa guida utilizzerò una macchina virtuale con le seguenti caratteristiche:
1 macchina virtuale su VMware
- 16 CPU
- 24GB RAM
- 250GB di storage SSD
- 2 NIC
- Sistema operativo Ubuntu 22.04 LTS
- Nome macchina "overflowjournal-first-openstack"
In questo tutorial verra effettuato un deploy di un ambiente Openstack standalone, quindi senza una configurazione in alta affidabilità.
Questo è un ottimo modo per iniziare ad approcciarsi ad Openstack ed effettuare i primi esperimenti. Tuttavia è giusto sottilenare il fatto che questa configurazione non è adatta ad un sistema di produzione.
Negli articoli successivi vi mostrerò come effettuare delle installazioni più complesse.
Pronti ad iniziare?
Fase 1 - Installazione dei prerequisiti
Come prima cosa è buona norma assicurarsi che la propria macchina sia aggiornata.
Eseguire quindi i seguenti comandi:
sudo apt update
sudo apt dist-upgrade -y
sudo reboot
Il reboot è importante perché ci permette di riavviare la macchina e caricare il kernel più aggiornato.
Ansible Kolla effettua il deploy dei componenti necessari al corretto funzionamento di un cluster Openstack tramite container Docker.
Quindi, terminato l'aggiornamento della macchina, andiamo ad installare Docker.
Consiglio sempre di consultare la guida: https://docs.docker.com/engine/install/ubuntu/
Per praticità riporterò qua di seguito i comandi da eseguire
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Per verificare che docker sia stato installato con successo lanciare il seguente comando: sudo docker ps
Il risultato dovrebbe essere il seguente:
Fase 2 - Installazione di Kolla Ansible
Questo sarà il primo componente di Openstack che andremmo ad installare.
Kolla ansible è un progetto community basato su Ansible che ci permetterà di effettuare il deploy di Openstack in modo automatizzato.
Lascio qua di seguito il link della pagina ufficiale per chi desidera approfondire: https://docs.openstack.org/kolla-ansible/2024.1/index.html
In questa guida andrò ad installare la versione 2024.1 (Caracal) di Openstack.
Se volete installare un'altra versione non preoccupatevi, la metodologia di deploy è sempre la stessa, tuttavia prestare molta attenzione ai file di configurazione, cambiano da versione a versione e ci possono essere delle piccole differenze.
Come per Docker lascio qua di seguito la pagina di installazione ufficiale: https://docs.openstack.org/kolla-ansible/2024.1/user/quickstart.html
Iniziamo dunque ad installare i requisiti di Kolla Ansible e creare un virtual environment dove sarà installato il nostro pacchetto.
sudo apt install git python3-dev libffi-dev gcc libssl-dev
sudo apt install python3-venv
Creiamo il nostro virtual environment e lo attiviamo
sudo python3 -m venv /opt/kolla-ansible/
sudo chown -R $USER:$USER /opt/kolla-ansible/
source /opt/kolla-ansible/bin/activate
Come path personalmente ho scelto /opt/kolla-ansible
Voi potete scegliere il path che preferite in base ai vostri standard.
Ora assicuriamoci che all'interno del virtual environment sia installata l'ultima versione di pip ed installiamo la versione di Ansible compatibile con Openstack Kolla.
pip install -U pip
pip install 'ansible-core>=2.15,<2.16.99'
Sempre all'interno del virtual environment scarichiamo il sorgente di Kolla Ansible da Git e procediamo con il setup.
pip install git+https://opendev.org/openstack/kolla-ansible@stable/2024.1
sudo mkdir -p /etc/kolla
sudo chown $USER:$USER /etc/kolla
cp -r /opt/kolla-ansible/share/kolla-ansible/etc_examples/kolla/* /etc/kolla
cp /opt/kolla-ansible/share/kolla-ansible/ansible/inventory/all-in-one /etc/kolla
kolla-ansible install-deps
Questa serie di comandi oltre che ad installare il binario effettivo di Kolla Ansible, copia nella folder /etc/kolla
le configurazioni di default del nostro futuro Openstack.
Queste configurazioni dovranno essere modificate in base alle nostre esigenze.
Come anticipato, Openstack è composto da vari "moduli" ed ogni modulo ha la sua configurazione. Di conseguenza le combinazioni possono essere molteplici e bisogna prestare attenzione al tipo di configurazione che si vuole creare.
Fase 3 - Configurazione ambiente Openstack
Terminata l'installazione di Kolla Ansible dovremmo avere nella cartella /etc/kolla
3 file:
- all-in-one
- globals.yml
- passwords.yml
Il risultato atteso dovrebbe essere il seguente:
Prima di procedere è importante comprendere questi 3 file.
Di seguito gli analizzeremo singolarmente.
all-in-one
Questo file non è altro che un inventario Ansbile in formato .ini
.
Lascio qua di seguito il link di approfondimento riguardo agli inventari Ansible: https://docs.ansible.com/ansible/latest/inventory_guide/intro_inventory.html
All'interno di questo file dovranno essere registrate tutte le tipologie di macchine che comporranno il cluster OpenStack.
Nel caso del nostro tutorial stiamo eseguendo un installazione standalone (su una singola macchina), di conseguenza non è necessario modificare questo file.
Nelle installazioni più complesse o in alta affidabilità questo file deve essere riadattato in base alla vostra toplogy. Tratterò questo argomento in un post dedicato.
globals.yml
All'interno di questo file sono presenti diverse variabili che, in base ai loro valori, definiscono la configurazione finale dell'ambiente Openstack.
Sarebbe impossibile analizzarle tutte singolarmente, anche perché cambiano da versione a versione. Le più importanti sono le seguenti:
...
enable_openstack_core: yes
enable_mariadb: yes
enable_rabbitmq: yes
enable_nova: "{{ enable_openstack_core | bool }}"
enable_aodh: no
...
Queste sono solo alcune delle centinaia di variabili presenti nel file, queste in particolare definiscono quali "moduli" o componenti devono essere abilitati nella nostra installazione Openstack.
Successivamente, più a fondo nel file, ci sono le variabili specifiche per ogni modulo.
Prendiamo come esempio il modulo nova
...
########################
# Nova - Compute Options
########################
nova_backend_ceph: "no"
# Valid options are [ qemu, kvm, vmware ]
nova_compute_virt_type: "kvm"
# The number of fake driver per compute node
num_nova_fake_per_node: 5
# The flag "nova_safety_upgrade" need to be consider when
# "nova_enable_rolling_upgrade" is enabled. The "nova_safety_upgrade"
# controls whether the nova services are all stopped before rolling
# upgrade to the new version, for the safety and availability.
# If "nova_safety_upgrade" is "yes", that will stop all nova services (except
# nova-compute) for no failed API operations before upgrade to the
# new version. And opposite.
nova_safety_upgrade: "no"
# Valid options are [ none, novnc, spice ]
nova_console: "novnc"
...
Qua possiamo trovare diverse opzioni riguardo a Nova, come ad esempio la tipologia di console che le VM dovranno avere (nova_console) o il tipo di hypervisor con cui Nova dovrà interagire (nova_compute_virt_type).
In questo tutorial vi mostrerò una configurazione per l'installazione dei componenti base di Openstack.
passwords.yml
Anche questo file contiene delle variabili, in particolare contiene tutte le password che utilizzeranno i vari "moduli" di Openstack.
Prendiamo sempre l'esempio del modulo nova
:
...
nova_database_password:
nova_api_database_password:
nova_keystone_password:
...
In questo esempio possiamo notare che Nova ha bisogno di tre password, due utilizzate per l'autenticazione sul database ed una utilizzata per l'autenticazione con il modulo core Openstack (l'utente di servizio).
Ora che abbiamo capito la funzione di tutti e tre i file, siamo pronti per creare la nostra configurazione.
Per prima cosa iniziamo a generare tutte le password necessarie con il seguente comando (assicuriamoci sempre di essere all'interno del virtual environment)
cd /etc/kolla
kolla-genpwd
Terminata la creazione delle password possiamo editare il file /etc/kolla/globals.yml
Di seguito vi mostrerò le variabili che sono andato a modificare ed i relativi valori impostati.
Tutte le altre variabili sono state lasciate con il valore di default:
kolla_base_distro: "ubuntu"
kolla_internal_vip_address: "10.100.144.5"
kolla_external_vip_address: "10.100.144.6"
network_interface: "ens192"
neutron_external_interface: "ens224"
kolla_enable_tls_external: "yes"
enable_openstack_core: "yes"
enable_cinder_backup: "no"
nova_console: "spice"
Andiamo ad analizzare le modifiche effettuate:
kolla_base_distro
: Ansible Kolla effettua il deploy dei componenti di Openstack su container docker. Questa variabile indica su quale sistema operativo si appoggeranno le immagini dei container.
kolla_internal_vip_address
e kolla_external_vip_address
: Queste due variabili indicano su quali indirizzi IP verranno esposte le API e la dashboard di Openstack. Questi indirizzi sono importantissimi e sono l'unico punto di ingresso per interagire con i vari componenti del cluster. Openstack ha un indirizzo interno per la comunicazione tra i vari "moduli" e un indirizzo esterno che solitamente viene esposto al cliente o all'utilizzatore finale.
Nel mio caso, per semplicità, ho scelto un indirizzo sulla stessa subnet, in un ambiente di produzione è corretto esporre i due indirizzi su reti separate ed isolate.
network_interface
e neutron_external_interface
: Openstack ha bisogno di almeno due interfacce di rete, una per la management (dove l'utente può fare SSH, raggiungere e gestire tutti i componenti core del cluster) e una dedicata alla reti esterne o pubbliche delle macchine virtuali in esecuzione sul cluster.
La rete di management, indicata come network_interface
, nel mio caso è la rete principale della VM, mentre la rete dedicata alle macchine virtuali, indicata come neutron_external_interface
, deve essere un interfaccia in manual (nel mio caso è l'interfaccia ens224).
Su questa interfaccia successivamente posso essere trasportate tutte le VLAN esterne in trunk. Queste reti poi andranno configurate successivamente su Openstack, ma non sarà approfondito in questa guida.
Per comodità lascio qua le mie configurazioni di rete (netplan):
# This is the network config written by 'subiquity'
network:
ethernets:
ens192:
addresses:
- 10.100.144.4/24
nameservers:
addresses:
- 1.1.1.1
- 8.8.8.8
search: []
routes:
- to: default
via: 10.100.144.1
ens224:
dhcp4: no
dhcp6: no
version: 2

kolla_enable_tls_external
: È buona norma proteggere con dei certificati le API esposte esternamente al cliente finale. Kolla Ansible permette di generare automaticamente dei certificati, oppure di utilizzare let's encrypt per generare certificati validi. Si possono anche caricare dei propri certificati.
In questa guida utilizzerò dei certificati autogenerati.
enable_openstack_core
: Questa variabile abilità i moduli base di Openstack, il mimimo indispensabile per un corretto funzionamento del cluster. I moduli che vengono abilitati sono:
- Keystone (identity)
- Glance (image registry)
- Nova (compute)
- Neutron (network)
- Horizon (dashboard)
- Heat (orchestration)
- Placement (resource management)
enable_cinder_backup
: Stranamente questa variabile di default è impostata a true. Non avendo abilitato il modulo Cinder non è necessario abilitare i backup di questo modulo.
nova_console
: Ho modificato il tipo di console delle macchine virtuali esposte. Di default è novnc, consiglio di utilizzare spice essendo in html5
Come ultima cosa, prima di procedere con il deploy effettivo, bisogna generare i certificati per le API esterne. Questo può essere fatto tramite il seguente comando:
cd /etc/kolla
kolla-ansible certificates
Fase 4 - Openstack deploy
Siamo arrivati alla fase finale, abbiamo installato tutti i requisiti e preparato le configurazioni per il nostro personale Openstack, è arrivato il momento di effettuare il deploy.
Iniziamo a fare i bootstrap di tutti i server che compongono il cluster (Ansible in questa fase installerà dei moduli python che serviranno successivamente durante il deploy)
Assicuriamoci sempre di essere dentro al virtual environment:
kolla-ansible bootstrap-servers -i /etc/kolla/all-in-one
Il risultato atteso dovrebbe essere simile a questo:

Terminato il bootstrap, possiamo procedere con il download delle immagini Docker dal repository pubblico, ed effettuare dei prechecks. La fase di precheck è molto importante, in quanto verifica che ci sia tutto il necessario per effettuare il deploy. In caso di errore significa che qualche prerequisito non è stato rispettato:
kolla-ansible pull -i /etc/kolla/all-in-one
kolla-ansible prechecks -i /etc/kolla/all-in-one
Il risultato atteso dovrebbe essere simile a questo:

Se la fase di pull e prechecks si è conclusa senza errori si può procedere con il deploy vero e proprio
kolla-ansible deploy -i /etc/kolla/all-in-one
Il risultato atteso dovrebbe essere simile a questo:

Terminata la fase di deploy il vostro Openstack è pronto per essere utilizzato.
Per verificare che tutto funzioni correttamente potete lanciare il comando sudo docker ps
e controllare che i container Docker siano tutti operativi

Ora non ci resta che generare il file openrc utilizzato per autenticarsi via cli e installare il client openstack:
pip install python-openstackclient -c https://releases.openstack.org/constraints/upper/2024.1
kolla-ansible post-deploy
Questi comandi andranno a generare il seguente file /etc/kolla/admin-openrc.sh
Effettuiamo un source delle credenziali e verifichiamo che i "moduli" di Openstack siano correttamente operativi:
source /etc/kolla/admin-openrc.sh
openstack endpoint list
openstack compute service list
openstack network agent list
Il risultato dovrebbe essere simile a questo:

Se tutto risulta correttamente operativo siete pronti a configurare ed utilizzare il vostro Openstack.
Conclusioni
La guida che vi ho mostrato è solo una piccola parte del mondo Openstack e del mondo Kolla Ansible. Kolla è uno strumento estremamente versatile che permette di effettuare deploy di ambienti Openstack molto complessi e diversi tra loro.
Porterò sicuramente altre guide riguardo al mondo Openstack e vi mostrerò in futuro anche installazioni con Kolla Ansible più complesse.
Vi ringrazio per aver letto fino in fondo questa guida e spero vi sia servito come primo approccio al mondo Openstack.
Per qualunque domanda potete scrivermi a [email protected]